[英]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.