gpt4 book ai didi

list - 可以将宏应用于参数列表吗?

转载 作者:行者123 更新时间:2023-12-03 23:51:12 27 4
gpt4 key购买 nike

我的目标是能够以相同的方式将宏应用于参数列表,就像应用原始过程将过程应用于参数列表一样。

该列表将在应用宏时已经被评估,没有办法解决这个问题,这很好;我想知道是否有任何方法可以以编程方式将列表“拼接”到宏应用程序中(与 unquote-splicing 具有相同的意义)。困难在于不能将宏标识符作为参数传递。

一个用例是

(apply and list)

这相当于
(not (memq #f list))

看看有没有 #f在列表中。
最好这将符合 R7RS。

一种hacky方式是(如建议的 on reddit )
(eval (cons 'and list))

但这不符合 R7RS,因为 eval 必须采用环境参数,而且在我看来,该标准并未指定如何在调用 eval 时有效地抢夺环境。

另一半解决方案如下,仅当列表直接作为带括号的值序列给出时才有效:
(syntax-rules ()
((_ identifier (val ...))
(identifier val ...)))

最佳答案

我将此发布为我对自己的问题找到的部分答案,如果没有新消息出现,我会在几天后接受它。

以下有效,但前提是要应用的宏包含在库中。

(import (scheme base)
(scheme eval)
(scheme write))

(define (apply-macro mac args . libs)
(eval (cons mac args)
(apply environment libs)))

(define list '(#f #t #t #t))

(display (apply-macro 'and list '(scheme base))) ; => #f
(display (apply-macro 'and (cdr list) '(scheme base))) ; => #t

关于list - 可以将宏应用于参数列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57535922/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com