Não estou familiarizado com o trabalho recente de Barry Jay, mas seu trabalho mais antigo inclui coisas que você não pode fazer no Lisp, porque os tipos fornecem informações adicionais.
Por exemplo, suponha que você queira definir o tamanho de uma estrutura de dados Lisp. É 1 para um átomo en para uma lista de n átomos e, geralmente, tamanho (x) + tamanho (y) para (cons x y)
.
Agora jogue tipos na mistura. O tamanho de uma lista seria o seu comprimento. Agora, qual é o tamanho de uma lista de listas de átomos? Se você considerar essa estrutura de dados como uma lista (cujos elementos são listas de átomos), a resposta será o tamanho da lista. Se você considerar essa estrutura de dados como contendo átomos que são armazenados em uma lista de listas, a resposta é a soma dos comprimentos das listas de elementos.
Os tipos permitem distinguir entre essas duas visualizações (formas) dos dados brutos. Você precisa de um sistema de tipos que permita discriminar entre (Lista) (Lista Atom) e (Lista Lista) (Atom). A implementação mais comum dessa distinção é com classes de tipo (como em Haskell).