编写一个多种族defn宏

时间:2019-02-27 10:42:08

标签: clojure macros

我不知道该怎么说,但这是问题所在:

(defmacro defbasic [val-fn]
  (let [;; Like str but keywords are str'd without :
        fn-name (fdat/->string "make-" val-fn)
        ;; This is a hashmap got from basic-builders
        ;; which is def
        options (get basic-builders val-fn)]
   `(defn ~fn-name
      ([]
       (~fn-name {}))
      ([descriptor]
       (->basic-operation ~options descriptor)))))

功能->基本操作有效且已在前面定义。宏的目的是创建通用强制,如:

(defbasic :cat) ;; ==> defn a make-cat function 

我看到了Clojure规范的抛出,但是我看不出问题出在哪里。我看到了地图和正确的数据。

我以为也许是问题所在,因为那里有一系列的白名单?

谢谢

1 个答案:

答案 0 :(得分:2)

好吧,我终于通过tral-guess-error找到了问题:

(defmacro defbasic [val-fn]
  (let [fn-name (symbol (fdat/->string "make-" val-fn))
        options (get basic-builders val-fn)]
   `(defn ~fn-name
      ([]
       (~fn-name {}))
      ([descriptor#]
       (->basic-operation ~options descriptor#)))))

我忘了两件事:

  • 将函数名称命名为符号,该符号与String不同,并且不会自动强制使用它
  • 使用#
  • 为描述符生成符号

希望所有这些都可以在一个地方记录下来,许多学习内容没有明确解释这些符号(或者我错过了)。