Reduction-relation 的 in-hole 可能以多种不同的方式匹配一个 hole
Reduction-relation's in-hole may match a hole many different ways
我有一种用 PLT-Redex 定义的语言,它具有(动态)mixin 类型。表达式如下所示:
; terms / expressions
(e ::= x
(lkp e f)
(call e m e ...)
(new C e ... ⊕ (e R e ...) ...)
(bind x ... with (e R e ...) ... from y ... e))
; values
(v ::= (new C v ... ⊕ (v R v ...) ...))
语言评估完成w.r.t。评估上下文和缩减关系。
; evaluation contexts
(E ::= hole
(lkp E f) ; CR-FIELD
(call E m e ...) ; CR-INVK
(call v m v ... E e ...) ; CR-INVK-ARG
;(new C v ... E e ... ⊕ (e R e ...) ...)
;(new C v ... ⊕ (E R e ...) ...)
;(new C v ... ⊕ (v R v ... E e ...) ...)
(bind x ... with (E R e ...) ... from y ... e)
(bind x ... with (v R v ... E e ...) ... from y ... e))
我的缩减关系目前仅针对字段访问定义 (lkp
),它会将对混合宏的查找减少到它的值。
(define red
(reduction-relation
fej
#:domain (e CT)
;R-FIELD
(--> ((in-hole E (lkp (new C v_0 ... ⊕ (v_1 R v_2 ...) ...) f_i)) CT)
((in-hole E v_i) CT)
"(R-FIELD)"
(where v_i (fvalue CT f_i (new C v_0 ... ⊕ (v_1 R v_2 ...) ...))))
))
我对我的元函数 (fvalue
) 进行了测试,以验证它们是否有效。然而,redex 告诉我,我的归约关系以许多不同的方式映射到一个洞。我是否评论 new C ...
的不同版本的评估上下文并不重要。错误来自 this place.
reduction-relation: in-hole's first argument is expected to match exactly one hole, but it may match a hole many different way
如何调试(或修复)问题?通常,我使用 Emacs 和 Racket 模式或使用 DrRacket 进行开发。问题是在使用 Macro Stepper 时,错误会从一个步骤抛到另一个步骤。如果我能看到它捕获的漏洞甚至了解它失败的地方,那就太好了。所以我也许明白为什么它会完全失败。
如果我使用以下上下文定义定义语言(为简单起见,我将使用类似 λ
的语言),我会得到同样的错误:
(E hole
(E e ...)
(v E ...)) ;; <-- problem
这意味着,例如,以下是 E
上下文:
((lambda (x y) x) hole hole)
但是 (IIUC) Redex(或者至少 reduction-relation
)不允许有多个漏洞的上下文,所以它会抱怨。
您的代码中的问题似乎出现在 E
的最后两个产品中,其中 E
出现在后跟省略号的模式中。 (其中一个被注释掉的 E
作品有同样的问题。)
我有一种用 PLT-Redex 定义的语言,它具有(动态)mixin 类型。表达式如下所示:
; terms / expressions
(e ::= x
(lkp e f)
(call e m e ...)
(new C e ... ⊕ (e R e ...) ...)
(bind x ... with (e R e ...) ... from y ... e))
; values
(v ::= (new C v ... ⊕ (v R v ...) ...))
语言评估完成w.r.t。评估上下文和缩减关系。
; evaluation contexts
(E ::= hole
(lkp E f) ; CR-FIELD
(call E m e ...) ; CR-INVK
(call v m v ... E e ...) ; CR-INVK-ARG
;(new C v ... E e ... ⊕ (e R e ...) ...)
;(new C v ... ⊕ (E R e ...) ...)
;(new C v ... ⊕ (v R v ... E e ...) ...)
(bind x ... with (E R e ...) ... from y ... e)
(bind x ... with (v R v ... E e ...) ... from y ... e))
我的缩减关系目前仅针对字段访问定义 (lkp
),它会将对混合宏的查找减少到它的值。
(define red
(reduction-relation
fej
#:domain (e CT)
;R-FIELD
(--> ((in-hole E (lkp (new C v_0 ... ⊕ (v_1 R v_2 ...) ...) f_i)) CT)
((in-hole E v_i) CT)
"(R-FIELD)"
(where v_i (fvalue CT f_i (new C v_0 ... ⊕ (v_1 R v_2 ...) ...))))
))
我对我的元函数 (fvalue
) 进行了测试,以验证它们是否有效。然而,redex 告诉我,我的归约关系以许多不同的方式映射到一个洞。我是否评论 new C ...
的不同版本的评估上下文并不重要。错误来自 this place.
reduction-relation: in-hole's first argument is expected to match exactly one hole, but it may match a hole many different way
如何调试(或修复)问题?通常,我使用 Emacs 和 Racket 模式或使用 DrRacket 进行开发。问题是在使用 Macro Stepper 时,错误会从一个步骤抛到另一个步骤。如果我能看到它捕获的漏洞甚至了解它失败的地方,那就太好了。所以我也许明白为什么它会完全失败。
如果我使用以下上下文定义定义语言(为简单起见,我将使用类似 λ
的语言),我会得到同样的错误:
(E hole
(E e ...)
(v E ...)) ;; <-- problem
这意味着,例如,以下是 E
上下文:
((lambda (x y) x) hole hole)
但是 (IIUC) Redex(或者至少 reduction-relation
)不允许有多个漏洞的上下文,所以它会抱怨。
您的代码中的问题似乎出现在 E
的最后两个产品中,其中 E
出现在后跟省略号的模式中。 (其中一个被注释掉的 E
作品有同样的问题。)