Eine übliche Art Semantik definieren ist (zum Beispiel):Redex passt nicht
return v if [some other condition]
otherwise, return error
Betrachten wir zum Beispiel
(define-language simple-dispatch
(e ::= v (+ e e))
(v ::= number string)
(res ::= e err)
(E ::= hole (+ E e) (+ v E)))
Wir könnten dann
(define s-> (reduction-relation simple-dispatch
#:domain res
(--> (in-hole E (+ number_1 number_2))
(in-hole E ,(+ number_1 number_2)))
(--> (in-hole E (+ any any))
err)))
die Reduktion Beziehung definieren
Dies ist der natürliche Weg, dies zu tun, da es nicht erforderlich ist, individuelle Matcher für jeden der 3 Fehlerfälle zu schreiben (num String, String Nummer, String String). Allerdings schafft es dann das Problem, dass es wie folgt ausgeführt werden:
(apply-reduction-relation s-> (term (+ 2 2)))
Shows (richtig), dass es Sie beide können auf einen Fehler reduzieren oder auf die Zahl 4. Gibt es eine Möglichkeit, eine „Ausnahme“ Muster zu machen das vermeidet es, alle konstituierenden Fälle zu überprüfen?
Wh ... was ... whoa ... Ich ... dachte, ich wüsste Racket, aber ... das ist etwas [Agda] (https://github.com/agda/agda)/Prolog Zeug richtig Hier. :O – cat