Не может принять значение макроса: # 'clojure.core / case - PullRequest
0 голосов
/ 22 февраля 2019

Я создаю функцию внутри функции в Clojure, чтобы имитировать концепцию объектов Java, в которой моя функция действует как конструктор.(Просто чтобы обернуть голову, используя эту концепцию в Clojure.)

(defn person [name age]
  (def p (fn [args & age]
    case args
     :set-name (person (first args) age)
     :set-age (person age)
    ;; :get-name (person (first args))
    ;; :get-age ()
)))

Но я получаю следующую ошибку:

CompilerException java.lang.RuntimeException: Не могу принять значениемакрос: # 'clojure.core / case, компилирование: (null: 2: 8)

1 Ответ

0 голосов
/ 22 февраля 2019
  1. Вы (почти всегда) не должны использовать def внутри другого def или defn.Использование def является глобальной декларацией, и оно (почти) всегда должно быть автономно в исходном файле.

См. Clojure для Brave & True для вступления онлайн илимного хороших книг, таких как Getting Clojure.

Вы забыли про паренов вокруг case:

Пример:

(case args ...)
Использование case - это действительно специальная функция, предназначенная главным образом для взаимодействия объектов Java, с некоторыми серьезными ограничениями (иначе говоря, «оптимизация»).ИМХО почти всегда лучше использовать cond.

Пример:

(cond
  (= :set-name args)   (person (first args) age)
  (= :set-age  args)   (person age)
  ...)

Обновление

Одна из проблем с caseявляется то, что это должен быть литерал времени компиляции .Тем не менее, это не очевидно, и нет никакого предупреждения, если вы пытаетесь использовать что-то, что не соответствует определению.Тогда вы просто получаете молчаливый сбой.Этот пример выглядит так, как будто он должен вернуть "my vec", но он не работает и возвращает "default":

; "The test-constants are not evaluated.  They must be compile-time
; literals, and need not be quoted." 
(let [myvec [1 2]]
  (case myvec
    []             "empty vec"
    (vec '(1 2))   "my vec"
    "default"))
;=> "default"

Таким образом, использование case оставляет ловушку-ловушку, готовую разбить ваш код без предупреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...