2012-09-09 88 views
4

一旦瀏覽器連接到clojurescript repl,我以前沒有辦法從repl調用宏。這是一個讓我忘記clojurescript的問題,喜歡直接使用javascript。基本上,我覺得cljs-repl有點蹩腳,我要回到編譯/調試循環,編寫clojure代碼應該解放我們。宏如何使用clojurescript repl來評估

在clojurescript中推送和測試代碼是否有很好的解決方法/工作流程?特別是如果可以評估宏?

我的問題的一個例子是:

  1. 作出新cljs項目

    雷音新cljs模板等等

  2. 啓動服務器

    cd bla^h

    雷音運行

  3. 運行Web-REPL

    雷音蹦牀cljsbuild REPL-聽

  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]])

我不能在瀏覽器中使用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個月前。我希望現在有更快的方法來做到這一點。

+0

我不確定我是否理解這個問題。您當然可以通過瀏覽器REPL來評估宏。你的意思是你希望能夠在REPL中定義*宏嗎? – levand

+0

我已更新我的問題 – zcaudate

+1

好的,是的,我已驗證這是一個問題。我認爲,這是瀏覽器REPL實現的問題,而不是ClojureScript本身。我瞭解bREPL的作者,並會與他覈對,看看他是否知道解決問題的方法,並根據此問題發佈適當的答案。同時,我建議編寫defpartial的非宏版本。這幾乎總是可能的,只是傳遞一個匿名函數而不是原始表單。它的語法更醜陋,但它起作用(除非你需要真正的短路評估,但這似乎並不是這種情況) – levand

回答

6

爲了在交互式會話期間加載宏w/bREPL,您需要首先明確評估bREPL中的ns形式。

即使如此,這有點煩人 - 一些工作已經降落在主人支持交互式宏展開,但它需要更多的工作。 W還有一些想法,通過在啓動時分析源文件來使bREPL更有用。

3

今天我用cemerick/austin:clojureScript瀏覽器-REPL檢查過,你可以在brepl中使用和評估你的宏而不受限制,也就是說在沒有明確評估bREPL中的ns形式的情況下。 我正在使用此demo-project core.async宏和自定義域宏沒有問題。