Próximo: Formatação de código, Anterior: Módulos, Acima: Estilo de código [Conteúdo][Índice]
A tendência no Lisp clássico é usar listas para representar tudo e, em
seguida, pesquisá-las “à mão” usando car
, cdr
, cadr
e
co. Existem vários problemas com esse estilo, notadamente o fato de que é
difícil de ler, propenso a erros e um obstáculo para os relatórios de erros
de tipos adequados.
O código Guix deve definir tipos de dados apropriados (por exemplo, usando
define-record-type*
) em vez de listas de abuso. Além disso, ele deve
usar correspondência de padrões, por meio do módulo (ice-9 match)
do
Guile, especialmente ao corresponder listas (veja Pattern Matching em Manual de Referência do GNU Guile); a correspondência de padrões
para registros é melhor feita usando match-record
do (guix
records)
, que, diferentemente do match
, verifica nomes de campos no
momento da macroexpansão.
Ao definir um novo tipo de registro, mantenha o record type descriptor
(RTD) privado (veja Records em GNU Guile Reference Manual, para
mais informações sobre registros e RTDs). Como exemplo, o módulo (guix
packages)
define <package>
como o RTD para registros de pacote, mas
não o exporta; em vez disso, ele exporta um predicado de tipo, um construtor
e acessadores de campo. Exportar RTDs tornaria mais difícil alterar a
interface binária do aplicativo (porque o código em outros módulos pode
estar correspondendo campos por posição) e tornaria trivial para os usuários
falsificar registros desse tipo, ignorando quaisquer verificações que
possamos ter no construtor oficial (como “sanitizadores de campo”).