gpt4 book ai didi

macros - 在 Chicken Scheme 中扩展宏时出错

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:23 26 4
gpt4 key购买 nike

我正在学习 Scheme 中的宏系统是如何工作的,我正在努力让我的代码看起来更像 JavaScript。所以我想我会从 function 宏开始。这就是我希望函数定义的样子:

(function id (x) x)

它应该扩展为以下内容:

(define (id x) x)

所以我写了一个宏如下:

(define-syntax function
(lambda (name args . body)
`(define (,name ,@args) ,@body)))

但是当我使用它时出现以下错误(在 Chicken Scheme 中):

Error: during expansion of (define ...) - in `define' - lambda-list expected: (define ((function id (x) x) . #<procedure (rename sym1348)>) #<procedure (compare s11400 s21401)>)

Call history:

<syntax> (function id (x) x)
<eval> (##sys#cons (##core#quote define) (##sys#cons (##sys#cons name args) body))
<eval> (##sys#cons (##sys#cons name args) body)
<eval> (##sys#cons name args) <--

我哪里错了?此外,如何阅读此类错误消息以便能够自己调试程序?

最佳答案

在 Scheme 中,使用 syntax-rules():

(define-syntax function
(syntax-rules ()
((function name (args ...) body ...)
(define (name args ...) body ...))))

您看到的错误显然是 Chicken Scheme 的编译器期望 define-syntax 的第二种形式是宏扩展过程——它们通常需要参数来重命名和比较标识符。宏中的 lambda 没有产生合适的函数 - syntax-rules 可以。

以上保证卫生。

关于macros - 在 Chicken Scheme 中扩展宏时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15997947/

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