/** * @return Lisphp_Scope */ public static function sandbox() { $scope = new Lisphp_Scope(); $scope['nil'] = null; $scope['true'] = $scope['#t'] = $scope['else'] = true; $scope['false'] = $scope['#f'] = false; $scope['eval'] = new Lisphp_Runtime_Eval(); $scope['quote'] = new Lisphp_Runtime_Quote(); $scope['symbol'] = new Lisphp_Runtime_PHPFunction(array('Lisphp_Symbol', 'get')); $scope['define'] = new Lisphp_Runtime_Define(); $scope['setf!'] = new Lisphp_Runtime_Setf(); $scope['let'] = new Lisphp_Runtime_Let(); $scope['macro'] = new Lisphp_Runtime_Macro(); $scope['lambda'] = new Lisphp_Runtime_Lambda(); $scope['apply'] = new Lisphp_Runtime_Apply(); $scope['do'] = new Lisphp_Runtime_Do(); $scope['dict'] = new Lisphp_Runtime_Dict(); $scope['array'] = new Lisphp_Runtime_Array(); $scope['list'] = new Lisphp_Runtime_List(); $scope['car'] = new Lisphp_Runtime_List_Car(); $scope['cdr'] = new Lisphp_Runtime_List_Cdr(); $scope['at'] = new Lisphp_Runtime_List_At(); $scope['set-at!'] = new Lisphp_Runtime_List_SetAt(); $scope['unset-at!'] = new Lisphp_Runtime_List_UnsetAt(); $scope['exists-at?'] = new Lisphp_Runtime_List_ExistsAt(); $scope['count'] = new Lisphp_Runtime_List_Count(); $scope['map'] = new Lisphp_Runtime_List_Map(); $scope['filter'] = new Lisphp_Runtime_List_Filter(); $scope['fold'] = new Lisphp_Runtime_List_Fold(); $scope['cond'] = new Lisphp_Runtime_List_Cond(); $scope['=='] = $scope['eq'] = $scope['eq?'] = new Lisphp_Runtime_Predicate_Eq(); $scope['='] = $scope['equal'] = $scope['equal?'] = new Lisphp_Runtime_Predicate_Equal(); $scope['!=='] = $scope['/=='] = $scope['not-eq'] = $scope['not-eq?'] = new Lisphp_Runtime_Predicate_NotEq(); $scope['!='] = $scope['/='] = $scope['not-equal'] = $scope['not-equal?'] = new Lisphp_Runtime_Predicate_NotEqual(); $scope['<'] = new Lisphp_Runtime_Predicate_LessThan(); $scope['>'] = new Lisphp_Runtime_Predicate_GreaterThan(); $scope['<='] = new Lisphp_Runtime_Predicate_LessEqual(); $scope['>='] = new Lisphp_Runtime_Predicate_GreaterEqual(); foreach (Lisphp_Runtime_Predicate_Type::getFunctions() as $n => $f) { $scope[$n] = $f; } $scope['isa?'] = $scope['is-a?'] = new Lisphp_Runtime_Predicate_IsA(); $scope['+'] = new Lisphp_Runtime_Arithmetic_Addition(); $scope['-'] = new Lisphp_Runtime_Arithmetic_Subtraction(); $scope['*'] = new Lisphp_Runtime_Arithmetic_Multiplication(); $scope['/'] = new Lisphp_Runtime_Arithmetic_Division(); $scope['%'] = $scope['mod'] = new Lisphp_Runtime_Arithmetic_Modulus(); $scope['string'] = new Lisphp_Runtime_PHPFunction('strval'); $scope['.'] = $scope['concat'] = new Lisphp_Runtime_String_Concat(); $scope['string-join'] = new Lisphp_Runtime_String_StringJoin(); $scope['substring'] = new Lisphp_Runtime_PHPFunction('substr'); $scope['string-upcase'] = new Lisphp_Runtime_PHPFunction('strtoupper'); $scope['string-downcase'] = new Lisphp_Runtime_PHPFunction('strtolower'); $scope['not'] = new Lisphp_Runtime_Logical_Not(); $scope['and'] = new Lisphp_Runtime_Logical_And(); $scope['or'] = new Lisphp_Runtime_Logical_Or(); $scope['if'] = new Lisphp_Runtime_Logical_If(); $scope['->'] = new Lisphp_Runtime_Object_GetAttribute(); return $scope; }
public function testTypePredicate() { $int = new Lisphp_Runtime_Predicate_Type('int'); $this->assertEquals('int', $int->type); $this->assertFunction(true, $int, 123); $this->assertFunction(false, $int, 3.14); $this->assertFunction(false, $int, 'abc'); $string = new Lisphp_Runtime_Predicate_Type('string'); $this->assertEquals('string', $string->type); $this->assertFunction(true, $string, 'hello'); $this->assertFunction(false, $string, 123); $env = Lisphp_Runtime_Predicate_Type::getFunctions(); foreach (Lisphp_Runtime_Predicate_Type::$types as $type) { $this->assertType('Lisphp_Runtime_Predicate_Type', $env["{$type}?"]); $this->assertEquals($type, $env["{$type}?"]->type); } $this->assertFunction(true, $env['nil?'], null); $this->assertFunction(false, $env['nil?'], 123); }