1

次のように、「let」で相互にバインドしたい引数の数が不明な場合。

let [a "hello" b 55 ]

関数/マクロなどの内部でletをバインドし、リストをループしたい場合、これをどのように行いますか?

レットには4つの要素がありますが、「キー」をループするだけであることに注意してください。使用例として、キーにバインドされた値がbのような数値(55)であるかどうかを確認する場合があります。

編集:例として:この以下は非常に壊れているが、単に問題を説明することを目的としていることに注意してください。

(defn func [& arguments] 
 (let [ ~arguments] ((println "omg no way!") (for [x let-list] (number? x (println "roar") )))

入力:(func [a "hello" b 55]

つまり、基本的には、次のような関数が必要です。

  • 引数を次のようなリストの形式にバインドします:[ab]
  • prints "omg no way!")-ループの一部であってはならず、関数内で1回だけ出力する必要があります
  • 「let-list」をループするforループのようなループのようなもので、次のようになります。「a、数字ですか?いいえ、b数字ですか?はい、「roar」を出力します

出力:omg no way roar

もう一度: 関数内のlet内のキーワードにアクセスする方法があるかどうか疑問に思っています。forループが示すように、個々の要素にアクセスして、その要素を使って処理を実行したいと思います。私が([x引数]の代わりに]を使用した場合、次のようになります:omg no way、roar roar(bは55に関連付けられているため、数値ですが、55も数値ですが、55は55であるため、55を使用する必要はありません。すでにb)に関連付けられています

4

1 に答える 1

1

これは、交互の名前と値のリストを取得し、それらをletにバインドしてから、ローカル名のマップに名前を付ける「locals」というシンボルを導入することによって作成したバインドのマップを保存するマクロの例です。ローカル値に。

(defmacro anaphoric-let [alternating-symbols-and-values & body]
  `(let [~@alternating-symbols-and-values
         names# (quote ~(flatten (partition 1 2 alternating-symbols-and-values)))
         values#  ~(vec (flatten (partition 1 2 alternating-symbols-and-values)))
         ~'locals (zipmap names# values#)]
     ~@body))

withingと呼ばれる式は、名前anaphoric-letの値を使用できます。locals

user> (anaphoric-let [a 1 b 2 c 3 d 4] [a locals])
[1 {d 4, c 3, b 2, a 1}]

letで値を定義した後、本体の前に値をマップに保存することは、複数の実行や非衛生的なマクロの他の罪を防ぐために重要です。

この地図を使用して、地元の人々に基づいて決定を下すことができます。

user> (anaphoric-let [a 1 b 2 c 3 d 4 e "cat"] 
        (map (fn [[local val]] 
               (str local " is " (if (number? val) val "woof"))) 
              locals))
("e is woof" "d is 4" "c is 3" "b is 2" "a is 1")

また:

user> (anaphoric-let [a 1 b 2 c 3 d 4 e "cat"] 
        (println "omg no way!") 
        (dorun (for [x (vals locals)] 
                 (if (number? x) (println "roar")))))
omg no way!                                                                                                                                                    
roar                                                                                                                                                           
roar                                                                                                                                                           
roar                                                                                                                                                           
roar                                                                                                                                                           
nil

ps:アナフォイックマクロは、渡されたコードには存在しなかった名前を、作成したコードに導入するマクロです。

于 2013-01-13T22:52:59.713 に答える