一旦瀏覽器連接到clojurescript repl,我以前沒有辦法從repl調用宏。這是一個讓我忘記clojurescript的問題,喜歡直接使用javascript。基本上,我覺得cljs-repl有點蹩腳,我要回到編譯/調試循環,編寫clojure代碼應該解放我們。宏如何使用clojurescript repl來評估
在clojurescript中推送和測試代碼是否有很好的解決方法/工作流程?特別是如果可以評估宏?
我的問題的一個例子是:
作出新cljs項目
雷音新cljs模板等等
啓動服務器
cd bla^h
雷音運行
運行Web-REPL
雷音蹦牀cljsbuild REPL-聽
有一個文件
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測試宏並將結果複製回瀏覽器repl。大約一天後,我有一個cljs宏工作,它不是很有趣。這是大約6個月前。我希望現在有更快的方法來做到這一點。
我不確定我是否理解這個問題。您當然可以通過瀏覽器REPL來評估宏。你的意思是你希望能夠在REPL中定義*宏嗎? – levand
我已更新我的問題 – zcaudate
好的,是的,我已驗證這是一個問題。我認爲,這是瀏覽器REPL實現的問題,而不是ClojureScript本身。我瞭解bREPL的作者,並會與他覈對,看看他是否知道解決問題的方法,並根據此問題發佈適當的答案。同時,我建議編寫defpartial的非宏版本。這幾乎總是可能的,只是傳遞一個匿名函數而不是原始表單。它的語法更醜陋,但它起作用(除非你需要真正的短路評估,但這似乎並不是這種情況) – levand