4

我很难看到这是如何完成的。它如何能够在不编写任何 JS 的情况下将其转换为 JS(一切都在 Clojure 或 CS 中)。

有人可以举一个简单的例子来说明编译器如何将简单的东西转换为 javascript。也许是 (def x "foo") 或 (defn [x] (+ xx))?

4

1 回答 1

5

发出 JavaScript 由cljs.compiler命名空间处理。(链接指向主分支上的源代码。)如您所见,它归结为将字符串打印到文件中。

当然,哪些字符串完全取决于 ClojureScript 源,但不直接取决于:原始源首先被转换为在编译过程中更有用的不同表示形式。这发生在cljs.analyzer命名空间中。

分析器比编译器更复杂。对于您的(def x "foo")示例,它将生成一个相当简单的映射,该映射将由编译器的 multimethod 的:def方法处理;emit搜索defmethod emit :def. 需要注意的是调用munge(将 ClojureScript 标识符转换为有效的 JavaScript 标识符;例如foo-bar-> foo_bar)和作为参数之一的调用,其中的表示emits将递归生成。(在这种情况下,它只是.)initinit"foo"

于 2013-07-12T22:26:55.803 回答