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'])