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

欢迎!有关此功能的更多信息,请参阅关于页面

0
ClojureScript

str函数应处理由Symbol.for生成的原生日志JavaScript符号。目前,因为通过使用通过隐式字符串转换的(.join #js (link: x) "")进行的JavaScript安全性检查,str函数引发异常。
有关安全性检查的更多信息,请参见: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: 无法将符号值转换为字符串

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}} fn/macroph的许多历史原因以及它们为什么会这样做。

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

该补丁仅使用{{toString}},在解决CLJS-890问题之前,这不是一个选项。

0
...