gpt4 book ai didi

racket - 定义语法时的多个省略号

转载 作者:行者123 更新时间:2023-12-01 11:17:59 24 4
gpt4 key购买 nike

我需要为 fancy-sublist 定义一个语法像这样工作的程序

> (fancy-sublist 1 2 -> 3 4 5 <- 6 7)
(3 4 5)

我尝试通过定义新语法来实现它
(define-syntax fancy-sublist
(syntax-rules (-> <-)
((_ x xs ... -> dis dis1 ... <- y ys ...)
(keep only the elements in the middle))))

但似乎我不能一个接一个地放置省略号。

是否可以使用定义语法来做我想做的事?

最佳答案

使用 the syntax/parse library而不是 syntax-rules ;它在各方面都更有能力,即使在技术上都能完成工作,它也会产生更好的错误消息。我考虑 syntax-rules Scheme 的遗留功能; syntax-parse应该真的是现代 Racket 的默认选择。它可以很好地处理您的示例:

#lang racket

(require syntax/parse/define)

(define-syntax (<- stx)
(raise-syntax-error #f "cannot be used as an expression" stx))

(define-syntax-parser fancy-sublist
#:literals [<- ->]
[(_ x xs ... -> dis dis1 ... <- y ys ...)
#'(list dis dis1 ...)])
> (fancy-sublist 1 2 -> 3 4 5 <- 6 7)
'(3 4 5)

关于racket - 定义语法时的多个省略号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48189559/

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