Clojurescript - как использовать / импортировать макросы в REPL (figwheel) - PullRequest
0 голосов
/ 12 января 2019

Я не могу использовать макросы в clojurescript REPL.

Я определяю макрос в macros.clj:

(ns clojurescripting.macros)

(defmacro increment [x]
  `(+ 1 ~x))

Тогда я использую это в core.cljs

(ns ^:figwheel-hooks clojurescripting.core
    (:require-macros [clojurescripting.macros]))

(defn main []
      (js/alert (clojurescripting.macros/increment 0)))

(main)

Код фактически использует макрос increment, поскольку он выдает предупреждение с правильным выводом.

Я запускаю repl с clojure -A:fig:build.

Когда я пытаюсь использовать макросы в REPL, я не могу получить доступ к макросу - там нет clojurescripting.core/increment, и я не могу получить доступ к clojurescripting.macros там.

Другой вопрос: Возможно ли это в любом REPL? В целом это представляется возможным, поскольку книга Learning Clojurescript приводит практически идентичный пример и приступает к его оценке в REPL.

PS

Это не дубликат этого вопроса - он, скорее всего, устарел, и принятый ответ является загадочным (я даже не уверен, что такое bREPL и использует ли его figwheel).

1 Ответ

0 голосов
/ 16 января 2019

Да, вы можете использовать макросы в REPL, как и в коде.

Полное имя макроса в вашем примере - clojurescripting.macros/increment (не clojurescripting.core/increment), и, предполагая, что пространство имен макросов было загружено, вы можете вызвать макрос (как это сделано в примере в вашем коде) , Вот пример:

cljs.user=> (clojurescripting.macros/increment 0)
1

Если пространство имен макросов не было загружено, вы можете сделать это из REPL с помощью require-macros. Вот пример, который работал бы, даже если ни одно из ваших пространств имен не загружало пространство имен макросов:

cljs.user=> (require-macros 'clojurescripting.macros)
nil
cljs.user=> (clojurescripting.macros/increment 0)
1

Вы также можете использовать псевдонимы пространства имен

cljs.user=> (require-macros '[clojurescripting.macros :as macros])
nil
cljs.user=> (macros/increment 0)
1

и ссылаться на макро переменные

cljs.user=> (require-macros '[clojurescripting.macros :refer [increment]])
nil
cljs.user=> (increment 0)
1

Все это должно работать непосредственно в REPL.

Фактически, все варианты, обсуждаемые на https://clojurescript.org/guides/ns-forms, должны работать в REPL, используя require-macros вместо :require-macros и require вместо :require, и т. Д. .

...