LispyScript-LispスタイルのJavaScript

*これは、DailyJSの記事の翻訳です

はじめに


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モノリシックヒントのおかげ

Source: https://habr.com/ru/post/J152119/


All Articles