【问题标题】:Writing a multi-arity defn macro编写多元定义宏
【发布时间】:2019-07-21 01:31:16
【问题描述】:

我不知道如何表达,但问题是:

(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)))))

函数 ->basic-operation 有效并且之前定义过。宏的目的是创建通用强制器,例如:

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

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

我认为问题可能在于存在一个 arities 列表这一事实?

谢谢

【问题讨论】:

    标签: clojure macros


    【解决方案1】:

    好的,我终于通过 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不同,不会自动强制转换为符号
    • 用#为描述符生成一个符号

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

    【讨论】:

      猜你喜欢
      • 2011-03-08
      • 2019-04-07
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      相关资源
      最近更新 更多