Debugging js/console.log登录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语法不兼容,将被删除。在较旧版本的编译器(

我想用ClojureScript实现一个函数来简化
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")