./ в Clojure (квалифицированный символ?) - PullRequest
2 голосов
/ 08 января 2012

В настоящее время я использую другой язык ( Shen ) в Clojure.

У Шена есть символ "./", но в Clojure это интерпретируется перед оценкой и, следовательно, приводит к ошибке. Мне не нужно "./" внутри макроса, который компилирует эту функцию в код Clojure.

Есть ли способ игнорировать это? Я думаю, что он интерпретируется как квалифицированный символ, но без имени, так как замена его на / или xyz / приводит к тем же сообщениям об ошибках.

Мой текущий макрос так же прост, как

(defmacro kl/trap-error [x [y z r]] `(try ~x (catch Exception '~z ~r)))

Но когда я звоню с кодом Shen, происходит следующее:

kl=> (trap-error (/ 1 0) (./ E (error-to-string E)
RuntimeException Invalid token: ./  clojure.lang.Util.runtimeException (Util.java:156)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: E in this context, compiling:(NO_SOURCE_PATH:0)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: E in this context, compiling:(NO_SOURCE_PATH:89)

Я надеюсь, что кто-то может помочь мне с этим.

Заранее спасибо.

1 Ответ

2 голосов
/ 09 января 2012

Это невозможно без изменения читателя Clojure (привилегия, которая не предоставляется программистам Clojure). Ваше утверждение «Шен имеет символ ./, но в Clojure это интерпретируется перед оценкой и, следовательно, приводит к ошибке», однако неверно - никакой интерпретации или оценки вообще не происходит, потому что читатель видит эти символы и не может даже выяснить, какой тип данных они должны быть.

  • Это список? Нет, без паренов.
  • Это строка? Нет, без кавычек.
  • Это символ? Нет, было бы пространство имен, но без имени.
  • ... еще много подобных случаев ...
  • Я сдаюсь, это не структура данных, которая представляет действительный код Clojure.
...