Un lenguaje inspirado en Forth para crear sitios web
(robida.net)- Forge es un lenguaje experimental para intentar escribir sitios web con un lenguaje basado en pila, usando etiquetas HTML definidas como palabras al estilo Forth
- Con bibliotecas de palabras, facilita añadir microformats a HTML, y el sitio se compone de páginas, bibliotecas y hojas de estilo
- Un solo binario ejecuta archivos
.forge, y el compilador de WebAssembly incluido genera HTML a partir del código fuente de Forge - Al acceder directamente, el servidor entrega tanto el HTML como el código fuente original, y al navegar entre páginas un service worker obtiene el código fuente y lo compila en el navegador
- El estado puede guardarse en
state,localStoragey en el append-only log del servidor, y Forge todavía está en una etapa de exploración de posibilidades
La idea básica de Forge
- Forge es un lenguaje experimental para escribir sitios web con un lenguaje basado en pila
- Permite definir y usar etiquetas HTML como palabras (word) al estilo Forth
: h1 ( s -- ) "" emit . "
" emit ;
"Hello, World!" h1
- Si se crean bibliotecas de definiciones de palabras, se pueden añadir fácilmente **microformats** a HTML
- El sitio se compone de páginas, bibliotecas de palabras y hojas de estilo
```text
my-site
├── lib.forge
├── style.css
└── pages
├── about.forge
├── hello.forge
└── notes.forge
- El sitio se ejecuta con un solo binario
forge --log forge.log my-site/
Renderizado y manejo de estado
- El binario de Forge incluye un compilador de WebAssembly que genera HTML a partir de archivos
.forge - Si se visita una página directamente, el compilador se ejecuta en el servidor y entrega tanto el HTML real como el código fuente original
.forge - Al navegar entre páginas, el service worker intercepta solicitudes de red como
/notes, obtiene el código fuente/notes.forgey ejecuta el compilador en el navegador - Con esta estructura, ofrece renderizado del lado del servidor para rastreadores y WebMentions, y renderizado del lado del cliente tipo SPA para la navegación entre páginas
- El estado puede almacenarse en
state,localStoragey en el append-only log del servidor - Por ejemplo, un botón de “me gusta” añade el valor
"1"al tema"likes:demo"cuando se hace clic: like-button ( -- ) "❤" "do-like" on-click ; : do-like "1" "likes:demo" log-append ; : body "I liked this!" p like-button ; - El log del servidor usa formato JSONL, con un documento JSON por línea
- Los formularios pueden enviarse a otra página
.forge, y el contenido enviado entra en la pila de la página de destino - El almacenamiento en backend debe ser manejado por la página de destino usando
log-append - Forge está todavía más en una etapa de explorar las posibilidades de un pequeño lenguaje web basado en pila que de ser una herramienta ya definida para usarse en sitios reales
1 comentarios
Comentarios en Lobste.rs
El ejemplo de arriba se parece muchísimo a cómo hago mi sitio web personal :)
"hey"Había querido reunir a gente que hiciera sitios web con un lenguaje concatenativo y armar algo tipo webring para compartir ideas, pero incluso dentro de la comunidad de catlang casi no encontré a nadie que realmente lo hubiera intentado
Si en el futuro alguien lee este hilo viejo y encuentra a alguien parecido, me gustaría que me avisara si hizo un sitio web de unas 10 páginas o más, sin usar IA en ninguna parte del proceso, y escrito por completo en alguna forma de lenguaje concatenativo. Me gustaría aunque sea hacer una lista de sitios de ejemplo
https://stk.junglecoder.com está hecho completamente en StackTalk, incluida la implementación del playground, pero por ahora el sitio sigue siendo algo pequeño
Cuando la reconstrucción de StackTalk esté más encaminada, planeo compensar esa parte. También estoy haciendo algunas páginas de https://junglecoder.com de manera parecida, y recientemente hice así https://junglecoder.com/blarg/tired-of-csharp.html. La mayor parte del sitio todavía se construye con Mendoza, pero me está gustando bastante usar StackTalk como base para un generador de sitios estáticos, así que pienso migrar activamente páginas de Mendoza a pstk
Sin duda estuvo inspirado por uxn
¡Hola! En realidad uso min como motor de reglas en algunos sitios, como https://min-lang.org
Mi generador de sitios estáticos, HastySite, está escrito en Nim y usa mustache para las plantillas, pero toda la funcionalidad está expuesta mediante la API de min
Un ejemplo del archivo rules.min que se usa en el sitio web del lenguaje min está aquí
Me sorprendió ver mi post del blog aquí. Es una publicación con casi nada de contexto, así que con gusto responderé preguntas si las hay
Para dar algo de contexto, Forge está escrito en Rust y compila a WebAssembly, o sea, a un lenguaje basado en pila, y a un servidor web nativo. Estoy de viaje por unos días, así que cuando vuelva planeo publicar el código fuente la próxima semana
Me gusta mucho lo fácil que es seguir combinando bloques para crear un DSL para páginas. Resultó ser mucho más expresivo de lo que esperaba
Este trabajo es parte de una serie en la que he estado explorando formas alternativas de escribir sitios web
Sentí que los lenguajes concatenativos/basados en pila encajan realmente bien para este tipo de uso
La pila es excelente para expresar el proceso de recorrer o construir árboles, y la sintaxis con poca puntuación al estilo Forth combina de manera bastante natural con código en forma de documento
Tengo medio escrito un texto sobre cómo una versión moderna del espíritu del viejo ejemplo de la lavadora de Starting Forth podría convertirse en un ejemplo de manipulación del DOM, así que me alegra ver que otras personas también llegaron a una idea parecida