redex 术语中取消引号的省略号

Ellipsis over unquote in redex term

我正在尝试定义一个 Redex 元函数,将成对列表转换为单个数字列表,如下所示:

#lang racket
(require redex)

(define-language L
   (e n ((n n) ...) (n ...))
   (n number))

(define-metafunction L
   ((add-up n) n)
   ((add-up ((e_1 e_2) ...)) (,(+ (term e_1) (term e_2)) ...)))

但是,add-up 的最后一个定义未被接受 - Redex 抱怨 e_1e_2 需要省略号,尽管它们已经在一个省略号之下。有没有办法将 Racket unquote 应用于 Redex 中省略号的每个成员?

这里的问题是模式变量 e_1e_2 通过反引号 (,) 与省略号 ... 分开。 Redex 模式匹配器不够聪明,无法查看不引号,因为您可以在那里放置任意 Racket。

然而,您可以做的是使用 Racket 结构(在本例中特别是 map)来计算您的数字。表达式将如下所示:

,(map + (term (e_1 ...)) (term (e_2 ...)))

或者把它们放在一起:

#lang racket
(require redex)

(define-language L
   (e n ((n n) ...) (n ...))
   (n number))

(define-metafunction L
   ((add-up n) n)
   ((add-up ((e_1 e_2) ...)) ,(map + (term (e_1 ...)) (term (e_2 ...)))))