This really gets at the issue with JavaScript in the age of AI: it’s just not a terribly statically verifiable language, and DOM work is incredibly prone to failing silently while the app itself is clearly not working. We’ve had to paper over it with TypeScript and frameworks that impose constraints just to stop several classes of bugs, and even then it doesn’t go terribly well.
The flip side is that AI is making the underlying code more like a..compilation target? At least in the sense that, yes, as this site mentions, Scheme is ugly to read and would be hell to write the old way, but with the new way..maybe we can try because it would give us what native JavaScript and the latest browser standards never could: reliability
rafterydj 16 hours ago [-]
I don't understand this, if I'm honest. WebAssembly is the compilation target. It's a Scheme compiler for wasm, right? Why is it pretending to be a way to rewrite websites? Wouldn't that be a job for literally any possible language compiled to WebAssembly?
I read the "Why Scheme?" page and it looked entirely AI generated, inasmuch as the reasoning presented confused me, because it didn't make sense. It references homoiconicity as pretty much the only reason to do this, mentions Lisp once or twice, and then just sort of talks about AI not understanding HTML because it doesn't understand compiling.
But putting it under the prompt of "must pass compiler" makes an AI exactly as capable at the task of making websites as it is capable at the task of making correct programs in any language - which is to say that it can't be guaranteed. Which in turn puts into the question the whole purpose of this project, and particularly, why Scheme chosen at all? Why not Lisp? Why not C? Or Erlang? Or Clojure?
jrapdx3 13 hours ago [-]
Scheme language is very well-suited for producing websites, I've been doing that for several months with decent results. But unless I missed information, I think you're right that has nothing to do with WebAssembly. However I know Scheme->wasm compilers exist if unsure of their status.
Of course many languages can be used to create or serve websites. If language doesn't matter, then why not Scheme? It's at least as capable as the languages mentioned. OTOH much less is written about Scheme vs. more "mainstream" languages. Maybe that does make a difference.
guenchi 15 hours ago [-]
the syntax-case marco
rixed 13 hours ago [-]
> it’s just not a terribly statically verifiable language
FYI, neither is scheme.
john_minsk 14 hours ago [-]
I'm learning Clojure and using it in a vibe coding environment. AI hates brackets.
15 hours ago [-]
shalom1112 16 hours ago [-]
[dead]
bramadityaw 16 hours ago [-]
I tried to edit the Scheme source but it seems to have a bug where every editing action seems to happen a row above of where the cursor is.
golem14 16 hours ago [-]
same. Chrome on MacOs. But the code can actually compile and run, once you adjust for the cursor positions.
guenchi 16 hours ago [-]
please retry :)
16 hours ago [-]
guenchi 16 hours ago [-]
please retry :)
papaver-somnamb 14 hours ago [-]
Bravo! If only Clojure(Script) did this. There is a real need to reduce the size of compiled JS delivered to the browser and eliminate legacy dependency on goog.
guenchi 18 hours ago [-]
1 Self hosting in browser with hygienic macros
2 handle HTML and CSS like Scheme (Expand with macro)
3 Use S-expr to send / receive message with server
john_minsk 14 hours ago [-]
Very cool!
At the top of the program you import Web Libraries. is it some standard Scheme web framework that you're using?
* ;; re-running this source bumps the generation; the old loop sees it
;; and lets go
(js-eval "globalThis.__hero_gen = (globalThis.__hero_gen || 0) + 1")
(define gen (js->number (js-get (js-global) "__hero_gen")))
(letrec ((tick (lambda _
(when (= gen (js->number (js-get (js-global) "__hero_gen")))
(frame!)
(js-method (js-global) "requestAnimationFrame" tick)))))
(js-method (js-global) "requestAnimationFrame" tick))
Is this the part where it is compiled?
guenchi 13 hours ago [-]
[flagged]
koolala 16 hours ago [-]
Pretty slick it has Three.js built in. I've not sure I've seen that in a language before in the standard library.
guenchi 16 hours ago [-]
it's standard r6rs scheme
guenchi 12 hours ago [-]
38.2 kB / 75ms you have syntax-case in browser
genxy 12 hours ago [-]
Neat project but the AI writing is a turn off. Could use a whole lot less "honest residue".
phpisatrash 14 hours ago [-]
[flagged]
Rendered at 18:28:31 GMT+0000 (Coordinated Universal Time) with Vercel.
1: https://spritely.institute/hoot/
https://brl.sourceforge.net/
The flip side is that AI is making the underlying code more like a..compilation target? At least in the sense that, yes, as this site mentions, Scheme is ugly to read and would be hell to write the old way, but with the new way..maybe we can try because it would give us what native JavaScript and the latest browser standards never could: reliability
I read the "Why Scheme?" page and it looked entirely AI generated, inasmuch as the reasoning presented confused me, because it didn't make sense. It references homoiconicity as pretty much the only reason to do this, mentions Lisp once or twice, and then just sort of talks about AI not understanding HTML because it doesn't understand compiling.
But putting it under the prompt of "must pass compiler" makes an AI exactly as capable at the task of making websites as it is capable at the task of making correct programs in any language - which is to say that it can't be guaranteed. Which in turn puts into the question the whole purpose of this project, and particularly, why Scheme chosen at all? Why not Lisp? Why not C? Or Erlang? Or Clojure?
Of course many languages can be used to create or serve websites. If language doesn't matter, then why not Scheme? It's at least as capable as the languages mentioned. OTOH much less is written about Scheme vs. more "mainstream" languages. Maybe that does make a difference.
At the top of the program you import Web Libraries. is it some standard Scheme web framework that you're using?
* ;; re-running this source bumps the generation; the old loop sees it ;; and lets go (js-eval "globalThis.__hero_gen = (globalThis.__hero_gen || 0) + 1") (define gen (js->number (js-get (js-global) "__hero_gen"))) (letrec ((tick (lambda _ (when (= gen (js->number (js-get (js-global) "__hero_gen"))) (frame!) (js-method (js-global) "requestAnimationFrame" tick))))) (js-method (js-global) "requestAnimationFrame" tick))
Is this the part where it is compiled?