【发布时间】:2020-12-05 18:58:38
【问题描述】:
我正在尝试编写一个宏,它可以递归地将列表的值“解包”为单个值。例如,unwrap '(1 2 3)) 会(分别)产生:
(car '(1 2 3)) ; 1
(car (cdr '(1 2 3)) ; 2
(car (cdr (cdr '(1 2 3)) ; 3
这将像(+ (unwrap '(1 2 3))) ==> (+ 1 2 3) 一样使用。 (我知道你可以使用标准库申请,但我正在尝试编写自己的版本)。
我的问题是在编写宏时,我不知道如何递归处理传递给 unwrap 宏的列表参数。这是我尝试过的:
(define-syntax (unwrap stx)
(syntax-case stx ()
[(_ lst)
#`(begin (car lst) ; error at the last step since (car '()) is invalid
(unwrap (cdr lst)))]))
或
(define-syntax (unwrap stx)
(syntax-case stx ()
[(_ lst)
#`(if (null? lst)
'()
(car (unwrap (cdr lst))))])) ; infinite loops
这些显然都是错误的,但基本上我不知道编写一个宏来检查输入列表的值(或与空列表模式匹配)并在任何一种情况下返回不同的东西。我也有可能完全错误地接近这个,所以任何帮助将不胜感激。谢谢!
【问题讨论】:
标签: recursion macros scheme racket