Nächste: , Vorige: , Nach oben: Programmierstil   [Inhalt][Index]


22.7.3 Datentypen und Mustervergleich

Im klassischen Lisp gibt es die Tendenz, Listen zur Darstellung von allem zu benutzen, und diese dann „händisch“ zu durchlaufen mit car, cdr, cadr und so weiter. Dieser Stil ist aus verschiedenen Gründen problematisch, insbesondere wegen der Tatsache, dass er schwer zu lesen, schnell fehlerbehaftet und ein Hindernis beim Melden von Typfehlern ist.

Guix-Code sollte angemessene Datentypen definieren (zum Beispiel mit define-record-type*), statt Listen zu missbrauchen. Außerdem sollte er das (ice-9 match)-Modul von Guile zum Mustervergleich benutzen, besonders mit Listen (siehe Pattern Matching in Referenzhandbuch zu GNU Guile), während bei Verbundstypen match-record aus dem Modul (guix records) angemessener ist, womit, anders als bei match, bereits bei der Makroumschreibung sichergestellt wird, dass die Feldnamen richtig sind.

Wenn Sie einen neuen Verbundstyp definieren, sollten Sie den Deskriptor des Verbundstyps (RTD (Record Type Descriptor)) privat stellen (siehe Records in Referenzhandbuch zu GNU Guile, für nähere Informationen zu Verbundstypen und RTDs). Zum Beispiel wird durch das Modul (guix packages) der RTD <package> für den package-Verbundstyp definiert, aber nicht exportiert. Stattdessen werden ein Typprädikat, ein Konstruktor und Prozeduren zum Zugriff auf die Felder exportiert. Wenn der RTD exportiert würde, könnte man die Binärschnittstelle (ABI (Application Binary Interface)) schwer ändern (weil der Code anderer Module mit match passende Felder anhand deren Position abgleichen könnte) und es würde Nutzer verleiten, Verbundsobjekte dieses Typs falsch zu erzeugen, ohne dass die Überprüfungen im offiziellen Konstruktur laufen können (etwa „Feldsanitisierer“).