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_1
和 e_2
需要省略号,尽管它们已经在一个省略号之下。有没有办法将 Racket unquote 应用于 Redex 中省略号的每个成员?
这里的问题是模式变量 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 ...)))))
我正在尝试定义一个 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
需要省略号,尽管它们已经在一个省略号之下。有没有办法将 Racket unquote 应用于 Redex 中省略号的每个成员?
这里的问题是模式变量 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 ...)))))