Debugging js/console.log登录ClojureScript
我想用ClojureScript实现一个函数来简化Debugging js/console.log登录ClojureScript,debugging,clojurescript,Debugging,Clojurescript,我想用ClojureScript实现一个函数来简化js/console.log,如下所示: (defn log [& args] (apply js/console.log args)) 调用它:(日志“foo”“bar”) 抛出:TypeError:非法调用 但这是可行的:(js/console.log“foo”“bar”) 问题是什么?js/something用于访问js对象,但您不应该在此之后嵌套点,因为它与clojure语法不兼容,将被删除。在较旧版本的编译器(
js/console.log
,如下所示:
(defn log [& args]
(apply js/console.log args))
调用它:(日志“foo”“bar”)
抛出:TypeError:非法调用
但这是可行的:(js/console.log“foo”“bar”)
问题是什么?
js/something
用于访问js对象,但您不应该在此之后嵌套点,因为它与clojure语法不兼容,将被删除。在较旧版本的编译器(2138)中,您的代码可以工作,但在较新版本的编译器中,它可能已被弃用。您使用的是哪个版本
正确的方法是像这样使用简单的js互操作:[注意:请参阅ClojureScript首席开发人员David Nolen的评论]
(defn log [& args] (apply (.-log js/console) args))
甚至更短,因为console.log已经是可变的(只需创建一个别名):
如果您首先将它放在文件顶部,也可以使用println:
(启用控制台打印!)
我找到了真正的答案
(.apply (.-log js/console) js/console (clj->js args))
pprint已被移植到:
:require [cljs.pprint :refer [pprint]]
以下是您的函数的工作代码(使用[org.clojure/clojurescript“1.7.228”进行测试): 这里有一篇文章描述了(apply…)为什么不能很好地使用JS函数。
使用
控制台。log
使用宏而不是函数是有意义的。如果将log
作为一个函数来实现,则所有消息都将记录在定义log
函数的行号中
宏通过在编译期间生成内联代码来解决此问题,了解宏在编译时运行非常重要
在宏中定义此宏。cljc
:
(ns test.macros)
(defmacro log
[& msgs]
`(.log js/console ~@msgs))
- `:类似于
或”
但是:quote
- 符号会自动解析以包含其名称空间,从而防止在求值时出现不明确的符号
- 可以使用
或~
插入经过评估的表单,就像我对unquote
添加msgs
解压多个参数所做的那样:@
。更多信息~@msgs
core.cljs
调用它:
(ns test.core
(:require-macros [test.macros :refer [log]]))
(log "foo" "bar")
编写
js/console.log非常好,这是受支持的,永远不会改变。无论如何,这都会发生在互操作的情况下,所以它是不可移植的。这是个好消息!“你是怎么发现的?”从“Shaun LeBron和Jonathan Boston的作品中,把Culjur.PrPress移植到CuluReScript,这样我们就可以看到一个漂亮的印刷品AST。”这是当今最优雅的解决方案。它们不是完全相同的东西。code>println
使用clojure的字符串序列化行为,而大多数浏览器中的console.log
将对象呈现为可导航树。
(ns test.macros)
(defmacro log
[& msgs]
`(.log js/console ~@msgs))
(ns test.core
(:require-macros [test.macros :refer [log]]))
(log "foo" "bar")