Webサイト記述のためのForth風言語
(robida.net)- Forgeは、Webサイトをスタックベース言語で記述してみるための実験的な言語で、HTMLタグをForthスタイルの単語として定義して使う
- 単語ライブラリによってHTMLにmicroformatsを付与しやすくし、サイトはページ・ライブラリ・スタイルシートで構成される
- 単一バイナリが
.forgeファイルを実行し、同梱されたWebAssemblyコンパイラがForgeソースからHTMLを生成する - 直接アクセス時にはサーバーがHTMLと元のソースを提供し、ページ遷移時にはservice workerがソースを受け取ってブラウザ内でコンパイルする
- 状態は
state、localStorage、サーバーのappend-only logに保存でき、Forgeはまだ可能性を探る段階にある
Forgeの基本アイデア
- Forgeは、Webサイトをスタックベース言語で記述するための実験的な言語
- HTMLタグをForthスタイルの単語(word)として定義して使える
: h1 ( s -- ) "" emit . "
" emit ;
"Hello, World!" h1
- 単語定義ライブラリを作れば、HTMLに**microformats**を簡単に追加できる
- サイトはページ、単語ライブラリ、スタイルシートで構成される
```text
my-site
├── lib.forge
├── style.css
└── pages
├── about.forge
├── hello.forge
└── notes.forge
- 単一バイナリでサイトを実行する
forge --log forge.log my-site/
レンダリングと状態処理
- Forgeバイナリには、
.forgeファイルからHTMLを生成するWebAssemblyコンパイラが含まれている - ページに直接アクセスすると、コンパイラはサーバー上で実行され、実際のHTMLソースと元の
.forgeソースが一緒に提供される - ページ間の移動では、service workerが
/notesのようなネットワークリクエストを横取りし、/notes.forgeソースを取得してブラウザでコンパイラを実行する - この構成により、クローラーやWebMentionsにはサーバーサイドレンダリングを提供し、ページ遷移にはSPAのようなクライアントサイドレンダリングを提供する
- 状態は
state、localStorage、サーバーのappend-only logに保存できる - たとえば「いいね」ボタンは、クリック時に
"1"の値を"likes:demo"トピックへ追加する: like-button ( -- ) "❤" "do-like" on-click ; : do-like "1" "likes:demo" log-append ; : body "I liked this!" p like-button ; - サーバーログは、1行に1つのJSONドキュメントを保存するJSONL形式
- フォームは別の
.forgeページへ送信でき、送信された内容は対象ページのスタックに入る - バックエンドへの保存は、対象ページが
log-appendを使って処理する必要がある - Forgeは、実際のサイト採用が決まったツールというより、小さなスタックベースWeb言語の可能性を探る段階にある
1件のコメント
Lobste.rs のコメント
一番上の例が、私が個人ウェブサイトを作るやり方と本当によく似て見える :)
"hey"連結型言語でウェブサイトを作っている人たちを集めてウェブリングのようなものを作り、アイデアを共有したいと思っていたのだけれど、catlang コミュニティの中でさえ、ちゃんと試している人はほとんど見つからなかった
将来この古いスレッドを読んで、似たような人を探している人がいたら、10ページを超えるウェブサイトを作っていて、その過程のどこにも AI を使っておらず、すべて何らかの連結型言語で書いているなら、知らせてもらえるとうれしい。せめて実例サイトの一覧くらいは作ってみたい
https://stk.junglecoder.com はプレイグラウンドの実装まで含めてすべて StackTalk で書いているけれど、まだサイトの規模は少し小さい
StackTalk の再構築がある程度軌道に乗ったら、その点を補うつもり。https://junglecoder.com の一部ページも似た方法で作っていて、最近では https://junglecoder.com/blarg/tired-of-csharp.html をそうやって作った。サイトの大部分はまだ Mendoza でビルドしているが、StackTalk を静的サイトジェネレーターの基盤として使うのはかなり楽しいので、Mendoza から pstk へページを積極的に移していくつもり
たしかに uxn に着想を得ている
こんにちは! 実際、https://min-lang.org のようないくつかのサイトで、min をルールエンジンとして使っている
私の静的サイトジェネレーター HastySite は Nim で書かれており、テンプレートには mustache を使っているが、すべての機能は min API として公開されている
min 言語のウェブサイトで使われている rules.min ファイルの例は こちら
自分のブログ記事がここに載っていて驚いた。ほとんど文脈のない記事なので、質問があれば喜んで答える
補足すると、Forge は Rust で書かれていて、WebAssembly、つまりスタックベースの言語とネイティブなウェブサーバーにコンパイルされる。数日旅行中なので、戻ったら来週ソースを公開する予定
ページ用の DSL を作るために、ブロックを次々と組み合わせやすい点が本当に気に入っている。思っていたよりずっと表現力が高かった
これは、ウェブサイトを書くための別の方法 を探ってきたシリーズの一部
連結型/スタックベース言語は、この用途に本当によく合うと感じた
スタックは、ツリーをたどったり構築したりする過程を表現するのに素晴らしく、Forth 系の句読点の少ない構文は、文書のような形のコードとかなり自然に調和する
Starting Forth の古い洗濯機の例の精神を現代風に移し替えるなら、DOM を扱う例になるのではないか、という文章を半分ほど書いていたのだが、ほかの人たちも同じ糸口をつかんでいるようでうれしい