gpt4 book ai didi

macros - Racket /方案 - 语法案例

转载 作者:行者123 更新时间:2023-12-01 02:21:19 25 4
gpt4 key购买 nike

我目前正在研究 Racket 宏的分配。在其中一个问题中,我们被要求定义一个宏 my-set!它的作用是这样的:

(define x 3)
(define y 5)
(define z 7)
(my-set! (x (+ x y)))
(my-set! (x (+ x y)) (z 6))
x
13
y
5
z
6

我在语法案例 http://www.cs.indiana.edu/~dyb/pubs/tr356.pdf 上发现了这个有趣的文档

目前我的宏可以工作,但我正在尝试添加一个“挡泥板”,比如 第10页的文档来抵御错误,例如变量之一不是标识符或其他任何东西。

这是我的代码:
(define-syntax my-set!
(letrec ((all-ids?
(λ (ls)
(or (null? ls)
(and (identifier? (car ls))
(all-ids? (cdr ls)))))))
(lambda (x)
(syntax-case x ()
((_ (var val) (var2 val2) (var3 val3) ...)
(all-ids? (syntax (var var2 var3 ...)))
(syntax (begin (set! var val) (my-set! (var2 val2) (var3 val3) ...))))
((_ (var val))
(syntax (set! var val)))))))

如果我在没有挡泥板的情况下测试这个确切的代码,它会完美运行。但是当我运行这个时:
(define a 1)
(define b 1)
(define c 1)

(my-set! (a 3) (b 4) (c 5))

我明白了:

car: contract violation expected: pair?
given: syntax:C:\Users\mgiroux\Desktop\define-myset.rkt:40:26 (a b c)



好像全是id? cant (car) of (a b c) 导致它不是一个列表?我尝试将它作为列表传递,但也不起作用,我似乎完全按照他们在我链接的 pdf 中的方式进行复制。我在这里错过了什么?

最佳答案

#'(var var2 var3 ...)确实不是一个列表。它是一个包装列表的语法对象。您应该使用 syntax->list将项目提取到列表中,因此您的守卫应如下所示:

(all-ids? (syntax->list #'(var var2 var3 ...)))

关于macros - Racket /方案 - 语法案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20304632/

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