Pisp
1.0.0
PHP类似LISP的语言。
这是一个示例Hello World代码。
PHP代码:
<?php
require_once " vendor/autoload.php " ;
$ pisp = new Pisp Pisp ;
$ code = file_get_contents ( " code.pisp " );
$ pisp -> define ( " print " , function ( $ args , $ vm ) {
foreach ( $ args as $ v ) {
if ( is_string ( $ v ) || method_exists ( $ v , " __toString " )) {
echo $ v ;
} else {
var_dump ( $ v );
}
}
});
$ pisp -> execute ( $ code );code.pisp的内容:
( print " Hello World " " n " )结果:
Hello World
composer require xtlsoft/pisp我们为您建造了一个立面。您可以轻松使用它。
<?php
$ pisp = new Pisp Pisp ();是的, PispPisp类是立面。
它扩展了PispVMVM类,并具有直接执行代码的execute方法。
例如:
<?php
$ code = ' (print ["Hello World"] ["n"]) ' ;
$ pisp -> execute ( $ code );这是主要的VM类。
我们有一种定义和删除方法,用于定义和删除函数。
是的!变量在PISP中也是函数,因为它纯粹是功能性的。
<?php
$ vm = new Pisp Pisp ; // Also can be $vm = new PispVMVM;
$ vm -> define ( " abc " , 123 );
$ vm -> define ( " + " , function ( $ args , $ vm ) {
return $ args [ 0 ] + $ args [ 1 ];
});
$ vm -> delete ( " abc " );
echo $ vm -> execute ( " (+ 1 2) " ); // 3你注意到了吗?定义函数时,它必须具有2个参数的有效回调。第一个是真实参数的数组,第二个是 pisp vm vm类的实例。
您可以动态添加功能。
这是用于解析代码。
<?php
$ parser = new Pisp Parser Parser ;
$ rslt = $ parser -> parse ( ' (print ["Hello Worldn"]) ' );
var_export ( $ rslt instanceof Pisp Parser AST Root); // true 这是为了漫步。
<?php
$ walker = new Pisp Parser ASTWalker ( $ rslt );
$ walker -> walk ( function ( Pisp Parser AST Node $ node ) {
echo $ node -> name , PHP_EOL ;
});函数调用以A (并以A结束)开头。函数名称和参数被任何空白字符隔开。
论点是可选的。
例如:
( + 1 2 )
( +
1
2
)
( + 1 2 )
(a_function_call_without_arguments)文字不被[现在]包围。
例如:
( + 1 2 )
( print " a string " )
( + 1.2 1.4 )此外,PISP支持懒惰的电话。
只需在函数名称之前添加@ ,而参数将是他们的asts。
(@print (undefined_function))这将输出PispParserASTCallingNode类的var_dump结果。
默认情况下,PISP不包含任何功能。这意味着,如果您运行上面的示例,您将获得NoFunctionException 。您必须自己定义它们。
但是,有一个有用的stdlib,只是:
Pisp StdLib StandardLibrary:: register ( $ vm );PISP仅支持从#|开始的块注释。并以|#结尾。
#| This is the function comment |#
(do_something (some_function) [ " literal " ]) #| ok too |#PISP支持嵌套评论。
例子:
#| comment some code
(print "Hello World") #| This prints "Hello World" |#
|#您也可以使用一个小技巧来支持它:
<?php
$ pisp = new Pisp Pisp ;
$ pisp -> define ( " rem " , function ( $ args , $ vm ) {
return ;
});然后,您可以使用:
(@rem " This is a comment " )而且这将不会执行。
PISP现在支持许多文字。
文字现在不被[现在]包围。
当前有三种类型的文字:数字,字符串和列表。
数字是整数或浮点。
例子:
( print 123 123.456 1e10 0x3f3f3f3f)字符串被引号包围。支持muiltiple引号。
目前尚未完全支持n或其他事情。
例子:
( print " Hello World " ' Another 'test' Hello World')列表是值的集合。
它被[和]包围,每个值都用a ,
例子:
( print [1, 2, [3, 4]] [ " Hello " , 234, " World " , ' you'])