在 ClojureScript 中检索数字的二进制表示

Retrieve binary representation of number in ClojureScript

我想得到一个数字的二进制形式,例如 6 -> "0110"

我试过 (js/toString ...) 但无论我使用什么语法,repl 总是 returns "[object Window]"。这是什么意思?

我也很困惑,因为 toString 是 goog.math.Integer 的一部分,但是当我尝试使用 js/isOdd 同一个库的一部分时,它说它没有定义。我尝试通过 (ns user (:require [goog.math.Integer :as int])) 手动要求它,但没有任何区别。

我也对 (.toString ...)(js/toString ...) 之间的区别感到困惑。

对特定问题的任何帮助 and/or cljs 中 js 函数的细微差别将不胜感激。谢谢!

这是一个解析器错误,有三种方法可以解决这个问题,用数字创建一个 var 并在其上调用 .toString,用一个额外的点写数字或写括号中的数字。

如果您在 JavaScript 控制台上尝试 6.toString(2),您将收到此错误:

SyntaxError: Unexpected token ILLEGAL

但是这个 6..toString(2) 有效。这是因为 JavaScript 解析器期望数字后跟一个点是浮点文字。当你写 6. 时,解析器期望下一个字符是数字而不是 t,当你写 6.. 时,第一个点被解析为数字的一部分(创建数字 6.0)并且第二个点被解析为对创建的数字的方法调用。

在 ClojureScript 中,编译器知道 JavaScript 的 "feature",因此您可以将 6 文字传递给 toString:

cljs.user> (.toString 6 2)
"110"
cljs.user> (.toString 6. 2)
"110"

ClojureScript 编译器在这两种情况下都会生成正确的代码。在第一种情况下,它生成 (6).toString(2),在第二种情况下,它生成 6.0.toString(2).

(js/toString 6) 正在调用 window 全局对象上定义的 toString。无论你通过什么,结果总是一样的。您可以在 JavaScript 控制台中通过 window.toString() 检查调用。

(.toString target args) 正在调用目标对象中定义的 toString 传递 args 作为方法的参数。

你应该使用 (.toString 6 2)。使用 (js/toString ...) 等于 toString(...),您可以尝试在典型的 javascript 浏览器控制台中评估自己。你会看到你也会得到一个 "object Window".

(js/thing) 用于引用 java 脚本运行时符号。特别是,如果您加载的代码与编译的 clojurescript 分开(例如,通过不同的脚本加载),您可以使用 js/... 语法引用加载的符号。 js/thing,在这种情况下,将在 java 脚本的顶级范围内引用 thing

例如,假设您正在使用 ROT.js 库,该库通过 ROT 对象公开其 API。您可以使用 js/ROT 在 clojurescript 中访问其功能(假设库已加载)。然后使用 (js/ROT.Display. params).

创建在 ROT.Display 中找到的 Display 对象的实例

另一方面,Loaded Closure 兼容代码的访问取决于它们在命名空间中的需求方式。通常,如果您使用 (ns test (:require [goog.math :as math]) 加载了 goog.math 库,则可以使用 (math/something).

访问 goog.math 下的所有内容

(.function object params) 语法用于调用 javacript 对象的方法,对应于 object.function(params)。请记住,javascript 对象不同于您通过纯 clojurescript 代码创建的值和对象。如果您只想获取该对象的 属性 的值,请使用 (.-property object)。您还可以查找 doto.. 和线程宏 ->->>,以了解更多在 clojurescript 中处理 javascript 对象的方法。在 clojure 中为 java 提供的大多数互操作设施都适用于 javascript/clojurescript。我还推荐阅读 http://www.spacjer.com/blog/2014/09/12/clojurescript-javascript-interop/.

至于isOdd,那是goog.math.Integer实例的实例方法。首先创建一个实例(例如 (def e (new math/Integer ...)),然后您可以在该实例上调用 .isOdd。查看 goog.math.Integer 文档,了解哪些静态属性和方法可以直接从 Integer 范围访问。