ภาษาเหมือนเสียงกระเพื่อมสำหรับ 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 );นี่คือคลาส 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 ) ชื่อฟังก์ชั่นและอาร์กิวเมนต์จะถูกคั่นด้วยอักขระว่างเปล่า
อาร์กิวเมนต์เป็นทางเลือก
ตัวอย่างเช่น:
( + 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)) สิ่งนี้จะส่งออกผลลัพธ์ 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')รายการคือการรวบรวมค่า
มันล้อมรอบด้วย [ และ ] แต่ละค่าจะถูกคั่นด้วย a ,
ตัวอย่าง:
( print [1, 2, [3, 4]] [ " Hello " , 234, " World " , ' you'])