はじめに
LispyScriptは、JavaScriptにコンパイルされるツリーのようなプログラミング言語です。 厳密に言えば、これはJavaScriptとLispの間の何かです。
Lispyスクリプトは、同様の式で構成されています。
(<function> arg1 arg2 arg3 ...)
この式は関数を呼び出します(一般的に、これは完全に真実ではありませんが、それについては後で詳しく説明します)。
最初の要素は関数を示します。 残りは引数用です。
(console.log "abc")
はい、ほとんど忘れていました 。 ここでプレイできます 。
たとえば、関数は次のように呼び出すことができます。
(console.log "2 + 2 = %d" (+ 2 2))
さて、JSでは次のようになります。
console.log("2 + 2 = %d", (2 + 2));
おなじみのHTML構造を知っています。
<html lang="en"> <head> <title>My Home Page</title> </head> <body> <h1>Welcome to LispyScript</h1> </body> </html>
Lispyテンプレートでは、これは少し異なります。
(html {lang: "en"} (head (title "My Home Page")) (body (h1 "Welcome to LispyScript")))
ただし、後でテンプレートについては、ツリー構造を確認することが重要です。
マクロ
Lispyの最も重要な部分の1つ。 マクロはJSでコンパイルしませんが、コンパイラを拡張できます。 たとえば、印刷マクロを作成しましょう。
(macro print (str rest...) (console.log ~str ~rest...)) (print "Hello print macro!") (print "2 + 2 = %d" (+ 2 2))
console.log("Hello print macro!") console.log("2 + 2 = %d", (2 + 2));
上記のマクロはLispyを拡張します。 マクロ式は、最初のパラメーターとしてマクロ名を取り、その後に括弧内のパラメーターが続き、次にマクロ呼び出しがコンパイルされるコードが続きます。
〜演算子はパラメーターを逆参照します。 変数rest ...には、strの後に渡されるすべてのパラメーターが含まれます。
コンパイラは2段階で動作します。最初に、マクロがコードに変換されます。 つまり から
(print "Hello print macro!")
彼は作成します:
(console.log "Hello print macro!")
それでは、JSでコンパイルします。 同様に:
(print "2 + 2 = %d" (+ 2 2)) ; lispy
(console.log "2 + 2 = %d" (+ 2 2)) ; lispy
console.log("2 + 2 = %d", (2 + 2)); // js
マクロの代わりに関数を使用してみませんか? 試してみましょう:
(var print (function (data value) (console.log data value)))
次に、結果のコードを比較します。
// console.log("2 + 2 = %d", (2 + 2)); // var print = function(data,value) { return console.log(data,value); }; print("2 + 2 = %d",(2 + 2));
マクロは関数ではありません!
マクロが関数として動作することを期待しないでください。 多くの場合、マクロではなく関数を使用する方が適切です。
例:数値の2乗を計算するマクロを作成します。
(macro square (x) (* ~x ~x)) (console.log (square 2))
そして、このコードは正常に動作します。出力4。JSでは、次のようになります。
console.log((2 * 2));
今すぐ試してください:
(var i 2) (console.log (square i++))
そして、9の代わりに6を返します。そのため、コンパイルされたコードを見ると明らかになります。
var i = 2; console.log((i++ * i++));
関数の場合、値は事前に計算されますが、マクロの場合、いいえ。 これを理解し、覚えておく必要があります。
おわりに
一般的に、Lispyはスクリプトを記述するための代替方法を提供します。 マクロは非常に強力なツールですが、慎重に使用する必要があります。
PS
Javathcriptもあります。 確かに、マクロはありません。
UPD。 より多くのClojureScript 、 モノリシックヒントのおかげ