2017-12-02 14 views
0

Clojureベクトルマクロ形式を書くには#[...]#[(inc %1) %2](fn [a b] [(inc a) b])または#(vector (inc %1) %2)と同じように使用できます。Clojure#[...]ベクトル関数マクロの記述

これは特別なデータリーダーですか、これはdefmacroと書かれていますか?

+1

で提案されているように

あなただけhttps://stackoverflow.com/q/20677055とhttpsを参照してください、代わりに

#(vector (inc %1) %2) 

を使用するか、または必要があります。 //stackoverflow.com/q/32453062 – glts

+1

Clojureにユーザーリーダマクロはありません。 Taggedリテラルでも同様のことが可能です。それ以外の場合は '#(do [(inc%1)%2])' – cgrand

答えて

1

ちょうど笑いながら、私はあなたが解決策に来ることに最も近いものを書きました。それは読者マクロを定義するものではありませんが、あなたが探している構文をほぼ許すマクロを定義しています。

私は私が仕事に#()を乱用することができませんでしたので、%スタイル暗黙のパラメータを可能にするためにホイールを少しを改革しなければならなかった:

(defn arg-list 
    "Returns a lazy-seq of (%, %2, %3, ...) strings." 
    ([] (arg-list 1)) 
    ([n] (lazy-seq 
     (cons (str "%" (if (> n 1) n)) 
       (arg-list (inc n)))))) 

(defmacro lambda 
    "Use as you would #(). (map (lambda (* % 2)) [1, 2, 3])" 
    [& body] 
    (let [arg-syms (->> (arg-list) (take 5) (mapv symbol))] 
    `(fn [& ~arg-syms] 
     [email protected]))) 

これは#()リーダーマクロを模倣定期的なマクロを定義します。これは、 "パーセント"記号にバインドされたリストの最初の5つの引数を持つ可変関数に評価されます。それは%スタイルパラメータが可能になります:

(mapv (lambda (* % %2)) [1 2 3] [1 5 9]) 
[1 10 27] 

次に、あなただけの、ほぼあなたが探しているものを行うマクロを定義するためにそれを使用することができます

(defmacro vec-f [& elems] 
    `(lambda (vec ~(vec elems)))) 

(mapv (vec-f (inc %) %2) [1 2 3] [1 5 9]) 
[[2 1] [3 5] [4 9]] 

しかし、私私はその使用を勧めているとは言えません。

  • 読みやすくするためのものではありません。代わりにArityException Sを投げるの

  • は、逃した議論は、単にそれだけ%5まで可能に

  • を構造化代入を経由してnilにデフォルト設定されます。これはハードコーディングされた制限を増やすことができます。現在の "var-argメソッド"を使用すると、任意の数のパラメータを使用することはできません。コンパイル時に無限リストを実現しようとすると、明らかに涙がでてくるでしょう。コンセプトの証明として

しかし、それはあなたがの後にあるほとんど可能だかを示しています。これが不可能なコメント

#(do [(inc %1) %2]) 
関連する問題