在ClojureScript中,解决函数会抛出错误,但在Clojure中不会。

11
下面的程序在Clojure中按照我的预期工作,但在ClojureScript中会抛出错误。我想知道这是一个bug还是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会话日志? - Michał Marczyk
如果问题不是显而易见的,提供一个最小化的破坏性示例以及您的ClojureScript版本的发布号/提交sha将非常有用。 - Michał Marczyk
感谢您的帮助。我尝试使用简单和高级优化进行编译,但没有尝试过不进行优化的编译。这样做将错误延迟到了JavaScript层面。 - bryanwoods
1个回答

15

resolve在ClojureScript中不存在。实际上,ClojureScript没有变量(Vars)。

通过各种技巧(比如使用命名空间对象的aget),可以调用动态构造的函数名称,但是这些技巧都有可能在高级编译中出现问题,除非所有相关符号都已导出。此外,目前即使在更宽松的编译设置下,也没有任何技巧得到了官方支持。


1
@bryanwoods 我的一个黑客示例请参见:https://dev59.com/0X_aa4cB1Zd3GeqPzipO#30892955(请注意,它需要导出符号)。 - Marcin Bilski
似乎不再正确了。https://cljs.github.io/api/cljs.core/resolve - Jeff Evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接