我需要为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))))
但似乎我不能把省略号放在另一个之后。
是否可以使用define-syntax来做我想要的事情?
答案 0 :(得分:4)
使用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)