如何使用clojurescript repl计算宏

如何使用clojurescript repl计算宏,clojure,clojurescript,Clojure,Clojurescript,一旦浏览器连接到clojurescript repl,我以前无法从repl调用宏。这是一个过去让我不喜欢clojurescript的问题,我更喜欢直接使用javascript。基本上,我觉得cljs repl有点蹩脚,我要回到编译/调试周期,在clojure中编写代码应该可以让我们从中解脱出来 在clojurescript中推送和测试代码有什么好的解决方法/工作流程吗?特别是如果可以计算宏 我的问题的一个例子是: 创建一个新的cljs项目 lein新的cljs模板等等 启动服务器 cd废话 莱

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

在clojurescript中推送和测试代码有什么好的解决方法/工作流程吗?特别是如果可以计算宏

我的问题的一个例子是:

  • 创建一个新的cljs项目

    lein新的cljs模板等等

  • 启动服务器

    cd废话

    莱因润

  • 运行web repl

    莱恩蹦床cljsbuild repl倾听

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

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


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

    为了在交互式会话(w/bREPL)期间加载宏,您需要首先在bREPL中显式地计算ns表单


    尽管如此,这还是有点烦人——master中已经有一些支持交互式宏扩展的工作,但它需要更多的工作。我们也有一些想法,通过在启动时对源文件进行分析,使bREPL变得更有用。

    今天,我检查了:使用clojureScript浏览器REPL,您可以在bREPL中使用和评估宏,而不受限制,也就是说,不必先在bREPL中显式评估ns表单。
    我在这个core.async宏和自定义域宏中使用没有问题

    我不确定我是否理解这个问题。您当然可以从浏览器REPL计算宏。你的意思是想在REPL上定义宏吗?好的,是的,我已经验证了这是一个问题。我认为这是浏览器REPL的实现方式而不是ClojureScript本身的问题。我认识bREPL的作者,我会和他核实一下,看看他是否知道解决这个问题的方法,然后在此基础上发布一个正确的答案。同时,我建议编写非宏版本的defpartial。这几乎总是可能的,只需传递一个匿名函数而不是原始表单。它在语法上更难看,但它是有效的(除非你真的需要短路求值,但这里似乎不是这样),我很确定原因是宏是在编译.cljs代码之前展开的。如果有一种方法可以说在emacs或其他编辑器中动态编译并插入宏,那么问题就解决了。我希望可能有人已经写了些东西 (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]])) >> (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