Eu implementei um aplicativo comercial proprietário no Common Lisp chamado Tankan que roda no Microsoft Windows como um executável nativo.
É um programa para treinar você mesmo a memorizar caracteres kanji japoneses.
O programa é executado como um servidor HTTP em segundo plano. A execução deste servidor e a navegação para suas páginas são coordenadas por um pequeno aplicativo de ícone da área de notificação do sistema (também conhecido como "Bandeja") que desenvolvi usando o Visual C ++.
O aplicativo de ícone da pequena bandeja inicia, monitora e para o servidor baseado em Lisp e se comunica com ele usando os tubos Win32 vinculados à sua entrada e saída padrão. Por meio de um canal, o servidor Lisp informa o aplicativo de ícone da bandeja da URL precisa com o número de porta correto, e esse aplicativo de ícone da bandeja pode iniciar o navegador pela API do Shell para navegar nessa URL. O usuário clica duas vezes no ícone para abrir a interface do usuário.
O programa Lisp mantém em sua memória um estado de sessão bastante complexo que contém o histórico de entrada do usuário e vários relacionamentos entre vários objetos. A notação de objeto circular do Lisp (ativada pela *print-circle*
variável) e como ela funciona nos print-object
métodos CLOS personalizados são de grande ajuda na implementação da persistência: os usuários podem salvar o estado no disco e retomar de onde pararam. Tudo é salvo, incluindo o estado da interface do usuário. Há muita subestrutura compartilhada no gráfico de objetos, bem como ciclos. Além disso, muitos itens estáticos que não precisam ser persistidos, como o conteúdo dos objetos de entrada do dicionário. Com os métodos personalizados de objeto de impressão ANSI Common Lisp, você pode criar representações impressas condensadas para objetos que são legíveis por máquina,
Quase nenhum JavaScript é usado na interface da web. Mesmo os controles para ocultar e mostrar partes da interface do usuário são feitos através do envio de formulários e da nova renderização do HTML. Portanto, todos os detalhes do estado da interface do usuário estão no servidor e persistem quando o usuário salva. A re-geração do HTML é muito rápida. Isso é feito por uma expressão gigante de aspas Lisp, que alimenta uma macro geradora de HTML. O código compilado pelo Clozure Common Lisp (CCL) faz com que isso aconteça tão rápido que você nem percebe que quando clica em um botão [+] na interface do usuário para abrir algo, está enviando uma solicitação a um servidor que regenera o página danada inteira, e não simplesmente executando algum JavaScript local para alterar a visibilidade de um elemento de documento local.
O programa foi originalmente desenvolvido com o CLISP. Graças ao ANSI CL ser uma linguagem padrão, com implementações que se adaptam bem e não muitas armadilhas furtivas na linguagem (comportamento "indefinido" ou "definido pela implementação"), ele é facilmente transportado para o CCL.
O CLISP não foi abandonado; ainda é usado para alimentar o back-end de licenciamento, usando muito da mesma base de código comum.
Desenvolvi um sistema de licenciamento original para o programa, usando criptografia de curva elíptica fornecida pela biblioteca IronClad, usada pelo servidor de licenciamento para assinar licenças para certificá-las. (Lembro-me de que poderia ter usado o programa de linha de comando do OpenSSL para gerar os parâmetros EC para a chave do servidor.)
As licenças são representadas como objetos Lisp. É uma homenagem à portabilidade do Lisp que um programa do Windows compilado pelo Clozure Common Lisp possa gerar uma licença baseada em expressão S, um programa CLISP em execução em um servidor Debian possa preencher o campo de assinatura digital ausente nesse objeto e enviá-lo de volta para o programa Windows que pode validar a assinatura.
No servidor, além do serviço de licenciamento baseado em CGI, eu simples API de linha de comando para gerenciar licenças. Você pode listar licenças, encontrar licenças específicas e editar seus atributos: por exemplo, editar a data de validade de uma licença temporária para conceder uma exceção ao usuário. O back-end de licenciamento também gera emails. Eu não usei nenhuma biblioteca para manipulação de CGI no lado do servidor: apenas código Lisp rolado manualmente para lidar com as variáveis de ambiente Apache e argumentos da linha de comando. (Embora o código da biblioteca seja usado para lidar com codificação de URL e geração de HTML.) Nenhum banco de dados é usado para armazenamento; as licenças são geradas em um arquivo chamado licenses.lisp
e é isso.