我很难看到这是如何完成的。它如何能够在不编写任何 JS 的情况下将其转换为 JS(一切都在 Clojure 或 CS 中)。
有人可以举一个简单的例子来说明编译器如何将简单的东西转换为 javascript。也许是 (def x "foo") 或 (defn [x] (+ xx))?
我很难看到这是如何完成的。它如何能够在不编写任何 JS 的情况下将其转换为 JS(一切都在 Clojure 或 CS 中)。
有人可以举一个简单的例子来说明编译器如何将简单的东西转换为 javascript。也许是 (def x "foo") 或 (defn [x] (+ xx))?
发出 JavaScript 由cljs.compiler命名空间处理。(链接指向主分支上的源代码。)如您所见,它归结为将字符串打印到文件中。
当然,哪些字符串完全取决于 ClojureScript 源,但不直接取决于:原始源首先被转换为在编译过程中更有用的不同表示形式。这发生在cljs.analyzer命名空间中。
分析器比编译器更复杂。对于您的(def x "foo")
示例,它将生成一个相当简单的映射,该映射将由编译器的 multimethod 的:def
方法处理;emit
搜索defmethod emit :def
. 需要注意的是调用munge
(将 ClojureScript 标识符转换为有效的 JavaScript 标识符;例如foo-bar
-> foo_bar
)和作为参数之一的调用,其中的表示emits
将递归生成。(在这种情况下,它只是.)init
init
"foo"