Macros 在宏中取消引用等效接头
我有计划的实施,现在我正在测试宏。我的宏Macros 在宏中取消引用等效接头,macros,scheme,r5rs,Macros,Scheme,R5rs,我有计划的实施,现在我正在测试宏。我的宏-->的工作方式如下: (--> document (querySelector "body")) 这将调用JavaScript document.querySelector("body") 我想创建一个宏,它将创建一个调用对象方法的宏。因此,如果我使用: (define-method document querySelector) 它将创建以下功能: (define-macro (querySelector . args) `(-->
-->
的工作方式如下:
(--> document (querySelector "body"))
这将调用JavaScript
document.querySelector("body")
我想创建一个宏,它将创建一个调用对象方法的宏。因此,如果我使用:
(define-method document querySelector)
它将创建以下功能:
(define-macro (querySelector . args)
`(--> document (querySelector ,@args))
这在Lisp宏中很容易,因为我有,@来拼接参数。例如:
(define-macro (define-method object method)
(let ((args (gensym)))
`(define-macro (,method . ,args)
`(--> ,',object (,',method ,@,args)))))
这一点可以通过测试
下面是CommonLisp中的简单宏,它生成显示文本的宏(我在Clisp中的测试宏)
这只是我正在测试的,,
用法的示例。它会创建打印“xxx”的无用宏
我认为要解决这个问题,我需要创建一个宏来创建宏
(define-syntax define-method
(syntax-rules ()
((_ obj method)
(define-syntax method
(syntax-rules ()
???)))))
问题是我可以创建函数,因为我不能对对象使用apply to call方法,它需要是函数调用。我也无法修改-->
宏以允许使用apply,因为可能有人想在对象上调用方法apply,例如
(--> fn (apply null '(1 2 3))
工作示例:
(--> display (apply (current-environment) '#((1 2 3))))
它正在调用函数.prototype.apply
和环境以及单个元素列表的数组/向量。与(display'(1 2 3))相同
为了100%解决方案问题,我可以考虑这样的情况:我有一个宏,它接受可变数量的参数,我想创建一个宏,它将为该宏创建包装器
例如:我有宏(foo name.args)
,我想创建宏make foo,它将创建调用foo的宏。(make foo get name)应创建宏(get name.args)
,该宏将扩展为(foo'get name.args)
。而foo的定义如下:
(define-syntax foo
(syntax-rules ()
((_ args ...)
(display '(args ...)))))
(define-syntax make-foo
(syntax-rules ()
((_ name)
(define-syntax name
(syntax-rules ()
((_ args ...)
(foo name args ...)))))))
(make-foo hello)
(hello 1 2 3)
如果我想创建一个名为foo hello
的宏,如果我通过hello
,该怎么办。使用语法规则
,是否可以执行类似的操作?或者我需要使用lisp宏或语法大小写。如果可能的话,我更喜欢R5RS代码
我还尝试创建具有可变参数数的函数,并创建将生成具有相同参数的函数的宏:
(define (bar . args)
(for-each display args))
(define-syntax caller
(syntax-rules ()
((_ method)
(define (method . args)
(bar . args)))))
(caller foo)
(foo 1 2 3)
但这不起作用,用Kawa an Guile测试。在宏定义宏中处理省略号可能有帮助的一件事是“省略号引用”或“自定义省略号”。我不确定它们是否在R5RS中,但我知道省略号引用在R7RS和Kawa中,自定义省略号在Kawa和Guile中。省略号引号是(…)
,自定义省略号是(语法规则ddd())
。对于定义宏(生成的内部宏使用ellipses@AlexKnauth它们在中,但我的问题主要是关于拼接,而不是定义宏的宏。另外,我定义宏的宏不使用省略号。@AlexKnauth你说得对,我可以用Guile创建宏定义宏,并使用省略号别名。
(define (bar . args)
(for-each display args))
(define-syntax caller
(syntax-rules ()
((_ method)
(define (method . args)
(bar . args)))))
(caller foo)
(foo 1 2 3)