Próximo: , Anterior: , Acima: Estilo de código   [Conteúdo][Índice]


22.9.3 Tipos de dados e correspondência de padrão

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