gpt4 book ai didi

racket - 我什么时候应该使用 syntax/loc 而不是 #' (又名语法)?

转载 作者:行者123 更新时间:2023-12-04 15:02:10 24 4
gpt4 key购买 nike

syntax/loc 都可以构造一个新的语法对象。和 syntax (也写成 #')。

我什么时候应该使用 syntax/loc ?

最佳答案

使用#' (即 syntax )当您不构造新语法对象时,就像您只是引用与 syntax-case 绑定(bind)的模式变量一样或 with-syntax .

使用#'用于 (syntax->list #'(id ...)) 中的临时语法对象.

使用#'对于表示您知道不会有语法错误的形式的语法对象,或者其中的语法错误是您的宏实现的错误,而不是您的宏的使用。

使用syntax/loc当您构造可能由于宏使用不正确而可能包含语法错误的表达式时。

让我们考虑一个具体的例子:

表格display-let应该像正常工作一样 let ,除了它在评估正文之前显示绑定(bind)的值。

这是第一个实现:

(define-syntax (display-let-1 stx)
(syntax-case stx ()
[(_ ([id expr] ...) body ...)
#'((lambda (id ...)
(displayln (format "~a is bound to ~a" 'id id)) ...
body ...)
expr ...)]))

以下是正确使用宏的示例:
> (display-let-1 ([x 1] [y 2]) (+ x y))
x is bound to 1
y is bound to 2
3

现在让我们看看当宏使用不正确时会发生什么:
> (display-let-1 ())
lambda: bad syntax in: (lambda ())

这种用法不正确,因为使用了 let必须始终有一个非空的主体。除了打印错误消息外,DrRacket 将此代码涂成红色:
(lambda (id ...) 
(displayln (format "~a is bound to ~a" 'id id)) ...
body ...)

虽然 lambda 是正确的宏构造的表达式不正确, (lambda ())是不合法的,不是因为宏出错,而是因为宏使用不正确。

重定向责备围绕构造的 lambda syntax/loc 的表达式并使用 syntax/loc 的第一个参数作为着色红色的地方。
(define-syntax (display-let-2 stx)
(syntax-case stx ()
[(display-let ([id expr] ...) body ...)
#`(#,(syntax/loc stx (lambda (id ...) body ...)) expr ...)]))

> (display-let-2 ())
display-let-2: bad syntax in: (display-let-2 ())

这次是 (display-let-2 ())在repl中输入的颜色为红色,并且提到的错误消息 display-let-2而不是 lambda .

关于racket - 我什么时候应该使用 syntax/loc 而不是 #' (又名语法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10862665/

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