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