簡體   English   中英

如何處理Clojurescript宏中所需的Clojurescript代碼?

[英]How do I deal with required Clojurescript code from Clojurescript macros?

我們假設我有一個X.clojurescript和一個X.clojure命名空間。 X.clojurescript中的所有內容都是Clojurescript代碼,X.clojure中的所有內容都是Clojure代碼。 不幸的是,我不能直接在Clojurescript中定義宏,我必須在Clojure中定義它們,然后使用它們將它們帶入Clojurescript命名空間

(ns X.clojurescript.abc
  (:require-macros [X.clojure.def :as clj]))

這可以。 但是,如果宏(在X.clojure中定義)需要引用Clojurescript命名空間(X.clojurescript)中定義的內容,該怎么辦? 問題是Clojure編譯器在解析其他命名空間時不會查看我的Clojurescript命名空間(單獨的目錄)。

我通過簡單地在我的Clojure代碼中創建一個命名空間來解決這個問題,該命名空間具有與Clojurescript中相同的命名空間和所需的定義,但這看起來有點愚蠢。 所以,例如,如果我在我的宏中需要X.clojurescript.abc.y,我將在Clojure端創建一個額外的命名空間,在我的Clojure版本的X.clojurescript.abc中定義一個虛擬y; 有點愚蠢。

我如何處理需要在Clojurescript方面引用某些內容的宏?

宏在定義時唯一需要特定命名空間的情況是宏是否使用來自所述命名空間的代碼來生成它將返回的符號列表。

你可以在repl中跟隨這些例子:

(defmacro foo
  [a]
  `(bar/bar ~a))

即使bar不是已定義的命名空間,foo的定義也會編譯

(foo :a)

調用foo現在會失敗,因為你還沒有定義bar命名空間或函數欄

(ns bar)
(defn bar
  [x]
  [x x])

在bar命名空間中定義bar

(ns user)
(foo :a)

=> [:a:a]

請注意,在foo定義時,bar不需要存在。 實際上,在foo定義時,名稱空間甚至不需要存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM