- Forge ist eine experimentelle Sprache, mit der sich Websites in einer stackbasierten Sprache schreiben lassen; HTML-Tags werden als Wörter im Forth-Stil definiert und verwendet
- Mit Wortbibliotheken lassen sich Microformats leicht an HTML anfügen, und eine Site besteht aus Seiten, Bibliotheken und Stylesheets
- Eine einzelne Binärdatei führt
.forge-Dateien aus, und der enthaltene WebAssembly-Compiler erzeugt aus dem Forge-Quelltext HTML - Beim direkten Aufruf liefert der Server HTML und den ursprünglichen Quelltext aus; beim Seitenwechsel lädt ein Service Worker den Quelltext und kompiliert ihn im Browser
- Zustand kann in
state,localStorageund im Append-only-Log des Servers gespeichert werden; Forge befindet sich noch in einer Phase der Möglichkeitserkundung
Die Grundidee von Forge
- Forge ist eine experimentelle Sprache, um Websites in einer stackbasierten Sprache zu schreiben
- HTML-Tags können als Wörter (words) im Forth-Stil definiert und verwendet werden
: h1 ( s -- ) "" emit . "
" emit ;
"Hello, World!" h1
- Mit Bibliotheken für Wortdefinitionen lassen sich **Microformats** einfach zu HTML hinzufügen
- Eine Site besteht aus Seiten, Wortbibliotheken und Stylesheets
```text
my-site
├── lib.forge
├── style.css
└── pages
├── about.forge
├── hello.forge
└── notes.forge
- Die Site wird mit einer einzelnen Binärdatei ausgeführt
forge --log forge.log my-site/
Rendering und Zustandsverwaltung
- Die Forge-Binärdatei enthält einen WebAssembly-Compiler, der aus
.forge-Dateien HTML erzeugt - Wird eine Seite direkt aufgerufen, läuft der Compiler auf dem Server, und sowohl das tatsächliche HTML als auch der ursprüngliche
.forge-Quelltext werden ausgeliefert - Beim Wechsel zwischen Seiten fängt ein Service Worker Netzwerkanfragen wie
/notesab, lädt den Quelltext von/notes.forgeund führt den Compiler im Browser aus - Diese Struktur bietet Server-Side-Rendering für Crawler und WebMentions sowie Client-Side-Rendering ähnlich einer SPA für Seitenwechsel
- Zustand kann in
state,localStorageund im Append-only-Log des Servers gespeichert werden - Ein „Gefällt mir“-Button fügt beim Klicken beispielsweise den Wert
"1"zum Topic"likes:demo"hinzu: like-button ( -- ) "❤" "do-like" on-click ; : do-like "1" "likes:demo" log-append ; : body "I liked this!" p like-button ; - Das Server-Log verwendet das JSONL-Format, bei dem pro Zeile ein JSON-Dokument gespeichert wird
- Formulare können an andere
.forge-Seiten gesendet werden, und die übermittelten Inhalte landen auf dem Stack der Zielseite - Das Backend-Persistieren muss von der Zielseite mit
log-appendverarbeitet werden - Forge ist weniger ein bereits feststehendes Tool für den produktiven Einsatz auf realen Sites als vielmehr ein Experiment zur Erkundung der Möglichkeiten einer kleinen stackbasierten Websprache
1 Kommentare
Lobste.rs-Kommentare
Das Beispiel ganz oben sieht meiner Art, eine persönliche Website zu bauen, wirklich sehr ähnlich :)
"hey"Ich wollte Leute, die Websites mit einer concatenative language bauen, für so etwas wie einen Webring zusammenbringen und Ideen austauschen, habe aber selbst in der catlang-Community kaum jemanden gefunden, der das wirklich ausprobiert hat.
Falls das in Zukunft jemand in diesem alten Thread liest und nach ähnlichen Leuten sucht: Wenn du eine Website mit mehr als etwa 10 Seiten gebaut hast, dabei an keiner Stelle AI verwendet hast und alles in irgendeiner Form einer concatenative language geschrieben wurde, wäre es toll, davon zu hören. Ich würde gern zumindest eine Liste mit Beispielseiten zusammenstellen.
https://stk.junglecoder.com wurde komplett in StackTalk geschrieben, einschließlich der Playground-Implementierung, aber der Umfang der Seite ist noch etwas klein.
Wenn der Neuaufbau von StackTalk etwas weiter auf Kurs ist, will ich das ausbauen. Ich baue auch einige Seiten auf https://junglecoder.com auf ähnliche Weise, und zuletzt habe ich https://junglecoder.com/blarg/tired-of-csharp.html so erstellt. Den Großteil der Website baue ich noch mit Mendoza, aber es macht ziemlich viel Spaß, StackTalk als Grundlage für einen Static Site Generator zu verwenden, deshalb will ich Seiten aktiv von Mendoza nach pstk migrieren.
Definitiv von uxn inspiriert.
Hallo! Ich nutze min tatsächlich als Rule Engine für einige Websites, etwa https://min-lang.org.
Mein Static Site Generator HastySite ist in Nim geschrieben und verwendet mustache für Templates, aber alle Features werden über die min API bereitgestellt.
Ein Beispiel für die Datei rules.min, die für die min-Sprachwebsite verwendet wird, gibt es hier.
Ich war überrascht, meinen Blogpost hier zu sehen. Es ist ein Beitrag fast ohne Kontext, also beantworte ich gern Fragen.
Als zusätzlicher Hintergrund: Forge ist in Rust geschrieben und kompiliert zu WebAssembly, also zu einer stackbasierten Sprache, sowie zu einem nativen Webserver. Ich bin noch ein paar Tage auf Reisen und plane, den Source Code nächste Woche offenzulegen, wenn ich zurück bin.
Ich mag daran besonders, wie leicht es ist, immer weiter Blöcke zu kombinieren, um ein DSL für Seiten zu bauen. Es war viel ausdrucksstärker, als ich erwartet hatte.
Diese Arbeit ist Teil einer Reihe, in der ich alternative Wege zum Schreiben von Websites erkunde.
Ich hatte das Gefühl, dass concatenative/stackbasierte Sprachen für so etwas wirklich gut geeignet sind.
Der Stack eignet sich hervorragend, um das Durchlaufen oder Erzeugen von Bäumen auszudrücken, und die zeichensetzungsarme Syntax aus der Forth-Familie passt ziemlich natürlich zu dokumentartigem Code.
Ich habe halb einen Text darüber geschrieben, dass sich der Geist des alten Waschmaschinen-Beispiels aus Starting Forth in modernisierter Form in ein Beispiel zum Arbeiten mit dem DOM übertragen ließe; umso schöner, dass andere dieselbe Spur aufgenommen haben.