2024 年 Clojure 状态调查 中分享您的想法!

欢迎!请查阅关于页面以了解更多关于如何使用此网页的信息。

0
ClojureScript

str 函数应处理由 Symbol.for 创建的原生 JavaScript 符号。目前,str 函数会抛出异常,因为它通过使用隐式字符串转换 ((.join #js (link: x) "")) 遇到了一些 JavaScript 安全检查。
有关安全检查的更多信息,请参阅: http://www.2ality.com/2014/12/es6-symbols.html
此问题还与以下内容有关
- http://dev.clojure.org/jira/browse/CLJS-1628
- http://dev.clojure.org/jira/browse/CLJS-890

`
(def x (.for js/Symbol "x"))
(str x)
TypeError: 无法将 Symbol 值转换为字符串

at Array.join (native)
at Function.cljs.core.str.cljs$core$IFn$_invoke$arity$1 (/home/roman/workspace/clojurescript/.cljs_node_repl/cljs/core.js:9561:12)
at Object.cljs$core$str [as str] (/home/roman/workspace/clojurescript/.cljs_node_repl/cljs/core.js:9543:22)
at repl:1:100
at repl:9:3
at repl:14:4
at Object.exports.runInThisContext (vm.js:54:17)
at Domain.<anonymous> ([stdin]:41:34)
at Domain.run (domain.js:228:14)
at Socket.<anonymous> ([stdin]:40:25)

`

直接调用 toString 方法对符号有效

(.toString x) ;;=> "Symbol(x)"

3 个回答

0
_评论由:mfikes_ 提供

单元测试在 Travis(大概是旧环境)中失败

JavaScriptCore


错误在 (test-cljs-1631) (core-advanced-test.js:3724:60)
预期: (= "Symbol(x)" (str (.for js/Symbol "x")))
  实际情况: #object[ReferenceError ReferenceError: Can't find variable: Symbol]


Nashorn


错误在 (test-cljs-1631) (ReferenceError:NaN:NaN)
预期: (= "Symbol(x)" (str (.for js/Symbol "x")))
  实际情况: #object[ReferenceError ReferenceError: "Symbol" is not defined]


鉴于这似乎只影响测试,并不影响生产代码,也许测试可以根据 {{(exists? js/Symbol)}} 条件化。
0

评论由:thheller 提供

关于 {{str}} 函数/宏以及它们为什么这么做有许多历史背景。

参见:https://dev.clojure.org/jira/browse/CLJS-890

补丁只使用了{{toString}},但直到我们解决CLJS-890问题之前,这并不是一个可行的选项。

0
参考: https://clojure.atlassian.net/browse/CLJS-1631 (由r0man报告)
...