Bahasa seperti LISP untuk PHP.
Ini adalah sampel Hello World Code tentang itu.
Kode 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 );Konten kode.pisp:
( print " Hello World " " n " )Hasil:
Hello World
composer require xtlsoft/pispKami telah membangun fasad untuk Anda. Anda dapat menggunakannya dengan mudah.
<?php
$ pisp = new Pisp Pisp (); Benar, kelas PispPisp adalah fasadnya.
Ini memperluas kelas PispVMVM dan memiliki metode execute untuk menjalankan kode secara langsung.
Misalnya:
<?php
$ code = ' (print ["Hello World"] ["n"]) ' ;
$ pisp -> execute ( $ code );Ini adalah kelas VM utama.
Kami memiliki metode define dan delete yang digunakan untuk mendefinisikan dan menghapus fungsi.
Ya! Variabel juga merupakan fungsi di PISP karena murni fungsional.
<?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) " ); // 3Pernahkah Anda memperhatikan? Saat mendefinisikan suatu fungsi, itu harus panggilan balik yang valid dengan 2 parameter. Yang pertama adalah array dari argumen nyata, dan yang kedua adalah contoh dari kelas pisp vm vm.
Anda dapat secara dinamis menambahkan fungsi.
Ini untuk kode penguraian.
<?php
$ parser = new Pisp Parser Parser ;
$ rslt = $ parser -> parse ( ' (print ["Hello Worldn"]) ' );
var_export ( $ rslt instanceof Pisp Parser AST Root); // true Ini untuk berjalan di AST.
<?php
$ walker = new Pisp Parser ASTWalker ( $ rslt );
$ walker -> walk ( function ( Pisp Parser AST Node $ node ) {
echo $ node -> name , PHP_EOL ;
}); Panggilan fungsi dimulai dengan A ( dan diakhiri dengan A ) . Nama fungsi dan argumen dipisahkan oleh karakter kosong apa pun.
Argumen adalah opsional.
Misalnya:
( + 1 2 )
( +
1
2
)
( + 1 2 )
(a_function_call_without_arguments) Literal tidak dikelilingi oleh [ dan ] sekarang.
Misalnya:
( + 1 2 )
( print " a string " )
( + 1.2 1.4 )Selain itu, PISP mendukung panggilan malas.
Cukup tambahkan @ sebelum nama fungsi dan argumen akan menjadi ASTS mereka.
(@print (undefined_function)) Ini akan menghasilkan hasil var_dump dari kelas PispParserASTCallingNode .
PISP tidak termasuk fungsi apa pun secara default. Ini berarti, jika Anda menjalankan contoh di atas, Anda akan mendapatkan NoFunctionException . Anda harus mendefinisikannya sendiri.
Namun, ada stdlib yang berguna, hanya:
Pisp StdLib StandardLibrary:: register ( $ vm ); Pisp hanya mendukung komentar blok yang dimulai dengan #| dan berakhir dengan |# .
#| This is the function comment |#
(do_something (some_function) [ " literal " ]) #| ok too |#Pisp mendukung komentar bersarang.
Contoh:
#| comment some code
(print "Hello World") #| This prints "Hello World" |#
|#Anda juga dapat menggunakan sedikit trik untuk membiarkannya mendukungnya:
<?php
$ pisp = new Pisp Pisp ;
$ pisp -> define ( " rem " , function ( $ args , $ vm ) {
return ;
});Lalu, Anda bisa menggunakan:
(@rem " This is a comment " )Dan ini tidak akan dieksekusi.
Pisp sekarang mendukung banyak literal.
Literal tidak dikelilingi oleh [ dan ] sekarang.
Saat ini ada tiga jenis literal: numerik, string dan daftar.
Numeric adalah bilangan bulat atau float.
Contoh:
( print 123 123.456 1e10 0x3f3f3f3f)String dikelilingi oleh kutipan. Mendukung kutipan muiltiple.
n atau hal -hal lain tidak sepenuhnya didukung saat ini.
Contoh:
( print " Hello World " ' Another 'test' Hello World')Daftar adalah kumpulan nilai.
Dikelilingi dengan [ dan ] , setiap nilai dipisahkan dengan a , .
Contoh:
( print [1, 2, [3, 4]] [ " Hello " , 234, " World " , ' you'])