1 pontos por GN⁺ 10 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • Forge é uma linguagem experimental para tentar escrever websites com uma linguagem baseada em pilha, usando tags HTML definidas como palavras no estilo Forth
  • Com bibliotecas de palavras, fica fácil adicionar microformats ao HTML, e o site é composto por páginas, bibliotecas e folhas de estilo
  • Um único binário executa arquivos .forge, e o compilador WebAssembly incluído gera HTML a partir do código-fonte Forge
  • Ao acessar diretamente, o servidor entrega o HTML e o código-fonte original; ao navegar entre páginas, um service worker recebe o código-fonte e compila no navegador
  • O estado pode ser salvo em state, localStorage e no append-only log do servidor, e o Forge ainda está em fase de exploração de possibilidades

Ideia básica do Forge

  • Forge é uma linguagem experimental para escrever websites com uma linguagem baseada em pilha
  • É possível definir e usar tags HTML como palavras (words) no estilo Forth
    : h1  ( s -- )  "" emit  .  "
    
    

" emit ;

"Hello, World!" h1

- Ao criar bibliotecas de definição de palavras, fica fácil adicionar **microformats** ao HTML
- O site é composto por páginas, bibliotecas de palavras e folhas de estilo
```text
my-site
├── lib.forge
├── style.css
└── pages
    ├── about.forge
    ├── hello.forge
    └── notes.forge
  • O site é executado com um único binário
    forge --log forge.log my-site/
    

Renderização e tratamento de estado

  • O binário do Forge inclui um compilador WebAssembly que gera HTML a partir de arquivos .forge
  • Quando uma página é acessada diretamente, o compilador roda no servidor e entrega tanto o HTML final quanto o código-fonte original em .forge
  • Ao navegar entre páginas, o service worker intercepta requisições de rede como /notes, busca o código-fonte /notes.forge e executa o compilador no navegador
  • Com essa estrutura, há renderização no lado do servidor para crawlers e WebMentions, e renderização no lado do cliente, semelhante a uma SPA, para navegação entre páginas
  • O estado pode ser armazenado em state, localStorage e no append-only log do servidor
  • Por exemplo, um botão de “curtir” adiciona o valor "1" ao tópico "likes:demo" quando clicado
    : like-button  ( -- )
        "❤"  "do-like"  on-click ;
    
    : do-like
      "1" "likes:demo" log-append ;
    
    : body
      "I liked this!" p
      like-button ;
    
  • O log do servidor usa o formato JSONL, armazenando um documento JSON por linha
  • Formulários podem ser enviados para outra página .forge, e o conteúdo enviado é colocado na pilha da página de destino
  • A persistência no backend precisa ser tratada pela página de destino usando log-append
  • O Forge ainda está mais na fase de explorar as possibilidades de uma pequena linguagem web baseada em pilha do que de ser uma ferramenta já definida para uso real em sites

1 comentários

 
Comentários no Lobste.rs
  • O exemplo no topo parece muito com a forma como eu faço meu site pessoal :)

    "hey"

    Eu queria juntar pessoas que fizeram sites com uma linguagem concatenativa e criar algo como um webring para trocar ideias, mas quase não consegui encontrar gente que realmente tivesse tentado isso, mesmo dentro da comunidade de catlang.

    Se no futuro alguém estiver lendo esta thread antiga e procurando pessoas parecidas, eu adoraria saber se você fez um site com umas 10 páginas ou mais, não usou IA em nenhuma etapa do processo e escreveu tudo em alguma forma de linguagem concatenativa. Queria pelo menos montar uma lista de sites de exemplo.

    • https://stk.junglecoder.com foi todo escrito em StackTalk, incluindo a implementação do playground, mas o site ainda é um pouco pequeno.

      Quando a reconstrução do StackTalk estiver mais encaminhada, pretendo melhorar essa parte. Também estou fazendo algumas páginas de https://junglecoder.com de forma parecida, e recentemente fiz assim https://junglecoder.com/blarg/tired-of-csharp.html. A maior parte do site ainda é gerada com Mendoza, mas estou gostando bastante de usar StackTalk como base de um gerador de site estático, então pretendo migrar páginas ativamente de Mendoza para pstk.

    • Com certeza foi inspirado por uxn.

    • Olá! Na prática, eu uso min como motor de regras em alguns sites, como https://min-lang.org.

      Meu gerador de site estático, HastySite, foi escrito em Nim e usa mustache nos templates, mas toda a funcionalidade é exposta pela API do min.

      Um exemplo do arquivo rules.min usado no site da linguagem min está aqui.

  • Fiquei surpreso ao ver meu post do blog aparecer aqui. O texto está quase sem contexto, então terei prazer em responder perguntas.

    Para dar um pouco de contexto, o Forge foi escrito em Rust e compila para WebAssembly, ou seja, uma linguagem baseada em pilha, e para um servidor web nativo. Estou viajando por alguns dias, então pretendo liberar o código-fonte na semana que vem quando voltar.

    Eu gostei muito de como é fácil continuar combinando blocos para criar uma DSL para páginas. Ficou bem mais expressivo do que eu esperava.

    Este trabalho faz parte de uma série em que venho explorando formas alternativas de escrever sites.

    • Senti que linguagens concatenativas/baseadas em pilha combinam muito bem com esse tipo de uso.

      A pilha é excelente para expressar o processo de percorrer ou construir árvores, e a sintaxe com pouca pontuação da família Forth combina de forma bem natural com código em formato de documento.

      Tenho meio escrito um texto sobre como o espírito do velho exemplo da máquina de lavar em Starting Forth poderia ser trazido para os dias de hoje como um exemplo de manipulação do DOM, então é bom ver outras pessoas chegando a pistas parecidas.