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つのパラメーターを使用した有効なコールバックが必要です。 1つ目は実際の引数の配列で、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 これはASTを歩くためです。
<?php
$ walker = new Pisp Parser ASTWalker ( $ rslt );
$ walker -> walk ( function ( Pisp Parser AST Node $ node ) {
echo $ node -> name , PHP_EOL ;
});関数呼び出しは、 (およびaで終了)で始まります。関数名と引数は、空白の文字によって区切られます。
引数はオプションです。
例えば:
( + 1 2 )
( +
1
2
)
( + 1 2 )
(a_function_call_without_arguments)リテラルは[そして今]に囲まれていません。
例えば:
( + 1 2 )
( print " a string " )
( + 1.2 1.4 )さらに、PISPは怠zyな呼び出しをサポートしています。
関数名の前に@を追加するだけで、引数はASTになります。
(@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は現在、多くのリテラルをサポートしています。
リテラルは現在[そして]に囲まれていません。
現在、数値、文字列、リストの3種類のリテラルがあります。
数値は整数またはフロートです。
例:
( print 123 123.456 1e10 0x3f3f3f3f)文字列は引用符に囲まれています。 Muiltipleの引用をサポートします。
nまたは他のものは現時点では完全にはサポートされていません。
例:
( print " Hello World " ' Another 'test' Hello World')リストは価値のコレクションです。
それは[そして]に囲まれており、各値は,で分離されます。
例:
( print [1, 2, [3, 4]] [ " Hello " , 234, " World " , ' you'])