Número 34
16 de novembro de 2022

O código son datos

Os programadores en LISP teñen un principio que non cansan de repetir: o código son datos. Os demais, ás veces temos que aprendelo unha e outra vez.

Hai tempo estaba eu traballando nun programa que servía para compilar tests de integración para unha aplicación web. O usuario podía especificar o sistema operativo, o navegador, a versión do navegador e diversas variantes dese navegador, e o programa producía un test de integración compilado para esa combinación de opcións.

Non todas as combinacións de opcións posibles eran válidas: dependendo do sistema operativo que escollera o usuario, uns ou outros navegadores estaban dispoñibles; dependendo do sistema operativo e navegador, unhas ou outras versións; dependendo do sistema operativo, navegador e versión, unhas ou outras variantes estaban dispoñibles.

Plans dunha maquinaria complexa.

O programa usaba unha morea de “ifs” aniñados para determinar as opcións que eran válidas. Había un “if operating_system==Windows” e un “if browser==Chrome and variant!=sandbox” e incluso condicións máis complicadas. Cando me pediron que lle botara unha ollada para engadir máis opcións, atopei varios erros.

Foi daquela cando decidín modificar ese programa para que usara lóxica guiada por táboas. No lugar de ter todos eses “ifs” aniñados, ía ter unha táboa que tería unha caixiña con instrucións para compilar cada combinación válida de sistema operativo, navegador, versión e variante. O programa só tería que buscar na táboa a combinación que o usuario quere e, se existía a caixiña para esa combinación, usar o seu contido.

O código resultante era algo máis longo que o código orixinal, pero a cambio era moito máis doado de ler e de modificar. Para entender os “ifs” había que usar lapis e papel durante quince minutos; para entender a táboa abondaba con mirala. Facer cambios nos “ifs” era moi complicado e daba lugar a moitos erros; facer cambios na táboa era trivial.

Non era esa a única avantaxe. Agora o programa podía dicirlle ao usuario que navegadores estaban dispoñibles para cada sistema operativo, ou que versións dun navegador había para unha variante determinada. Toda esa información estaba na táboa, e o programa só a tiña que buscar. Cos “ifs”, iso non era posible sen duplicar toda a información.

Isto da lóxica guiada por táboas non é unha idea nova; levamos décadas usándoa, incluso sen nós o saber. Por exemplo, os compiladores de C compilan os “switch” como unha táboa, non como unha serie de “ifs”.

Tampouco é unha idea revolucionaria. Practicamente é unha idea obvia. O que pasa é que, as veces, os que non programamos en LISP e non andamos repetindo sempre o de “o código son datos” temos que aprendelo unha e outra vez.

A ilustración desta Folla é un fragmento dos plans da máquina analítica de Charles Babbage.