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)