gpt4 book ai didi

macros - 在 Racket 中使用语法参数

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

为了简洁起见,我正在尝试定义一个生成匿名函数的宏,该函数采用一个名为它的参数,而不是

(λ (it) body)
我会写
(λλ 体)

(换句话说,(λλ body) 转换为 (λ (it) body))

(define-syntax-parameter it #f)
(define-syntax λλ
(syntax-rules ()
((_ body)
(λ (x) (syntax-parameterize ((it x)) body)))))
(λλ (< it 0)) ; For testing

我得到 operators.rkt:13:28: ?: literal data is not allowed;没有 #%datum 语法转换器绑定(bind)在转换器环境中:#f at (define-syntax-parameter if#f),但据我所知,这正是就像 racket 文档中给出的关于如何使用 define-syntax-parameter 的例子。我可以通过用一个函数替换 #f 来抑制错误(我使用了 member,但不是出于任何真正的原因),但在这样做之后,我得到了 operators .rkt:17:38: x: 在上下文之外使用的标识符:x。我做错了什么?

最佳答案

您遗漏了 example 中的 syntax-id-rules 部分.它是指定 it 应扩展为 x 的部分。或者,您可以使用 make-rename-transformer :

#lang racket
(require racket/stxparam)

(define-syntax-parameter it #f)
(define-syntax λλ
(syntax-rules ()
((_ body)
(λ (x) (syntax-parameterize ([it (make-rename-transformer #'x)]) body)))))
((λλ (< it 0)) 5)
((λλ (< it 0)) -5)

=>

#f
#t

关于macros - 在 Racket 中使用语法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18900565/

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