Macros Clojure宏不';它旁边不需要空间

Macros Clojure宏不';它旁边不需要空间,macros,clojure,lisp,Macros,Clojure,Lisp,尝试创建Haskell lambda语法的宏形式,我非常接近,除了最后一个调整,/(应该是a\,但不能抱怨…)需要在它旁边留一个空格,有没有办法使我的宏在它和它的第一个参数之间不需要空格 例如: (减少(/xy->xy)[1 2 3]) 而不是: (减少(/xy->xy)[1 2 3]) 我怀疑这是不可能的,但唯一确定的方法是询问知道的人,那么单词是什么?不。宏无法更改语言的词汇语法。这需要读宏,而Clojure没有读宏。没有,但是如果您想做一些更雄心勃勃的事情,可以使用haskell lamb

尝试创建Haskell lambda语法的宏形式,我非常接近,除了最后一个调整,/(应该是a\,但不能抱怨…)需要在它旁边留一个空格,有没有办法使我的宏在它和它的第一个参数之间不需要空格

例如:

(减少(/xy->xy)[1 2 3])

而不是:

(减少(/xy->xy)[1 2 3])


我怀疑这是不可能的,但唯一确定的方法是询问知道的人,那么单词是什么?

不。宏无法更改语言的词汇语法。这需要读宏,而Clojure没有读宏。

没有,但是如果您想做一些更雄心勃勃的事情,可以使用haskell lambdas定义另一个宏
,将整个名称空间封装在其中。该宏可以查看它下面的所有表单,例如使用tree seq,找到表单的符号
/x
,并用
/x
替换它们

这能做到吗?在你逃避clojure不支持的东西之前,回答者是完全可行的,并且不涉及对语言表面语法的任何更改。让宏在扩展时回显其主体,并应用某些调整(例如,用其他值替换某些形式的符号)。不过,在Clojure中,
/foo
不是有效的符号,所以这仍然不起作用。另一方面,您可以尝试使用实际的λ字符。如果您禁止它的所有其他用途,那么这实际上是相当简单的(元数据等方面的复杂性是可以管理的)。禁止λ字符的其他用途(至少作为符号名称中的第一个字符)是很重要的,因为如果您不愿意这样做,您必须能够确定是否应该替换以它开头的给定符号,这在一组开放的特殊构造(宏)中是不可能的。忘了添加宏必须返回单个表单,但在Clojure中,顶级
do
表单的处理方式就像它们的主体在该点被拼接到代码流中一样,因此在顶级宏确实可以有效地回显其主体(或者更确切地说是对它的调用体,意思是它的参数表达式;这是通过返回
(do~@body)
来实现的;您可以使用类似
(do~@(transform body))
(let[new body(transform body)]`(do~@new body))
的方法来应用转换)@Jimmyhoff是的,这是可能的。我的答案假定您需要本地转换。如果您对使用代码遍历宏表单包装代码没问题,您可以这样做。稍微澄清一下,Clojure确实有reader宏(
#(…)
是示例),但与其他Lisp不同,它不允许您自己创建。