Lisp-подобный язык для PHP.
Это пример Hello World 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 );Содержание 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 );Это основной класс виртуальной машины.
У нас есть определение и метод удаления, которые используются для определения и удаления функций.
Да! Переменные также являются функциями в 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 параметрами. Первый - это массив реальных аргументов, а второй - это экземпляр класса pisp vm vm.
Вы можете динамически добавлять функции.
Это для кода анализа.
<?php
$ parser = new Pisp Parser Parser ;
$ rslt = $ parser -> parse ( ' (print ["Hello Worldn"]) ' );
var_export ( $ rslt instanceof Pisp Parser AST Root); // true Это для ходьбы по аст.
<?php
$ walker = new Pisp Parser ASTWalker ( $ rslt );
$ walker -> walk ( function ( Pisp Parser AST Node $ node ) {
echo $ node -> name , PHP_EOL ;
}); Функциональный вызов начинается с ( и заканчивается а ) . Имя функции и аргументы разделены любыми пустыми символами.
Аргументы необязательны.
Например:
( + 1 2 )
( +
1
2
)
( + 1 2 )
(a_function_call_without_arguments) Литералы не окружены [ и ] сейчас.
Например:
( + 1 2 )
( print " a string " )
( + 1.2 1.4 )Более того, PISP поддерживает ленивые звонки.
Просто добавьте @ перед именем функции, и аргументы будут их AST.
(@print (undefined_function)) Это выведет результат var_dump класса PispParserASTCallingNode .
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 теперь поддерживает многие литералы.
Литералы не окружают [ и ] сейчас.
В настоящее время существует три типа литералов: числовые, строки и список.
Числовое целое число или плавание.
Пример:
( print 123 123.456 1e10 0x3f3f3f3f)Строки окружены цитатами. Поддерживает цитаты Muiltiple.
n или другие вещи не полностью поддерживаются в данный момент.
Пример:
( print " Hello World " ' Another 'test' Hello World')Список - это коллекция значений.
Он окружен [ и ] , каждое значение разделено с , .
Пример:
( print [1, 2, [3, 4]] [ " Hello " , 234, " World " , ' you'])