定义语法时有多个省略号

时间:2018-01-10 14:25:15

标签: racket

我需要为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来做我想要的事情?

1 个答案:

答案 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)