[英]how can macros be evaluated using the clojurescript repl
一旦浏览器连接到clojurescript repl,我以前无法从repl调用宏。 这个问题在过去让我摆脱了clojurescript,更喜欢直接使用javascript。 基本上,我觉得cljs-repl有点蹩脚,我回到编译/调试周期,在clojure中编写代码应该是从我们那里解放出来的。
在clojurescript中推送和测试代码是否有任何良好的变通方法/工作流程? 特别是如果可以评估宏?
我的问题的一个例子是:
制作一个新的cljs项目
lein new cljs-template blah
启动服务器
cd blah
莱恩跑
运行web-repl
lein trampoline cljsbuild repl-listen
有一个带有标题的文件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]])
我不能在浏览器repl中使用defpartial
,因为它是一个宏。 我得到的错误是:
>> (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个月前。 我希望现在有更快的方法可以做到这一点。
为了在交互式会话期间加载宏w / bREPL,您需要首先在bREPL中明确评估ns表单。
即便如此,这有点令人讨厌 - 一些工作已经掌握在主人手中以支持交互式宏观扩展,但它需要更多的工作。 通过在启动时分析源文件,W还有一些关于使bREPL更有用的想法。
今天我用cemerick / austin检查了一下 :一个clojureScript浏览器-REPL,您可以无限制地使用和评估brepl中的宏,也就是说没有先在bREPL中明确评估ns形式。 我在这个演示项目 core.async宏和自定义域宏中使用没有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.