【问题标题】:Resolve function throws an error in ClojureScript but not ClojureResolve 函数在 ClojureScript 中引发错误,但在 Clojure 中没有
【发布时间】:2012-08-18 17:11:44
【问题描述】:

以下程序在 Clojure 中按预期工作,但在 ClojureScript 中引发错误。我想知道这是一个错误还是 ClojureScript 中根本没有该功能,或者我是否需要重新考虑我尝试这样做的方式。非常感谢您提前提供的帮助。

; Clojure...
(defn foo [x] x)
(defn foobee [x] (str (foo x) "bee"))

(println
  ((resolve (symbol (str "foo" "bee"))) "bizzee"))

;=> bizzeebee

; ClojureScript...
(defn foo [x] x)
(defn foobee [x] (str (foo x) "bee"))

(.log js/console
  ((resolve (symbol (str "foo" "bee"))) "bizzee"))

;=> Exception in thread "main" java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol

【问题讨论】:

  • 我已经在下面发布了主要问题的答案,但我想知道这个异常是从哪里出现的?这是 Java 异常,而不是 JS 错误,所以我猜这是编译期间或浏览器 repl 会话中的问题。编译器在编译这段代码时绝对应该没有问题,而且它确实不在我的机器上,所以如果它确实发生在编译时,也许它可能是你没有粘贴到这里的 ClojureScript 代码的某些部分的问题?如果它是浏览器 repl 的事情,您能否将在服务器中产生此异常的浏览器 repl 会话的日志粘贴到某处?
  • 如果结果不是很明显,一个最小的破坏示例和您的 ClojureScript 版本的发布号/提交 sha 将非常有用。
  • 感谢您的帮助。我尝试使用简单和高级优化进行编译,但没有尝试不进行优化进行编译。这样做会将其推迟到 JavaScript 级别的错误。

标签: clojure clojurescript


【解决方案1】:

resolve 在 ClojureScript 中不存在。事实上,ClojureScript 没有 Vars。

调用名称是动态构造的函数可以通过各种 hack(例如将 aget 与命名空间对象一起使用),但是除非导出所有相关符号,否则可以保证高级编译会中断。此外,即使编译设置更宽松,目前也没有人享受官方支持。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多