Ein weiteres wichtiges Detail noch nicht erwähnt: transparent (und normal) structs generative sind. Das heißt, wenn Sie dieselbe Struktur zweimal definieren, sind Werte, die mit der ersten Instanz der Strukturdefinition erstellt wurden, nicht equal?
für Werte, die mit der zweiten Definition erstellt wurden. Sie können selbst in einer REPL Sitzung sehen:
> (struct posn (x y) #:transparent)
> (define origin1 (posn 0 0))
> (struct posn (x y) #:transparent)
> (define origin2 (posn 0 0))
> (equal? origin1 origin2)
#f
Trotz der gleiche Definition zu sein und mit dem gleichen Inhalt, die beiden Instanzen sind nicht equal?
. Obwohl die Strukturen transparent sind, werden sie als separate Definitionen aus dem Grund betrachtet, Leif Anderson wies darauf hin, nur die Verwendung von #: transparent erfordert immer noch, dass die einzige Möglichkeit, die Struktur mit dem Konstruktor zu erstellen die Strukturform definiert. Zwei Definitionen bedeuten zwei verschiedene Konstruktoren.
Mit vorgefertigten Strukturen, diese Beschränkung geht weg - Sie können vorfabrizieren Strukturen selbst erstellen, indem Sie nur die Leserform von ihnen wie #s(posn 0 0)
schreiben. Es gibt keinen Grund mehr, alle Instanzen der Struktur erfordern mit ihren definierten Konstruktor erstellt werden und somit keinen Grund, zwei unterschiedliche, aber identische Struktur Definitionen würde erkennen einander nicht:
> (struct posn (x y) #:prefab)
> (define origin1 (posn 0 0))
> (struct posn (x y) #:prefab)
> (define origin2 (posn 0 0))
> (equal? origin1 origin2)
#t
> (equal? origin1 #s(posn 0 0))
#t
Ich bin der Meinung, dass structs Das bedeutet, dass nur einige der zusammengefassten Rohdaten vorgefertigt sein sollten, um eine einfache, sichere Serialisierung zu erhalten. Strukturen, die Beschränkungen für ihre Konstruktion aufweisen, sollten transparent sein. Strukturen, die ein Verhalten kapseln und Informationen verbergen, sollten weder transparent noch transparent sein Fertig Dies sind nur Richtlinien, jedoch kann Ihre Laufleistung variieren.
Zusätzlich zu "exotischen" reflektiven Ops funktioniert eine sehr einfache Sache nur mit '#: transparent'' struct's - 'equal?'. Gegeben '(struct x (y))' '(gleich? (X 1) (x 1))' ist '# f'! Es ist nur '# t' mit' #: transparent'. –
In gewisser Hinsicht ist "#: transparent" die "warme Schale mit Brei" zwischen opak und vorgefertigt. Im Nachhinein sollte es der Standard sein, mit '#: opaque' und' #: prefab' Modifikatoren, IMHO. –
Diese Antwort sollte wahrscheinlich [Link zu den Dokumenten] (http://docs.racket-lang.org/guide/define-struct.html?q=prefab#%28tech._prefab%29), woher der Text stammt. – stchang