我正在努力定义一种具有强制类型和子类型的语言,如下所示:
(define-language base
(t ::= int any)
(e ::= number (cast t e))
#| stuff ... |#)
然后我在其上定义以下判断表:
(define-judgment-form base
#:mode (<: I I)
#:contract (<: t t)
[------
(<: t t)]
[------
(<: int any)])
现在,在我的缩减关系中,我想写类似
的东西(define b-> (reduction-relation base
(--> (cast t v)
v
(where-judgment-holds (<: (typeof v) t)))))
我们假设(typeof v)
返回值v
的类型。据我所知,Redex库中没有像where-judgment-holds
这样的东西,虽然我可以使用unquote解决它,但如果Redex中内置了一些东西会很好。
答案 0 :(得分:3)
您实际需要的内容名为judgment-holds
,它可以在您的示例中使用where-judgment-holds
的确切位置:
(define b-> (reduction-relation base
(--> (cast t v)
v
(judgment-holds (<: (typeof v) t)))))