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



All Articles