Next: , Previous: , Up: Стиль написания кода   [Contents][Index]


22.9.3 Типы данных и поиск по образцам

В классическом Lispе есть склонность к использованию списков для представления чего угодно, а затем гуляния по ним "вручную", используя car, cdr, cadr и тому подобное. Такой стиль вызывает несколько осложнений, а особенно то, что он тяжело читается, подвержен ошибкам, и мешает компилятору правильно указывать на ошибки типов.

Код Guix должен определять подходящие типы данных (пользуясь, например, define-record-type*) вместо злоупотребления списками. Кроме того, он должен использовать поиск по образцам с помощью модуля Guile (ice-9 match), особенно для поиска по образцам в списках (see Pattern Matching in GNU Guile Reference Manual); для поиска по образцам в записях лучше использовать match-record из (guix records), который, в отличие от match, проверяет названия полей во время расширения макросов.

When defining a new record type, keep the record type descriptor (RTD) private (see 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”).