Exemplo n.º 1
0
 public static function special()
 {
     return array('do' => function () {
         $exprs = func_get_args();
         return array_reduce($exprs, function ($_, $expr) {
             return phlp($expr);
         }, null);
     }, 'if' => function ($condition, $success, $failure) {
         $passed = phlp($condition);
         return phlp($passed ? $success : $failure);
     }, 'def' => function ($name, $value) {
         $value = !is_object($value) && $value[0] === 'fn' ? phlp($value) : $value;
         self::def($name, $value);
     }, 'fn' => function () {
         $args = func_get_args();
         $signature = $args[0];
         $body = array_slice($args, 1);
         return function () use($signature, $body) {
             $passed = func_get_args();
             $named = array_combine($signature, $passed);
             array_walk_recursive($body, function (&$val, $key) use($named) {
                 $val = !empty($named[$val]) ? $named[$val] : $val;
             });
             return call_user_func('phlp', $body);
         };
     }, 'defn' => function () {
         $special = self::special();
         $args = func_get_args();
         $name = $args[0];
         $value = call_user_func_array($special['fn'], array_slice($args, 1));
         return call_user_func_array($special['def'], array($name, $value));
     });
 }
Exemplo n.º 2
0
<?php

include './index.php';
phlp(['do', ['puts', "\nReducible concatenation"], ['var_dump', "['.', 'foo', 'bar', 'baz'] === 'foobarbaz'", ['=', 'foobarbaz', ['.', 'foo', 'bar', 'baz']]], ['puts', "\nArray Merge with nested functions"], ['var_dump', "['array_merge',[['+',9,10],2],[4,5,6]] === [19,2,4,5,6]", ['=', [19, 2, 4, 5, 6], ['array_merge', [['+', 9, 10], 2], [4, 5, 6]]]], ['puts', "\nArray Merge with nested functions II"], ['var_dump', ['array_merge', [2], ['array_merge', [3], [4], [5]]]], ['puts', "\nDefining variables"], ['var_dump', ['def', 'b', 5], "['def', 'b', 5]", "['+', 1, 'b'] === 6", ['=', 6, ['+', 1, 'b']]], ['puts', "\nBasic Maths"], ['var_dump', ['def', 'a', 4], ['=', ['/', 16, 'a'], 4], ['=', ['*', 2, 'a'], 8], ['=', ['-', 2, 'a'], -2], ['=', ['%', 17, 'a'], 1]], ['puts', "\nControl Flow"], ['var_dump', ['=', 'nope', ['if', ['=', 4, 3], ['current', ['yep']], ['current', ['nope']]]]], ['puts', "\nDefine a function"], ['defn', 'yell', ['greeting', 'planet'], ['.', ['implode', ', ', ['strtoupper', 'greeting', 'planet']], '!!!']], ['var_dump', ['=', 'HELLO, WORLD!!!', ['current', ['yell', 'hello', 'world']]]]]);