【问题标题】:./ in Clojure (qualified symbol?)./ 在 Clojure 中(限定符号?)
【发布时间】: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


【解决方案1】:

如果不修改 Clojure 阅读器,这是不可能的(Clojure 程序员没有的特权)。您的陈述“Shen 有一个符号 ./,但在 Clojure 中,这是在评估之前解释的,因此会导致错误”是不正确的 - 根本没有解释或评估,因为读者看到了这些字符,甚至不能弄清楚它们应该是什么数据类型。

  • 它们是列表吗?不,没有括号。
  • 它们是字符串吗?不,没有引号。
  • 它们是一个符号吗?不,会有命名空间但没有名称。
  • ...这样的案例还有很多...
  • 我放弃了,这不是代表有效 Clojure 代码的数据结构。

【讨论】:

  • 所以在 Clojure REPL 中写 Shen 代码是不可能的,对吧?仅在使用之前读取文件并替换“./”,例如读取字符串...
  • 好吧。 clojure.main/repl 允许您指定将用于读取而不是内置的函数。因此,对于在 repl 上编写它的特定情况,您可能只需做一些工作就可以做得很好。但是要求文件没有这样的钩子,所以我认为在一般情况下你无能为力。
  • 谢谢。我可能会尝试写一个可以阅读这个的“Shen REPL”。现在我只阅读 Shen 文件并替换 /.在评估之前通过 lambda。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多