No estoy familiarizado con el trabajo reciente de Barry Jay, pero su trabajo anterior incluye cosas que no puedes hacer en Lisp, porque los tipos dan información adicional.
Por ejemplo, suponga que desea definir el tamaño de una estructura de datos Lisp. Es 1 para un átomo, y n para una lista de n átomos, y más generalmente tamaño (x) + tamaño (y) para (cons x y).
Ahora agregue tipos en la mezcla. El tamaño de una lista sería su longitud. ¿Cuál es el tamaño de una lista de listas de átomos? Si considera esta estructura de datos como una lista (cuyos elementos resultan ser listas de átomos), la respuesta es la longitud de la lista. Si considera que esta estructura de datos contiene átomos que están almacenados en una lista de listas, la respuesta es la suma de las longitudes de las listas de elementos.
Los tipos le permiten distinguir entre estas dos vistas (formas) de los datos sin procesar. Necesita un sistema de tipos que le permita discriminar entre (Lista) (Lista Atom) y (Lista Lista) (Atom). La implementación más común de esta distinción es con clases de tipo (como en Haskell).