如何使用clojurescript repl评估宏

zca*_*ate 4 clojure clojurescript

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

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

我的问题的一个例子是:

  1. 制作一个新的cljs项目

    lein new cljs-template blah

  2. 启动服务器

    cd blah

    莱恩跑

  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 [])
"Error evaluating:" (crate.macros/defpartial []) :as "crate.macros.defpartial.call(null,cljs.core.Vector.fromArray([]));\n"
#
TypeError: Cannot read property 'defpartial' of undefined

现在defpartial是一个非常有用的宏,没有它,这是一个麻烦.

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

dno*_*len 6

为了在交互式会话期间加载宏w/bREPL,您需要首先在bREPL中显式评估ns表单.

即便如此,这有点令人讨厌 - 一些工作已经掌握在主人手中以支持交互式宏观扩展,但它需要更多的工作.通过在启动时分析源文件,W还有一些关于使bREPL更有用的想法.