Написание многоартериального макроса defn - PullRequest
0 голосов
/ 27 февраля 2019

Я не знал, как это сформулировать, но вот проблема:

(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, но я не вижу, в чем проблема.Я вижу карту и правильные данные.

Я думал, что, возможно, проблема в том, что существует список артерий?

Спасибо

1 Ответ

0 голосов
/ 27 февраля 2019

Хорошо, я наконец нашел проблему с помощью 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#)))))

Я забыл две вещи:

  • сделать имя функции символом, который не является тем жекак строка и не приводится к ней автоматически
  • создать символ для дескриптора с #

Надеемся, что все это будет задокументировано в одном месте, многие учебные материалы необъяснить эти символы (или я их пропустил).

...