ภาษาแรงบันดาลใจจาก Forth สำหรับการเขียนเว็บไซต์
(robida.net)- Forge เป็นภาษาเชิงทดลองสำหรับลองเขียนเว็บไซต์ด้วยภาษาที่อิงสแตก โดยนิยามแท็ก HTML เป็นคำแบบ Forth แล้วนำมาใช้
- มีคลังคำที่ช่วยให้ใส่ microformats ลงใน HTML ได้ง่าย และเว็บไซต์ประกอบด้วยหน้าเว็บ คลังคำ และสไตล์ชีต
- ไบนารีตัวเดียวสามารถรันไฟล์
.forgeได้ และมี คอมไพเลอร์ WebAssembly ในตัวที่สร้าง HTML จากซอร์สของ Forge - เมื่อเข้าชมโดยตรง เซิร์ฟเวอร์จะส่งทั้ง HTML และซอร์สต้นฉบับมาให้ และเมื่อย้ายหน้าระหว่างหน้า service worker จะรับซอร์สไปคอมไพล์ในเบราว์เซอร์
- สถานะสามารถเก็บไว้ใน
state,localStorageและ append-only log บนเซิร์ฟเวอร์ได้ โดย Forge ยังอยู่ในขั้นสำรวจความเป็นไปได้
แนวคิดพื้นฐานของ Forge
- Forge เป็นภาษาเชิงทดลองสำหรับเขียนเว็บไซต์ด้วยภาษาที่อิงสแตก
- สามารถนิยามแท็ก HTML เป็นคำ (word) แบบ Forth แล้วนำมาใช้ได้
: h1 ( s -- ) "" emit . "
" emit ;
"Hello, World!" h1
- หากสร้างคลังสำหรับนิยามคำ ก็จะสามารถเพิ่ม **microformats** ให้กับ HTML ได้ง่าย
- เว็บไซต์ประกอบด้วยหน้าเว็บ คลังคำ และสไตล์ชีต
```text
my-site
├── lib.forge
├── style.css
└── pages
├── about.forge
├── hello.forge
└── notes.forge
- รันเว็บไซต์ด้วยไบนารีเพียงตัวเดียว
forge --log forge.log my-site/
การเรนเดอร์และการจัดการสถานะ
- ไบนารีของ Forge มี คอมไพเลอร์ WebAssembly ที่สร้าง HTML จากไฟล์
.forgeอยู่ภายใน - เมื่อเข้าชมหน้าโดยตรง คอมไพเลอร์จะทำงานบนเซิร์ฟเวอร์ และส่งทั้งซอร์ส HTML จริงกับซอร์ส
.forgeต้นฉบับมาพร้อมกัน - ระหว่างการย้ายหน้าระหว่างหน้า service worker จะดักคำขอเครือข่ายอย่าง
/notesแล้วดึงซอร์ส/notes.forgeมารันคอมไพเลอร์ในเบราว์เซอร์ - โครงสร้างนี้ทำให้รองรับการเรนเดอร์ฝั่งเซิร์ฟเวอร์สำหรับ crawler และ 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 ; - ล็อกของเซิร์ฟเวอร์ใช้รูปแบบ JSONL ที่เก็บเอกสาร JSON หนึ่งรายการต่อหนึ่งบรรทัด
- ฟอร์มสามารถส่งไปยังหน้า
.forgeอื่นได้ และข้อมูลที่ส่งมาจะถูกวางลงในสแตกของหน้าปลายทาง - การจัดเก็บข้อมูลฝั่งแบ็กเอนด์ต้องให้หน้าปลายทางจัดการผ่าน
log-append - Forge ยังไม่ใช่เครื่องมือที่ยืนยันแล้วว่าจะนำไปใช้กับเว็บไซต์จริง แต่ยังอยู่ในขั้นสำรวจความเป็นไปได้ของภาษาเว็บขนาดเล็กที่อิงสแตก
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
ตัวอย่างบนสุดดูคล้ายกับวิธีที่ฉันทำเว็บไซต์ส่วนตัวมากจริง ๆ :)
"hey"ฉันเคยพยายามรวบรวมคนที่ทำเว็บไซต์ด้วยภาษาประกอบแบบ concatenative language เพื่อทำอะไรคล้าย ๆ webring และแลกเปลี่ยนไอเดียกัน แต่แม้แต่ในชุมชน catlang ก็แทบหาคนที่ลองทำจริงจังไม่เจอ
ถ้าในอนาคตมีใครมาอ่านเธรดเก่านี้แล้วกำลังมองหาคนที่ทำคล้ายกัน ถ้าคุณเคยทำเว็บไซต์ยาวเกินสัก 10 หน้า ไม่ได้ใช้ AI เลยในขั้นตอนใด ๆ และเขียนทั้งหมดด้วยภาษาประกอบไม่ว่ารูปแบบไหน ก็อยากให้บอกกันหน่อย ฉันอยากลองทำรายชื่อเว็บไซต์ตัวอย่างดู
https://stk.junglecoder.com เขียนทั้งหมดด้วยStackTalk รวมถึงตัว playground implementation ด้วย แต่ตอนนี้ขนาดไซต์ยังค่อนข้างเล็ก
พอการสร้าง StackTalk ใหม่เข้าที่เข้าทางมากขึ้น ฉันวางแผนจะเติมส่วนนี้ให้ครบ หน้าเว็บบางหน้าของ https://junglecoder.com ก็ทำในแนวคล้ายกัน และล่าสุด https://junglecoder.com/blarg/tired-of-csharp.html ก็ทำแบบนั้นเหมือนกัน เว็บไซต์ส่วนใหญ่ยัง build ด้วย Mendoza แต่การใช้ StackTalk เป็นฐานของ static site generator นั้นสนุกมากพอสมควร เลยตั้งใจจะย้ายหน้าต่าง ๆ จาก Mendoza ไปเป็น pstk อย่างจริงจัง
ได้แรงบันดาลใจจากuxnอย่างชัดเจน
สวัสดี! ผมใช้minเป็น rules engine จริง ๆ กับบางเว็บไซต์ เช่น https://min-lang.org
static site generator ของผม HastySite เขียนด้วย Nim และใช้ mustache สำหรับ template แต่ฟังก์ชันทั้งหมดถูกเปิดให้ใช้ผ่าน min API
ตัวอย่างไฟล์ rules.min ที่ใช้กับเว็บไซต์ของภาษา min ดูได้ที่นี่
ตกใจเหมือนกันที่โพสต์บล็อกของผมมาโผล่ที่นี่ เป็นโพสต์ที่แทบไม่มีบริบทเลย ถ้ามีคำถามยินดีตอบครับ
เพิ่มพื้นหลังอีกนิด Forge เขียนด้วย Rust และคอมไพล์ไปเป็น WebAssembly ซึ่งก็คือภาษาแบบ stack-based พร้อมกับ native web server ผมกำลังเดินทางอยู่สองสามวัน พอกลับมาแล้วสัปดาห์หน้าวางแผนจะปล่อยซอร์ส
ผมชอบมากที่มันทำให้ประกอบบล็อกไปเรื่อย ๆ เพื่อสร้าง DSL สำหรับหน้าเว็บได้ง่าย มันแสดงพลังในการเขียนได้มากกว่าที่คาดไว้เยอะ
งานนี้เป็นส่วนหนึ่งของซีรีส์ที่ผมใช้สำรวจวิธีทางเลือกในการเขียนเว็บไซต์
รู้สึกว่าภาษาแบบ concatenative/stack-based เหมาะกับงานแบบนี้มากจริง ๆ
stack นั้นยอดเยี่ยมมากในการแสดงกระบวนการเดินหรือสร้าง tree และไวยากรณ์แบบ Forth ที่มีเครื่องหมายน้อยก็เข้ากันได้ค่อนข้างเป็นธรรมชาติกับโค้ดที่มีลักษณะเป็นเอกสาร
ผมเขียนค้างไว้ครึ่งหนึ่งเกี่ยวกับไอเดียว่า ถ้าจะนำจิตวิญญาณของตัวอย่างเครื่องซักผ้าเก่าใน Starting Forth มาปรับให้ทันสมัย มันก็น่าจะกลายเป็นตัวอย่างการจัดการ The DOM ได้ และก็ดีใจที่เห็นคนอื่นจับปลายทางเดียวกันนี้เหมือนกัน