在redex术语中的省略号

时间:2016-01-22 19:40:33

标签: racket plt-redex

我试图定义一个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需要省略号,尽管它们已经低于一个省略号。有没有办法在Redex中对省略号的每个成员应用Racket unquote?

1 个答案:

答案 0 :(得分:2)

这里的问题是,您通过非引号(e_1)将模式变量e_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 ...)))))