對於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)))。在「綁定」中重複'v'並創建多少變量應該是'n'的函數;在這個特定的情況下:2.clojure宏eval
在閱讀了關於'報價''引用'等等,然後遵循一個關於宏,很多反覆試驗和一些簡單的運氣的優秀在線教程,我設法產生以下功能和宏,無論'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 [email protected]#))))
現在我的「真實」的問題或不理解的是,獲得輸出,我必須這樣做: (EVAL(mkcoms len個字符))。爲什麼這隻能使用'eval'?誠然,它可以像現在這樣使用,但有些事情感覺錯誤。
評論被我刪除。 – Brian