我很难遵循一些 GNU guile 手册关于宏的文档(https://www.gnu.org/software/guile/manual/guile.pdf):
在第 6.10.2.1 节(关于模式的第 259 页)中,有一节讨论了不正确的列表如何像省略号关键字一样匹配:
(define-syntax let1
(syntax-rules ()
((_ (var val) . exps)
(let ((var val)) . exps))))
exps
然后说这是不可取的,因为像 in 这样的非列表(let (foo 'bar) . baz))
将被匹配。但是,我无法扩展该表达式。但是,以下表达式确实会扩展:
(let1 (foo 'bar) . (baz))
→(let (foo 'bar) baz)
(let1 (foo 'bar) baz)
→(let (foo 'bar) baz)
同样在下面讨论改进:
(define-syntax let1
(syntax-rules ()
((_ (var val) exp ...)
(let ((var val)) exp ...))))
它声明(let1 (foo 'bar))
将被匹配,我再次无法匹配。不过,我可以做到这一点:
(let1 (foo 'bar) baz)
→(let (foo 'bar) baz)
在进一步将我的头撞到墙上之前,如果有人能澄清不正确和省略模式匹配是如何工作的(以及文档中是否有错字,或者我的 Guile 安装/宏扩展方法有问题?),那就太好了。我正在使用 Guile 2.0.9(文档在 2.0.11 上,但不会认为这很重要),并且我正在使用Geiser以及本指南进行宏扩展(结果没有区别):
ice-9/psyntax.scm:1101:54: In procedure expand-top-sequence:
ice-9/psyntax.scm:1101:54: Syntax error:
unknown location: let: bad let in form (let ((foo (quote bar))))
In ice-9/psyntax.scm:
1101:54 0 (expand-top-sequence ((let2 (foo (quote bar)))) () ((top)) ...)
谢谢!此外,如果有人可以推荐任何其他好的、不太简洁的关于 Scheme(最好是在 Guile 中)宏的资源,那也很棒!