【发布时间】:2012-01-08 14:15:33
【问题描述】:
我目前正在 Clojure 中实现另一种语言 (Shen)。
Shen 有一个符号“./”,但在 Clojure 中,这是在评估之前解释的,因此会导致错误。 我不需要将这个函数编译为 Clojure 代码的宏中的“./”。
有没有办法忽略这个? 我认为它被解释为限定符号但没有名称,因为将其替换为 a/ 或 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)
我希望有人可以帮助我。
提前致谢。
【问题讨论】:
-
在CL中可以使用|./|,不知道对Clojure是否有效。
-
据我所知,您需要一个自定义阅读器才能在 Clojure 中执行此操作,但我不确定。
-
@danlei:但据我所知,Clojure 没有定义阅读器宏的标准方法,您必须hack a bit,这并不值得。
-
Daimrod,是的,这就是我写自定义阅读器时的意思:专门的沉阅读器,从头开始编写。
-
除了被欣赏与否之外,也许人们可以使用github.com/klutometis/reader-macros 在Clojure 中获得类似于CL 的标准语法多个转义字符的东西,但我并没有真正仔细研究它。 (自定义阅读器肯定是首选的解决方案,但这至少对于测试目的可能还是有用的。)
标签: compiler-construction clojure functional-programming qualified-name