Nächste: Formatierung von Code, Vorige: Module, Nach oben: Programmierstil [Inhalt][Index]
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.
When defining a new record type, keep the record type descriptor (RTD)
private (siehe Records in GNU Guile Reference Manual, for more on
records and RTDs). As an example, the (guix packages)
module defines
<package>
as the RTD for package records but it does not export it;
instead, it exports a type predicate, a constructor, and field accessors.
Exporting RTDs would make it harder to change the application binary
interface (because code in other modules might be matching fields by
position) and would make it trivial for users to forge records of that type,
bypassing any checks we may have in the official constructor (such as
“field sanitizers”).