Un langage de type Lisp pour PHP.
Ceci est un exemple de code mondial Hello.
Code 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 );Contenu de Code.pisp:
( print " Hello World " " n " )Résultat:
Hello World
composer require xtlsoft/pispNous avons construit une façade pour vous. Vous pouvez l'utiliser facilement.
<?php
$ pisp = new Pisp Pisp (); À droite, la classe PispPisp est la façade.
Il étend la classe PispVMVM et a une méthode execute pour exécuter directement le code.
Par exemple:
<?php
$ code = ' (print ["Hello World"] ["n"]) ' ;
$ pisp -> execute ( $ code );Ceci est la classe VM principale.
Nous avons une méthode définie et de suppression qui sont utilisées pour définir et supprimer les fonctions.
Oui! Les variables sont également des fonctions dans PISP car elle est purement fonctionnelle.
<?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) " ); // 3Avez-vous remarqué? Lors de la définition d'une fonction, il doit un rappel valide avec 2 paramètres. Le premier est le tableau des vrais arguments, et le second est l'instance de la classe PISP VM VM.
Vous pouvez ajouter dynamiquement des fonctions.
Ceci est pour l'analyse du code.
<?php
$ parser = new Pisp Parser Parser ;
$ rslt = $ parser -> parse ( ' (print ["Hello Worldn"]) ' );
var_export ( $ rslt instanceof Pisp Parser AST Root); // true C'est pour marcher sur l'AST.
<?php
$ walker = new Pisp Parser ASTWalker ( $ rslt );
$ walker -> walk ( function ( Pisp Parser AST Node $ node ) {
echo $ node -> name , PHP_EOL ;
}); Un appel de fonction commence par A ( et se termine par a ) . Le nom de la fonction et les arguments sont séparés par des caractères vides.
Les arguments sont facultatifs.
Par exemple:
( + 1 2 )
( +
1
2
)
( + 1 2 )
(a_function_call_without_arguments) Les littéraux ne sont pas entourés de [ et ] maintenant.
Par exemple:
( + 1 2 )
( print " a string " )
( + 1.2 1.4 )De plus, PISP prend en charge les appels paresseux.
Ajoutez simplement un @ avant le nom de la fonction et les arguments seront leurs AST.
(@print (undefined_function)) Cela sortira le résultat var_dump de la classe PispParserASTCallingNode .
PISP n'inclut aucune fonction par défaut. Cela signifie que si vous exécutez les exemples ci-dessus, vous obtiendrez une NoFunctionException . Vous devez les définir par vous-même.
Cependant, il y a un stdlib utile, juste:
Pisp StdLib StandardLibrary:: register ( $ vm ); PISP prend uniquement en charge les commentaires de blocs en commençant par #| et se terminant par |# .
#| This is the function comment |#
(do_something (some_function) [ " literal " ]) #| ok too |#PISP prend en charge les commentaires imbriqués.
Exemple:
#| comment some code
(print "Hello World") #| This prints "Hello World" |#
|#Vous pouvez également utiliser une petite astuce pour le laisser le supporter:
<?php
$ pisp = new Pisp Pisp ;
$ pisp -> define ( " rem " , function ( $ args , $ vm ) {
return ;
});Ensuite, vous pouvez simplement utiliser:
(@rem " This is a comment " )Et cela ne sera pas exécuté.
Pisp soutient désormais de nombreux littéraux.
Les littéraux ne sont pas entourés de [ et ] maintenant.
Il existe actuellement trois types de littéraux: numérique, chaîne et liste.
Numric est un entier ou un flotteur.
Exemple:
( print 123 123.456 1e10 0x3f3f3f3f)Les cordes sont entourées de citations. Prend en charge les citations de Muiltiple.
n ou d'autres choses ne sont pas pleinement prises en charge pour le moment.
Exemple:
( print " Hello World " ' Another 'test' Hello World')La liste est une collection de valeurs.
Il est entouré de [ et ] , chaque valeur est séparée avec A , .
Exemple:
( print [1, 2, [3, 4]] [ " Hello " , 234, " World " , ' you'])