【发布时间】:2012-11-19 14:20:45
【问题描述】:
被 clojure 及其宏所吸引和陌生,我为自己设定了编写一个宏的任务,该宏从诸如“abc”之类的字符列表中生成所有长度为“n”的字符串。所以对于 n=2,输出应该是“aa”“ab”“ac”“ba”“bb”“bc”“ca”“cb”“cc”。我从以下函数作为模板开始: (defn mkstr [n v] (for [i v j v] (str i j)))。 for绑定中'v'的重复以及创建多少个变量应该是'n'的函数;在这种特定情况下:2.
在阅读了'quote' 'unquote' 等内容之后,然后按照关于宏的优秀在线教程,经过多次试验和错误以及一些简单的运气,我设法生成了以下函数和宏,无论'n' 的值。真正困难的部分是生成 '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#))))
现在我的“真正”问题或缺乏理解是,要获得输出,我必须这样做: (评估(mkcoms len 字符))。为什么这只能通过使用 'eval' 起作用?诚然,它可以按原样使用,但感觉有些不对劲。
【问题讨论】: