Un lenguaje similar a Lisp para PHP.
Esta es una muestra de Hello World Code Of It.
Código 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 );Contenido de Code.pisp:
( print " Hello World " " n " )Resultado:
Hello World
composer require xtlsoft/pispHemos construido una fachada para ti. Puedes usarlo fácilmente.
<?php
$ pisp = new Pisp Pisp (); Correcto, la clase PispPisp es la fachada.
Extiende la clase PispVMVM y tiene un método execute para ejecutar el código directamente.
Por ejemplo:
<?php
$ code = ' (print ["Hello World"] ["n"]) ' ;
$ pisp -> execute ( $ code );Esta es la clase principal de VM.
Tenemos un método Define y Eliminar que se utilizan para definir y eliminar funciones.
¡Sí! Las variables también son funciones en PISP porque es puramente funcional.
<?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¿Has notado? Al definir una función, debe una devolución de llamada válida con 2 parámetros. El primero es la matriz de los argumentos reales, y el segundo es la instancia de la clase PISP VM VM.
Puede agregar dinámicamente funciones.
Esto es para el código de análisis.
<?php
$ parser = new Pisp Parser Parser ;
$ rslt = $ parser -> parse ( ' (print ["Hello Worldn"]) ' );
var_export ( $ rslt instanceof Pisp Parser AST Root); // true Esto es para caminar por el AST.
<?php
$ walker = new Pisp Parser ASTWalker ( $ rslt );
$ walker -> walk ( function ( Pisp Parser AST Node $ node ) {
echo $ node -> name , PHP_EOL ;
}); Una llamada de función comienza con A ( y termina con A ) . El nombre y los argumentos de la función están separados por cualquier caracteres en blanco.
Los argumentos son opcionales.
Por ejemplo:
( + 1 2 )
( +
1
2
)
( + 1 2 )
(a_function_call_without_arguments) Los literales no están rodeados de [ y ] ahora.
Por ejemplo:
( + 1 2 )
( print " a string " )
( + 1.2 1.4 )Además, PISP admite llamadas perezosas.
Simplemente agregue un @ antes del nombre de la función y los argumentos serán sus AST.
(@print (undefined_function)) Esto emitirá el resultado var_dump de la clase PispParserASTCallingNode .
PISP no incluye ninguna función por defecto. Esto significa que, si ejecuta los ejemplos anteriores, obtendrá una NoFunctionException . Debes definirlos por ti mismo.
Sin embargo, hay un stdlib útil, solo:
Pisp StdLib StandardLibrary:: register ( $ vm ); PISP solo admite comentarios de bloque que comienzan con #| y terminando con |# .
#| This is the function comment |#
(do_something (some_function) [ " literal " ]) #| ok too |#PISP apoya los comentarios anidados.
Ejemplo:
#| comment some code
(print "Hello World") #| This prints "Hello World" |#
|#También puede usar un pequeño truco para dejarlo admitir:
<?php
$ pisp = new Pisp Pisp ;
$ pisp -> define ( " rem " , function ( $ args , $ vm ) {
return ;
});Entonces, puedes usar:
(@rem " This is a comment " )Y esto no se ejecutará.
PISP ahora apoya muchos literales.
Los literales no están rodeados de [ y ] ahora.
Actualmente hay tres tipos de literales: numérico, cadena y lista.
Numérico es un entero o flotante.
Ejemplo:
( print 123 123.456 1e10 0x3f3f3f3f)Las cuerdas están rodeadas de citas. Admite citas de Muiltiple.
n u otras cosas no son totalmente compatibles en este momento.
Ejemplo:
( print " Hello World " ' Another 'test' Hello World')La lista es una colección de valores.
Está rodeado con [ y ] , cada valor está separado con A , .
Ejemplo:
( print [1, 2, [3, 4]] [ " Hello " , 234, " World " , ' you'])