定义语法时的多个省略号

Fil*_*ese 3 racket

我需要为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)

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

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

Ale*_*ing 5

使用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)

  • 此外,syntax/parse 允许您使用 `...+` 来表达一个或多个 -- 将模式简化为 `(_ xs ...+ -&gt; dis ...+ &lt;- ys ...+) ` 和模板到 `#'(list dis ...)`。 (2认同)