4

一旦浏览器连接到 clojurescript repl,我以前无法从 repl 调用宏。这是一个过去让我放弃 clojurescript 的问题,我更喜欢直接使用 javascript。基本上,我觉得 cljs-repl 有点蹩脚,我又回到了编译/调试周期,在 clojure 中编写代码应该让我们从中解放出来。

在 clojurescript 中推送和测试代码是否有任何好的解决方法/工作流程?特别是如果可以评估宏?

我的问题的一个例子是:

  1. 创建一个新的 cljs 项目

    lein new cljs-template 等等

  2. 启动服务器

    光盘等等

    来跑

  3. 运行 web-repl

    lein trampoline cljsbuild repl-listen

  4. 有一个src/blah/client/main.cljs带有标题的文件

    (ns blad.client.main
      (:require [noir.cljs.client.watcher :as watcher]
                [clojure.browser.repl :as repl]
                [crate.core :as crate])
      (:use [jayq.core :only [$ append]])
      (:use-macros [crate.macros :only [defpartial]]))

注意线(:use-macros [crate.macros :only [defpartial]])

我不能defpartial在浏览器 repl 中使用,因为它是一个宏。我得到的错误是:

>> (crate.macros/defpartial [])
“评估错误:” (crate.macros/defpartial []) :as “crate.macros.defpartial.call(null,cljs.core.Vector.fromArray([]));\n”
#
TypeError:无法读取未定义的属性“defpartial”

现在defpartial 是一个非常有用的宏,如果没有它,它会很麻烦。

当我想在项目中定义另一个宏时,我的问题变得更糟了:use-macros。我根本无法调试我在 repl 或浏览器中写的内容,大约半天后,我发现使用 clj repl 更快,使用 macroexpand 测试宏,然后将结果复制回浏览器复制 大约一天后,我得到了一个 cljs 宏,它不是很有趣。这是大约 6 个月前的事了。我希望现在有一种更快的方法可以做到这一点。

4

2 回答 2

6

为了在带有 bREPL 的交互式会话期间加载宏,您需要首先在 bREPL 中显式评估 ns 表单。

即便如此,这还是有点烦人 - 一些工作已经登陆 master 以支持交互式宏扩展,但它需要更多的工作。W 也有一些想法,通过在启动时分析源文件来使 bREPL 更有用。

于 2012-09-11T16:13:12.477 回答
3

今天我用cemerick/austin进行了检查:一个 clojureScript 浏览器-REPL,您可以不受限制地在 brepl 中使用和评估您的宏,也就是说,无需先在 brREPL 中明确评估 ns 形式。我在这个演示项目中使用core.async 宏和自定义域宏没有问题。

于 2013-10-17T18:20:23.047 回答