У меня есть язык, определенный с помощью PLT-Redex, который имеет (динамика c) смешанные типы. Выражения выглядят следующим образом:
; 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 ...) ...))
Оценка языка выполняется с помощью контекстов оценки и редукционных отношений.
; 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
), где он уменьшает поиск в mixin до его значения.
(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 ...
. Ошибка происходит из этого места .
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 ошибка переходит от одного шага к другому. Было бы хорошо, если бы я мог видеть дыры, которые он захватывает, чтобы даже понять, где это терпит неудачу. Так что, может быть, я понимаю, почему это именно так.