PHP의 LISP와 같은 언어.
이것은 샘플 Hello World 코드입니다.
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 );이것은 주요 VM 클래스입니다.
기능을 정의하고 삭제하는 데 사용되는 정의 및 삭제 방법이 있습니다.
예! 변수는 또한 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 이것은 AST를 걷기위한 것입니다.
<?php
$ walker = new Pisp Parser ASTWalker ( $ rslt );
$ walker -> walk ( function ( Pisp Parser AST Node $ node ) {
echo $ node -> name , PHP_EOL ;
}); 함수 호출은 a ( a ) 로 시작합니다. 함수 이름과 인수는 빈 문자로 분리됩니다.
인수는 선택 사항입니다.
예를 들어:
( + 1 2 )
( +
1
2
)
( + 1 2 )
(a_function_call_without_arguments) [ 은 지금 ] 둘러싸여 있지 않습니다.
예를 들어:
( + 1 2 )
( print " a string " )
( + 1.2 1.4 )또한 PISP는 게으른 전화를 지원합니다.
함수 이름 전에 @ 추가하면 인수가 그들의 asts가 될 것입니다.
(@print (undefined_function)) 이것은 PispParserASTCallingNode 클래스의 var_dump 결과를 출력합니다.
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 quotes를 지원합니다.
n 또는 다른 것들은 현재 완전히 지원되지 않습니다.
예:
( print " Hello World " ' Another 'test' Hello World')목록은 값 모음입니다.
그것은 [ 및 ] 로 둘러싸여 있으며, 각 값은 a , 로 분리됩니다.
예:
( print [1, 2, [3, 4]] [ " Hello " , 234, " World " , ' you'])