ich das Reich der Racket Buch lese, und Seite 175, ich in der Tat sehen diesen Code:Schläger: Pattern-Matching-Funktion Parameter
(struct dice-world (src board gt))
(struct game (board player moves))
(define (no-more-moves-in-world? w)
(define tree (dice-world-gt w))
(define board (dice-world-board w))
(define player (game-player tree))
player)
Die Funktion aus dem Buch gibt nicht die Spieler, aber alles bis diese Zeile wie im Buch steht. Für mich schreit dies nach der Notwendigkeit eines Mustervergleichs!
Und in der Tat, das funktioniert gut und ist deutlich lesbar und deutlich zu mir:
(define (no-more-moves+? w)
(match w
[(dice-world _ board (game _ player _)) player]))
jedoch hier noch wir überhaupt die Variable w
ohne Grund nennen. Ich möchte Mustererkennung auf die Funktionsparameter direkt zu können, wie diese (ungültige Syntax):
(define (no-more-moves2? (dice-world _ board (game _ player _)))
player)
Aus meiner bisher Googeln scheint dies unmöglich? Das klingt unglaublich für mich? Das ist wahrscheinlich durch einige Makrotricks möglich, aber ich bin wirklich überrascht, dass es nicht die Standardmethode wäre, diesen Code aus dem Buch zu schreiben. Da ich ein Anfängerbuch bin, dachte ich, dass Mustererkennung später eingeführt wird, aber ich finde es überhaupt nicht im Index?
Auch wenn die Antwort ist, dass es nicht möglich/nicht idiomatisch ist, frage ich mich, ob es das gleiche mit anderen Lisps auch ist?
Danke für das Paket! Werde es benutzen, habe es aber noch nicht getestet. Es ist mir immer noch nicht klar. Verträge sind Laufzeitprüfungen richtig? Nicht Kompilierzeit? Der Vorteil von Verträgen ist also eine bessere Laufzeit Ausnahme Fehlermeldung? Weil offensichtlich auch "no-more-moves-in-world?", Obwohl ausführlicher, eine Ausnahme auslöst, wenn Sie ihm zum Beispiel eine Zeichenfolge geben ... –
@EmmanuelTouzery Richtig. Verträge lassen Sie Garantien verschlüsseln, die verschiedene Parteien erfüllen müssen, sonst wird ein Fehler ausgelöst. Wenn Sie Typed Racket verwenden, können Sie viele dieser Garantien auch zur Kompilierungszeit überprüfen, und dieses Paket * sollte * auch mit Type Racket funktionieren, mit ähnlichen Vorteilen. –
Ich dachte nach. Ein Nachteil des Mustervergleichs besteht darin, dass es zusammenbricht, wenn Sie die Struktur ändern, z. B. ein neues Feld hinzufügen. In Lispes gibt es dafür keinen Kompilierungsfehler, und vielleicht ermutigt der Dev-Stil flüssigeres Arbeiten mit Datenstrukturen (mehr Änderungen im Verlauf der Entwicklung). Das klingt nach einem guten Grund, auch die Mustererkennung zu vermeiden. –