1 points par GN⁺ 11 시간 전 | 1 commentaires | Partager sur WhatsApp
  • Forge est un langage expérimental pour écrire des sites web avec un langage à pile, en définissant les balises HTML comme des mots de style Forth
  • Une bibliothèque de mots permet d’ajouter facilement des microformats à du HTML, et un site se compose de pages, de bibliothèques et de feuilles de style
  • Un binaire unique exécute les fichiers .forge, et le compilateur WebAssembly intégré génère du HTML à partir du code source Forge
  • Lors d’une visite directe, le serveur fournit le HTML et le code source d’origine, et lors de la navigation entre pages, un service worker récupère le code source et le compile dans le navigateur
  • L’état peut être stocké dans state, localStorage et un journal en append-only côté serveur, et Forge en est encore au stade de l’exploration des possibilités

L’idée de base de Forge

  • Forge est un langage expérimental conçu pour écrire des sites web avec un langage à pile
  • Il permet de définir et d’utiliser les balises HTML comme des mots (word) de style Forth
    : h1  ( s -- )  "" emit  .  "
    
    

" emit ;

"Hello, World!" h1

- En créant des bibliothèques de définitions de mots, on peut facilement ajouter des **microformats** à du HTML
- Un site se compose de pages, de bibliothèques de mots et de feuilles de style
```text
my-site
├── lib.forge
├── style.css
└── pages
    ├── about.forge
    ├── hello.forge
    └── notes.forge
  • Le site s’exécute avec un binaire unique
    forge --log forge.log my-site/
    

Rendu et gestion de l’état

  • Le binaire Forge intègre un compilateur WebAssembly qui génère du HTML à partir des fichiers .forge
  • Lorsqu’on accède directement à une page, le compilateur s’exécute sur le serveur, qui fournit à la fois le HTML final et le code source .forge d’origine
  • Lors de la navigation entre pages, le service worker intercepte les requêtes réseau comme /notes, récupère le code source /notes.forge et exécute le compilateur dans le navigateur
  • Cette architecture fournit un rendu côté serveur pour les crawlers et les WebMentions, et un rendu côté client de type SPA pour la navigation entre pages
  • L’état peut être stocké dans state, localStorage et le journal en append-only du serveur
  • Par exemple, un bouton « J’aime » ajoute la valeur "1" au topic "likes:demo" lors d’un clic
    : like-button  ( -- )
        "❤"  "do-like"  on-click ;
    
    : do-like
      "1" "likes:demo" log-append ;
    
    : body
      "I liked this!" p
      like-button ;
    
  • Le journal du serveur utilise le format JSONL, avec un document JSON par ligne
  • Les formulaires peuvent être envoyés vers une autre page .forge, et le contenu soumis est placé dans la pile de la page cible
  • Le stockage backend doit être géré par la page cible via log-append
  • Forge n’est pas tant un outil déjà destiné à être utilisé sur de vrais sites qu’une exploration des possibilités d’un petit langage web à pile

1 commentaires

 
Commentaires sur Lobste.rs
  • L’exemple tout en haut ressemble vraiment beaucoup à ma façon de créer un site personnel :)

    "hey"

    J’ai essayé de rassembler des gens qui construisent des sites web avec des langages concaténatifs pour faire une sorte de webring et échanger des idées, mais même dans la communauté catlang, je n’ai presque trouvé personne qui ait vraiment tenté le coup.

    Si quelqu’un lit ce vieux fil plus tard et cherche des gens dans le même cas, j’aimerais bien qu’il se manifeste s’il a créé un site d’une bonne dizaine de pages, sans utiliser d’IA à aucune étape, et entièrement écrit dans une forme de langage concaténatif. J’aimerais au moins essayer de constituer une liste de sites en exemple.

    • https://stk.junglecoder.com est entièrement écrit en StackTalk, y compris l’implémentation du playground, mais le site reste encore assez petit

      Quand la reconstruction de StackTalk sera suffisamment avancée, je compte corriger ce point. Je construis aussi certaines pages de https://junglecoder.com d’une manière similaire, et récemment j’ai fait https://junglecoder.com/blarg/tired-of-csharp.html comme ça. La majeure partie du site est encore générée avec Mendoza, mais j’aime beaucoup utiliser StackTalk comme base pour un générateur de site statique, donc je pense migrer activement des pages de Mendoza vers pstk.

    • Clairement inspiré par uxn

    • Bonjour ! J’utilise effectivement min comme moteur de règles sur quelques sites, comme https://min-lang.org

      Mon générateur de site statique, HastySite, est écrit en Nim et utilise mustache pour les templates, mais toutes les fonctionnalités sont exposées via la min API.

      Un exemple du fichier rules.min utilisé pour le site web du langage min se trouve ici

  • J’ai été surpris de voir mon billet de blog posté ici. C’est un texte avec très peu de contexte, donc je répondrai volontiers aux questions s’il y en a.

    Pour ajouter un peu de contexte, Forge est écrit en Rust et compilé en WebAssembly, c’est-à-dire en un langage à pile, avec un serveur web natif. Je suis en voyage pour quelques jours, mais je prévois d’ouvrir les sources la semaine prochaine à mon retour.

    J’aime beaucoup à quel point il est facile de continuer à composer des blocs pour créer une DSL pour les pages. C’était bien plus expressif que je ne l’avais prévu.

    Ce travail fait partie d’une série qui explore des façons alternatives d’écrire des sites web.

    • J’ai l’impression que les langages concaténatifs / à pile conviennent vraiment très bien à ce type d’usage.

      La pile est excellente pour exprimer le parcours ou la construction d’arbres, et la syntaxe peu ponctuée de la famille Forth s’accorde très naturellement avec du code ayant la forme d’un document.

      J’ai un article à moitié écrit sur l’idée qu’en transposant à l’époque moderne l’esprit du vieil exemple de machine à laver de Starting Forth, on obtiendrait un exemple manipulant le DOM, donc ça me fait plaisir de voir que d’autres suivent la même piste.