При использовании clojure и псевдоним не работает в блоке do - PullRequest
2 голосов
/ 03 января 2011

При закрытии, когда я делаю:

(do 
    (use 'oe.model.modelcore) 
    (alias 'model 'oe.model.modelcore) 
    (str ::model/record)
)

Я получаю ошибку:

java.lang.Exception: Invalid token: ::modelcore/a
java.lang.Exception: Unmatched delimiter: )
java.lang.Exception: Unmatched delimiter: )

Однако, если я запускаю команды отдельно вне блока do они работают:

(use 'oe.model.modelcore)
(alias 'model 'oe.model.modelcore)
(str ::model/record )

: возвращает:

:oe.model.modelcore/record

Кто-нибудь знает почему?

Ответы [ 2 ]

3 голосов
/ 04 января 2011

Эта проблема возникает из-за взаимодействия времени чтения и времени выполнения.

В первом примере вся форма читается перед ее выполнением.::model/record выдает недопустимое исключение токена, поскольку в пространстве имен пока нет псевдонима model.

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

2 голосов
/ 04 января 2011

Это происходит из-за сложного случая с краями, известного как сценарий Джиларди: http://technomancy.us/143

Вся задача должна быть скомпилирована перед необходимыми запусками.Приведенная выше ссылка показывает вам, как обойти это, разрешив var во время выполнения с помощью ns-resol.

Также: вызов голого использования и псевдонима вне формы ns обычно не то, что вам нужно.

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