clojure とそのマクロに惹かれ、初めて知った私は、「abc」などの文字のリストから長さ「n」のすべての文字列を生成するマクロを作成するタスクを自分自身に設定しました。したがって、n=2 の場合、出力は "aa" "ab" "ac" "ba" "bb" "bc" "ca" "cb" "cc" になります。テンプレートとして次の関数から始めました: (defn mkstr [nv] (for [ivjv] (str ij)))。for バインディングでの「v」の繰り返しと、「n」の関数である必要がある変数の数の作成。この特定のケースでは: 2.
'quote' 'unquote' などについて読んだ後、マクロに関する優れたオンライン チュートリアル、多くの試行錯誤、そして運が良ければ、次の関数とマクロを生成することができました。ん。本当に大変だったのは、「for」バインディングで必要な可変量のコードを生成することでした。
(defn mkvars [n]
"Gives a list of 'n' unique symbols"
(let [vc (repeatedly n #(gensym ))] vc))
(defmacro mkcoms [n syms]
"Generates a list of possible combinations of length 'n' from a string of symbols"
`(let [vs# (mkvars ~n) sy# ~syms
forarg# (vec (interleave vs# (repeat ~n sy#)))]
`(for ~forarg# (str ~@vs#))))
ここで、私の「本当の」問題または理解の欠如は、出力を取得するには、次のようにしなければならないことです: (eval (mkcoms len chars))。これが「eval」を使用しないと機能しないのはなぜですか? 確かにそのまま使えますが、何か違和感があります。