Eine lisparische Sprache für PHP.
Dies ist ein Beispiel für ein Beispiel Hello World Code davon.
PHP -Code:
<?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 );Inhalt von Code.pisp:
( print " Hello World " " n " )Ergebnis:
Hello World
composer require xtlsoft/pispWir haben eine Fassade für Sie gebaut. Sie können es leicht verwenden.
<?php
$ pisp = new Pisp Pisp (); Richtig, die PispPisp -Klasse ist die Fassade.
Es erweitert die PispVMVM -Klasse und verfügt über eine execute , um Code direkt auszuführen.
Zum Beispiel:
<?php
$ code = ' (print ["Hello World"] ["n"]) ' ;
$ pisp -> execute ( $ code );Dies ist die Haupt -VM -Klasse.
Wir haben eine Definition und eine Löschmethode, mit der Funktionen definiert und gelöscht werden.
Ja! Variablen sind auch Funktionen in PIP, weil es rein funktionell ist.
<?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) " ); // 3Hast du es bemerkt? Beim Definieren einer Funktion muss ein gültiger Rückruf mit 2 Parametern. Der erste ist das Array der wirklichen Argumente, und die zweite ist die Instanz der pisp vm vm -Klasse.
Sie können Funktionen dynamisch hinzufügen.
Dies ist für das Parsencode.
<?php
$ parser = new Pisp Parser Parser ;
$ rslt = $ parser -> parse ( ' (print ["Hello Worldn"]) ' );
var_export ( $ rslt instanceof Pisp Parser AST Root); // true Dies ist zum Gehen des AST.
<?php
$ walker = new Pisp Parser ASTWalker ( $ rslt );
$ walker -> walk ( function ( Pisp Parser AST Node $ node ) {
echo $ node -> name , PHP_EOL ;
}); Ein Funktionsaufruf beginnt mit a ( und endet mit a ) . Funktionsname und Argumente werden durch leere Zeichen getrennt.
Argumente sind optional.
Zum Beispiel:
( + 1 2 )
( +
1
2
)
( + 1 2 )
(a_function_call_without_arguments) Die Literalen sind jetzt nicht von [ und ] umgeben.
Zum Beispiel:
( + 1 2 )
( print " a string " )
( + 1.2 1.4 )Darüber hinaus unterstützt PISP faule Anrufe.
Fügen Sie einfach eine @ vor dem Funktionsnamen hinzu und die Argumente werden ihre ASTs sein.
(@print (undefined_function)) Dadurch wird das Ergebnis der PispParserASTCallingNode -Klasse pisp parser ausgibt.
PISP enthält standardmäßig keine Funktionen. Wenn Sie die obigen Beispiele ausgeführt haben, erhalten Sie eine NoFunctionException . Sie müssen sie selbst definieren.
Es gibt jedoch nur eine nützliche StDlib, nur:
Pisp StdLib StandardLibrary:: register ( $ vm ); PISP unterstützt nur Block -Kommentare, beginnend mit #| und enden mit |# .
#| This is the function comment |#
(do_something (some_function) [ " literal " ]) #| ok too |#PIP unterstützt verschachtelte Kommentare.
Beispiel:
#| comment some code
(print "Hello World") #| This prints "Hello World" |#
|#Sie können auch einen kleinen Trick verwenden, um es zu unterstützen:
<?php
$ pisp = new Pisp Pisp ;
$ pisp -> define ( " rem " , function ( $ args , $ vm ) {
return ;
});Dann können Sie nur verwenden:
(@rem " This is a comment " )Und das wird nicht ausgeführt.
Pisp unterstützt jetzt viele Literale.
Literale sind jetzt nicht von [ und ] umgeben.
Derzeit gibt es drei Arten von Literalen: numerisch, Zeichenfolge und Liste.
Numerisch ist eine Ganzzahl oder Schwimmerin.
Beispiel:
( print 123 123.456 1e10 0x3f3f3f3f)Saiten sind von Zitaten umgeben. Unterstützt Muiltiple -Zitate.
n oder andere Dinge werden momentan nicht vollständig unterstützt.
Beispiel:
( print " Hello World " ' Another 'test' Hello World')Liste ist eine Sammlung von Werten.
Es ist von [ und ] umgeben, jeder Wert wird mit a getrennt ,
Beispiel:
( print [1, 2, [3, 4]] [ " Hello " , 234, " World " , ' you'])