Как управлять зависимостями в макросе cl js? - PullRequest
2 голосов
/ 28 апреля 2020

Скажем, у меня есть макрос в файле clj, который будет использоваться в файле cl js

(defmacro defelem [name element]
  `(defcard ~name
     (ct.react/react-card
      (r/as-element
       [~element]
       )
      )
     )
  )

, а зависимости - ct.react и r. Нужны ли зависимости в файлах clj или cl js? Я пробовал оба, но ни один не работал.

Я получаю ошибку в тени:

(defelem cart-card cart)
-------^------------------------------------------------------------------------
Use of undeclared Var myapp.workspaces.cards/react-card
--------------------------------------------------------------------------------

С чего бы это?

1 Ответ

1 голос
/ 28 апреля 2020

Вары, названные полностью определенными символами, не обязательно должны существовать при компиляции defmacro. Это означает, что вы можете записать их непосредственно в свой макрос, и это будет работать до тех пор, пока ссылочные переменные будут существовать во время выполнения:

(defmacro defelem [name element]
  `(defcard ~name
     (package.cljs.ns/react-card
      (r/as-element [~element]))))

Конечно, это означает, что компилятор не может защитить вас, если вы попытаетесь сослаться на несуществующую переменную, поэтому вам нужно быть немного более осторожным, чем обычно.

См. связанный вопрос: Как мне поступить с требуемым кодом Clojurescript из Clojurescript макросы?

Поскольку вы используете shadow-cl js, см. также свою собственную документацию по этому вопросу:

Поскольку макросы работать в CLJ, а не CL JS, псевдонимы пространства имен, настроенные вами в CL JS, не будут работать в макросе. Рекомендуется использовать полностью определенные имена, если вам нужен доступ к коду из других пространств имен.

...