gpt4 book ai didi

racket - 是否可以更改语法类的结果?

转载 作者:行者123 更新时间:2023-12-01 13:15:42 25 4
gpt4 key购买 nike

我目前有一堆用于生成代码的拼接语法类。
它们看起来像这样:

(define-splicing-syntax-class vec-exp
(pattern (~seq x y)
#:with result #'(vec x y)))

目标是能够在任何地方匹配序列 x y 并将其替换为 (vec xy)

目前我看到的唯一方法是创建一个名为 result 的属性并使用它:

> (syntax-parse #'(position 4.2 5.7)
[(<name> <pos>:vec-exp)
(attribute <pos>.result)])
#'(vec 4.2 5.7)

有没有办法更改我的代码,以便我可以通过编写以下内容获得相同的结果?

> (syntax-parse #'(position 4.2 5.7)
[(<name> <pos>:vec-exp)
(attribute <pos>)])
#'(4.2 5.7) ;; not what I want

最佳答案

FWIW,你可以做到这一点。不确定您是否可以接受。

(require syntax/parse
(for-syntax syntax/parse))

(define-splicing-syntax-class vec-exp
(pattern (~seq x y) #:with result #'(vec x y)))

(define-syntax ~res
(pattern-expander
(syntax-parser
[(_ pat cls)
#'(~and (~var PAT cls) (~bind [pat (attribute PAT.result)]))])))

然后:

> (syntax-parse #'(position 4.2 5.7)
[(<name> (~res <pos> vec-exp))
(attribute <pos>)])
#'(vec 4.2 5.7)

关于racket - 是否可以更改语法类的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55380849/

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