Next: , Previous: , Up: 代码风格   [Contents][Index]


22.9.3 数据类型和模式匹配

经典的Lisp倾向于用列表表示所有的东西,然后用carcdrcadr等手动浏览它们。这种风格有几个问题,特别是难以阅读,易出错,并且妨碍生成合适的类型错误报告。

Guix code should define appropriate data types (for instance, using define-record-type*) rather than abuse lists. In addition, it should use pattern matching, via Guile’s (ice-9 match) module, especially when matching lists (see Pattern Matching in GNU Guile Reference Manual); pattern matching for records is better done using match-record from (guix records), which, unlike match, verifies field names at macro-expansion time.

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”).