Uma linguagem do tipo Lisp para PHP.
Este é um exemplo de código mundial do Hello Hello.
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 );Conteúdo do code.pisp:
( print " Hello World " " n " )Resultado:
Hello World
composer require xtlsoft/pispNós construímos uma fachada para você. Você pode usá -lo facilmente.
<?php
$ pisp = new Pisp Pisp (); Certo, a classe PispPisp é a fachada.
Ele estende a classe PispVMVM e possui um método execute para executar o código diretamente.
Por exemplo:
<?php
$ code = ' (print ["Hello World"] ["n"]) ' ;
$ pisp -> execute ( $ code );Esta é a principal classe VM.
Temos um método de definição e exclusão usado para definir e excluir funções.
Sim! As variáveis também são funções no PISP porque são puramente funcionais.
<?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) " ); // 3Você já notou? Ao definir uma função, ele deve um retorno de chamada válido com 2 parâmetros. O primeiro é a matriz dos argumentos reais, e a segunda é a instância da classe pisp vm vm.
Você pode adicionar dinamicamente funções.
Isto é para análise de código.
<?php
$ parser = new Pisp Parser Parser ;
$ rslt = $ parser -> parse ( ' (print ["Hello Worldn"]) ' );
var_export ( $ rslt instanceof Pisp Parser AST Root); // true Isto é para caminhar pela AST.
<?php
$ walker = new Pisp Parser ASTWalker ( $ rslt );
$ walker -> walk ( function ( Pisp Parser AST Node $ node ) {
echo $ node -> name , PHP_EOL ;
}); Uma chamada de função começa com um ( e termina com a ) . O nome da função e os argumentos são separados por qualquer caractere em branco.
Os argumentos são opcionais.
Por exemplo:
( + 1 2 )
( +
1
2
)
( + 1 2 )
(a_function_call_without_arguments) Os literais não estão cercados por [ e ] agora.
Por exemplo:
( + 1 2 )
( print " a string " )
( + 1.2 1.4 )Além disso, o PISP suporta chamadas preguiçosas.
Basta adicionar um @ antes do nome da função e os argumentos serão seus ASTs.
(@print (undefined_function)) Isso produzirá o resultado do var_dump da classe PispParserASTCallingNode .
O PISP não inclui nenhuma função por padrão. Isso significa que, se você executar os exemplos acima, receberá uma NoFunctionException . Você deve defini -los sozinho.
No entanto, há um stdlib útil, apenas:
Pisp StdLib StandardLibrary:: register ( $ vm ); O PISP suporta apenas comentários do bloco começando com #| e terminando com |# .
#| This is the function comment |#
(do_something (some_function) [ " literal " ]) #| ok too |#O PISP suporta comentários aninhados.
Exemplo:
#| comment some code
(print "Hello World") #| This prints "Hello World" |#
|#Você também pode usar um pequeno truque para deixá -lo apoiá -lo:
<?php
$ pisp = new Pisp Pisp ;
$ pisp -> define ( " rem " , function ( $ args , $ vm ) {
return ;
});Então, você pode apenas usar:
(@rem " This is a comment " )E isso não será executado.
Pisp agora suporta muitos literais.
Os literais não estão cercados por [ e ] agora.
Atualmente, existem três tipos de literais: Numérico, String and List.
Numérico é um número inteiro ou flutuante.
Exemplo:
( print 123 123.456 1e10 0x3f3f3f3f)As cordas são cercadas por citações. Suporta cotações Muiltiple.
n ou outras coisas não são totalmente suportadas no momento.
Exemplo:
( print " Hello World " ' Another 'test' Hello World')Lista é uma coleção de valores.
É cercado por [ e ] , cada valor é separado com A , .
Exemplo:
( print [1, 2, [3, 4]] [ " Hello " , 234, " World " , ' you'])