首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理Clojurescript宏中所需的Clojurescript代码?

如何处理Clojurescript宏中所需的Clojurescript代码?
EN

Stack Overflow用户
提问于 2013-02-09 05:47:55
回答 1查看 1.3K关注 0票数 11

假设我有一个X.clojurescript和一个X.clojure名称空间。X.clojurescript中的一切都是Clojure代码,X.clojure中的一切都是Clojure代码。不幸的是,我不能直接在Clojurescript中定义宏,我必须在Clojure中定义它们,然后使用

代码语言:javascript
复制
(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端引用某些内容的宏?

EN

回答 1

Stack Overflow用户

发布于 2013-05-13 21:56:05

宏在定义时需要特定命名空间的唯一时间是宏正使用来自所述命名空间的代码来生成它将返回的符号的列表。

您可以按照repl中的示例进行操作:

代码语言:javascript
复制
(defmacro foo
  [a]
  `(bar/bar ~a))

即使bar不是已定义的命名空间,foo的定义也会进行编译

代码语言:javascript
复制
(foo :a)

调用foo现在将失败,因为您还没有定义bar名称空间或函数bar

代码语言:javascript
复制
(ns bar)
(defn bar
  [x]
  [x x])

在bar命名空间中定义bar

代码语言:javascript
复制
(ns user)
(foo :a)

=> :a :a

请注意,在foo定义时,bar不需要存在。事实上,在foo定义时,名称空间甚至不需要存在。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14781868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档