我需要为fancy-sublist像这样工作的过程定义一个语法
> (fancy-sublist 1 2 -> 3 4 5 <- 6 7)
(3 4 5)
Run Code Online (Sandbox Code Playgroud)
我尝试通过定义新语法来实现它
(define-syntax fancy-sublist
(syntax-rules (-> <-)
((_ x xs ... -> dis dis1 ... <- y ys ...)
(keep only the elements in the middle))))
Run Code Online (Sandbox Code Playgroud)
但似乎我不能一个接一个地放置省略号。
是否可以使用定义语法来做我想做的事?
使用该syntax/parse库的替代syntax-rules; 它在各个方面都更有能力,即使在技术上都可以完成工作时,它也会产生更好的错误消息。我考虑syntax-rules了 Scheme 的一个遗留特性;syntax-parse应该真的是现代球拍的默认选择。它可以很好地处理您的示例:
#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 ...)])
Run Code Online (Sandbox Code Playgroud)
> (fancy-sublist 1 2 -> 3 4 5 <- 6 7)
'(3 4 5)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |