[HN Gopher] Web Embeddable Common Lisp
       ___________________________________________________________________
        
       Web Embeddable Common Lisp
        
       Author : todsacerdoti
       Score  : 141 points
       Date   : 2025-06-25 15:33 UTC (1 days ago)
        
 (HTM) web link (turtleware.eu)
 (TXT) w3m dump (turtleware.eu)
        
       | tempodox wrote:
       | > Are we consing yet?                 > #'cons       #<compiled-
       | function CONS 0x43cee0>
       | 
       | That's a definite yes :)
        
       | jackdaniel wrote:
       | This is just a test page. Today I've shared an information about
       | an accepted grant proposal:
       | 
       | https://functional.cafe/@jackdaniel/114742776265318353
       | 
       | The work will go towards improving browser integration and
       | porting to WASI.
        
         | remexre wrote:
         | Will this include some form of SLIME support?
        
           | jackdaniel wrote:
           | I didn't plan explicitly for SLIME, but loading swank
           | shouldn't be much of a problem. The missing piece would be a
           | bridge between a websocket and tcp I think.
        
       | HexDecOctBin wrote:
       | Is WASM a good target for REPL-driven programming? I haven't
       | studied it in detail, but I do remember that it was Harvard
       | architecture. Would that mean that code can't be updated at
       | runtime in real implementations?
        
         | jackdaniel wrote:
         | ECL features native code and bytecodes vm for targets without
         | incremental compilation support - both native and bytecode can
         | be freely mixed at runtime.
         | 
         | That means that you may interactively use repl to call
         | functions that were compiled ahead of time and to add new
         | functions even on uncooperative targets.
         | 
         | After you've finished prototyping you may compile the finished
         | library to native ahead of time.
        
         | DonHopkins wrote:
         | It is, actually! I didn't realize that until I read the
         | handwritten WASM s-expression source code of WAForth.
         | 
         | Languages like Lisp or Forth that run on WASM -- or even
         | handwritten s-expression-style WASM code like in the WAForth
         | kernel -- can dynamically compile and assemble new WASM
         | bytecode and data. They can then call back to the JavaScript
         | host to create and link entirely new WASM modules on the fly,
         | and immediately call into them from the current module or
         | others. A single WASM context can juggle many dynamic modules,
         | large and small, all generated and linked at runtime!
         | 
         | So you can compile new code in Forth or Lisp and immediately
         | link and call it using indirect cross-module calls. It's not
         | the fastest way to call into WASM, but a metacompiler -- like
         | Mitch Bradley's ForthMacs / OpenFirmware -- could recompile the
         | whole system into one efficient, monolithic WASM module that
         | uses direct calls.
         | 
         | Here's the author's blog post about WAForth:
         | 
         | A Dynamic Forth Compiler for WebAssembly
         | 
         | https://el-tramo.be/blog/waforth/
         | 
         | https://news.ycombinator.com/item?id=34374057
         | 
         | DonHopkins on Jan 13, 2023 | parent | context | favorite | on:
         | What the hell is Forth? (2019)
         | 
         | This is a great article! I love his description of Forth as "a
         | weird backwards lisp with no parentheses".
         | 
         | https://blog.information-superhighway.net/what-the-hell-is-f...
         | 
         | Reading the source code of "WAForth" (Forth for WebAssembly)
         | really helped me learn about how WebAssembly works deep down,
         | from the ground up.
         | 
         | It demonstrates the first step of what the article says about
         | bootstrapping a Forth system, and it has some beautiful hand
         | written WebAssembly code implementing the primitives and even
         | the compiler and JavaScript interop plumbing. We discussed the
         | possibility of developing a metacompiler in the reddit
         | discussion.
         | 
         | I posted this stuff about WAForth and a link to a reddit
         | discussion with its author in the hn discussion of "Ten
         | influential programming languages (2020)":
         | 
         | https://news.ycombinator.com/item?id=34056735
         | 
         | Yes, I agree FORTH should be probably be on the list, at least
         | if the list was a few languages longer, for as influential as
         | it's been.
         | 
         | WAForth for WebAssembly is beautiful and modern!
         | 
         | https://github.com/remko/waforth
         | 
         | It's a lovingly crafted and hand written in well commented
         | WebAssembly code, using Racket as a WebAssembly macro pre-
         | processor.
         | 
         | I learned so much about WebAssembly by reading this and the
         | supporting JavaScript plumbing.
         | 
         | The amazing thing is that the FORTH compiler dynamically
         | compiles FORTH words into WebAssembly byte codes, and creates
         | lots of tiny little WebAssembly modules dynamically that can
         | call each other, by calling back to JavaScript to dynamically
         | create and link modules, which it links together in the same
         | memory and symbol address space on the fly! A real eye opener
         | to me that it was possible to do that kind of stuff with
         | dynamically generated WebAssembly code! It has many exciting
         | and useful applications in other languages than FORTH, too.
         | 
         | Lots more discussion and links in the reddit article.
         | 
         | But here's the beef, jump right in:
         | 
         | https://github.com/remko/waforth/blob/master/src/waforth.wat
         | 
         | Reddit /r/Forth discussion of WAForth:
         | 
         | https://www.reddit.com/r/Forth/comments/zmb4eb/waforth_wasmb...
         | 
         | remko:
         | 
         | Author here
         | 
         | If you can't be bothered to install VS Code, you can have a
         | look at a standalone version of the example notebook (in a 26kB
         | self-contained page).
         | 
         | And if you're planning to go to FOSDEM 2023, come say hi: I'll
         | be giving a talk there on WebAssembly and Forth in the
         | Declarative and Minimalistic Computing devroom.
         | 
         | DonHopkins:
         | 
         | I really love your tour-de-force design and implementation of
         | WAForth, and I have learned a lot about WebAssembly by reading
         | it. Never before have I seen such beautiful meticulously hand
         | written and commented WebAssembly code.
         | 
         | Especially the compiler and runtime plumbing you've implemented
         | that dynamically assembles bytecode and creates WebAssembly
         | modules for every FORTH word definition, by calling back to
         | JavaScript code that pulls the binary bytecode of compiled
         | FORTH words out of memory and creates a new module with it
         | pointing to the same function table and memory.
         | 
         | WebAssembly is a well designed open standard that's taking over
         | the world in a good way, and it also runs efficiently not just
         | in most browsers and mobile smartphones and pads, but also on
         | the desktop, servers, cloud edge nodes, and embedded devices.
         | And those are perfect target environments for FORTH!
         | 
         | What you've done with FORTH and WebAssembly is original,
         | brilliant, audacious, and eye-opening!
         | 
         | I'd read the WebAssembly spec before, and used and studied the
         | Unity3D WebAssembly runtime and compiler to integrate Unity3D
         | with JavaScript, and I also studied the AssemblyScript subset
         | of TypeScript targeting WebAssembly and its runtime, and also
         | Aaron Turner's awesome wasmboy WebAssembly GameBoy emulator .
         | 
         | I first saw your project a few years ago and linked to it in
         | this Hacker News discussion about Thoughts on Forth Programming
         | because I thought it was cool, but it's come a long way in
         | three years, and I'm glad I finally took the time to read some
         | of your code, which was well worth the investment of time.
         | 
         | Until reading your code, I didn't grasp that it was possible to
         | integrate WebAssembly with JavaScript like that, and use it to
         | dynamically generate code the way you have!
         | 
         | Also, the way you used Racket as a macro assembler for
         | WebAssembly was a practical and beautiful solution to the
         | difficult problem of writing maintainable WebAssembly code by
         | hand.
         | 
         | Even for people not planning on using FORTH, WAForth is an
         | enlightening and useful example for learning about WebAssembly
         | and its runtime, and a solid proof of concept that it's
         | possible to dynamically generate and run WebAssembly code on
         | the fly, and integrate a whole bunch of tiny little WebAssembly
         | modules together.
         | 
         | Playing with and reading through your well commented code has
         | really helped me understand WebAssembly and TypeScript and the
         | surface between them at a much deeper level. Thank you for
         | implementing and sharing it, and continuing to improve it too!
         | 
         | remco:
         | 
         | Wow, thanks a lot, I really appreciate that! It makes me very
         | happy that I was able to get someone to learn something about
         | WebAssembly by reading the source code, which is exactly what I
         | was going for.
         | 
         | [More links and discussion of WAForth, WebAssembly, and Forth
         | Metacompilers:]
         | 
         | https://www.reddit.com/r/Forth/comments/zmb4eb/waforth_wasmb...
         | 
         | Here's the author's blog post about WAForth: A Dynamic Forth
         | Compiler for WebAssembly
         | 
         | https://el-tramo.be/blog/waforth/
         | 
         | https://news.ycombinator.com/item?id=34374057
         | 
         | DonHopkins on Jan 13, 2023 | parent | context | favorite | on:
         | What the hell is Forth? (2019)
         | 
         | This is a great article! I love his description of Forth as "a
         | weird backwards lisp with no parentheses".
         | 
         | Reading the source code of "WAForth" (Forth for WebAssembly)
         | really helped me learn about how WebAssembly works deep down,
         | from the ground up.
         | 
         | It demonstrates the first step of what the article says about
         | bootstrapping a Forth system, and it has some beautiful hand
         | written WebAssembly code implementing the primitives and even
         | the compiler and JavaScript interop plumbing. We discussed the
         | possibility of developing a metacompiler in the reddit
         | discussion.
         | 
         | I posted this stuff about WAForth and a link to a reddit
         | discussion with its author in the hn discussion of "Ten
         | influential programming languages (2020)":
         | 
         | https://news.ycombinator.com/item?id=34056735
         | 
         | Yes, I agree FORTH should be probably be on the list, at least
         | if the list was a few languages longer, for as influential as
         | it's been.
         | 
         | WAForth for WebAssembly is beautiful and modern!
         | 
         | https://github.com/remko/waforth
         | 
         | It's a lovingly crafted and hand written in well commented
         | WebAssembly code, using Racket as a WebAssembly macro pre-
         | processor.
         | 
         | I learned so much about WebAssembly by reading this and the
         | supporting JavaScript plumbing.
         | 
         | The amazing thing is that the FORTH compiler dynamically
         | compiles FORTH words into WebAssembly byte codes, and creates
         | lots of tiny little WebAssembly modules dynamically that can
         | call each other, by calling back to JavaScript to dynamically
         | create and link modules, which it links together in the same
         | memory and symbol address space on the fly! A real eye opener
         | to me that it was possible to do that kind of stuff with
         | dynamically generated WebAssembly code! It has many exciting
         | and useful applications in other languages than FORTH, too.
         | 
         | Lots more discussion and links in the reddit article.
         | 
         | But here's the beef, jump right in:
         | 
         | https://github.com/remko/waforth/blob/master/src/waforth.wat
         | 
         | Reddit /r/Forth discussion of WAForth:
         | 
         | https://www.reddit.com/r/Forth/comments/zmb4eb/waforth_wasmb...
         | 
         | remko:
         | 
         | Author here
         | 
         | If you can't be bothered to install VS Code, you can have a
         | look at a standalone version of the example notebook (in a 26kB
         | self-contained page).
         | 
         | And if you're planning to go to FOSDEM 2023, come say hi: I'll
         | be giving a talk there on WebAssembly and Forth in the
         | Declarative and Minimalistic Computing devroom.
         | 
         | DonHopkins:
         | 
         | I really love your tour-de-force design and implementation of
         | WAForth, and I have learned a lot about WebAssembly by reading
         | it. Never before have I seen such beautiful meticulously hand
         | written and commented WebAssembly code.
         | 
         | Especially the compiler and runtime plumbing you've implemented
         | that dynamically assembles bytecode and creates WebAssembly
         | modules for every FORTH word definition, by calling back to
         | JavaScript code that pulls the binary bytecode of compiled
         | FORTH words out of memory and creates a new module with it
         | pointing to the same function table and memory.
         | 
         | WebAssembly is a well designed open standard that's taking over
         | the world in a good way, and it also runs efficiently not just
         | in most browsers and mobile smartphones and pads, but also on
         | the desktop, servers, cloud edge nodes, and embedded devices.
         | And those are perfect target environments for FORTH!
         | 
         | What you've done with FORTH and WebAssembly is original,
         | brilliant, audacious, and eye-opening!
         | 
         | I'd read the WebAssembly spec before, and used and studied the
         | Unity3D WebAssembly runtime and compiler to integrate Unity3D
         | with JavaScript, and I also studied the AssemblyScript subset
         | of TypeScript targeting WebAssembly and its runtime, and also
         | Aaron Turner's awesome wasmboy WebAssembly GameBoy emulator .
         | 
         | I first saw your project a few years ago and linked to it in
         | this Hacker News discussion about Thoughts on Forth Programming
         | because I thought it was cool, but it's come a long way in
         | three years, and I'm glad I finally took the time to read some
         | of your code, which was well worth the investment of time.
         | 
         | Until reading your code, I didn't grasp that it was possible to
         | integrate WebAssembly with JavaScript like that, and use it to
         | dynamically generate code the way you have!
         | 
         | Also, the way you used Racket as a macro assembler for
         | WebAssembly was a practical and beautiful solution to the
         | difficult problem of writing maintainable WebAssembly code by
         | hand.
         | 
         | Even for people not planning on using FORTH, WAForth is an
         | enlightening and useful example for learning about WebAssembly
         | and its runtime, and a solid proof of concept that it's
         | possible to dynamically generate and run WebAssembly code on
         | the fly, and integrate a whole bunch of tiny little WebAssembly
         | modules together.
         | 
         | Playing with and reading through your well commented code has
         | really helped me understand WebAssembly and TypeScript and the
         | surface between them at a much deeper level. Thank you for
         | implementing and sharing it, and continuing to improve it too!
         | 
         | remco:
         | 
         | Wow, thanks a lot, I really appreciate that! It makes me very
         | happy that I was able to get someone to learn something about
         | WebAssembly by reading the source code, which is exactly what I
         | was going for.
         | 
         | [More links and discussion of WAForth, WebAssembly, and Forth
         | Metacompilers:]
         | 
         | https://www.reddit.com/r/Forth/comments/zmb4eb/waforth_wasmb...
        
           | fsckboy wrote:
           | > _Yes, I agree FORTH should be probably be on the list, at
           | least if the list was a few languages longer, for as
           | influential as it 's been._
           | 
           | Forth has not been influential, at all. If it was your first
           | or second encounter with computers, it might have been
           | influential on you, which is a great thing for you, but it
           | was not influential on the industry.
           | 
           | the late 70's-early 80's was the beginning of the
           | microprocessor era. This opened the door to computers for
           | people who would be interested in computers but had no access
           | prior. But the "leading" people in computer science at that
           | time were the people who did already have access to
           | computers. This created a bifurcation between the people who
           | were, say, pursuing lisp since 1960 because of what they had
           | learned about lambda calculus before, and people pursuing
           | Forth who had never heard of Lisp, but had heard of Pascal
           | but didn't realize that UCSD Pascal was a p-code stack
           | machine just like Forth was; if they had realized it there
           | might have been overlap, there wasn't. Programmable HP
           | calculators were already more advanced since the HP-65
           | 
           | (please don't nitpick me, if you remember that time, you know
           | what i'm talking about.) The much revered Dr Dobbs and Byte
           | magazine were not on the reading list of people who were at
           | MIT or Carnegie or Stanford. If you graduated at that time
           | (hint hint) you had this choice of working at a place like
           | Microsoft (DOShit in the boonies) or Apple (8-bit 6502
           | nonsense on an OS nobody remembers) or at DEC or HP or Xerox
           | or BBN, companies pursuing excellence based on the already-
           | history of CS.
           | 
           | because microprocessor "ate the world", the early history of
           | microprocessors seems "important": it wasn't, except for what
           | it became
           | 
           | when Apple and Microsoft borrowed ideas from Xerox PARC to
           | create MacOs and Microsoft Windows, they were borrowing from
           | programmable microcode architectures which are still more
           | interesting than amd64
        
             | DonHopkins wrote:
             | >Forth has not been influential, at all.
             | 
             | Yes, you're right.
             | 
             | https://www.youtube.com/watch?v=KTFDS-MGFK0
             | 
             | The answer was, of course, number two! (cut to stock film
             | of Women's Institute applauding) I'm afraid there's been an
             | error in our computer. The correct answer should of course
             | have been number four, and not Katy Boyle. Katy Boyle is
             | not a loony, she is a television personality. (fanfare as
             | for historical pageant; a historical-looking shield comes
             | up on screen) And now it's time for 'Spot the Loony,
             | historical adaptation'. (historical music) And this time
             | it's the thrilling medieval romance 'Ivanoe'... a stirring
             | story of love and war, violence and chivalry, set midst the
             | pageantry and splendour of thirteenth-century England. All
             | you have to do is, 'Spot the Loony'.
             | 
             | And now a word from our sponsors, Looney Labs, makers of
             | fine card games whose rules and conditions for winning
             | change throughout the game, including the most popular
             | among machine learning AI enthusiasts, Python FLUXX, the
             | first set to have the Meta Rule subtype card, which stemmed
             | from a FLUXX Tournament rule:
             | 
             | https://www.looneylabs.com/games/monty-python-fluxx
             | 
             | >Yes, that crazy card game where the rules keep changing
             | has joined forces with Monty Python to create the Looneyest
             | card game ever! Help King Arthur and his Knights find the
             | Holy Grail. Bring a Shrubbery to the Knights Who Say Ni!
             | Lob the Holy Hand Grenade at the Killer Rabbit with Nasty
             | Big Teeth! Just do it quick, before the Goal changes again!
             | 
             | Doctor Who FLUXX:
             | 
             | https://store.looneylabs.com/collections/fluxx-
             | games/product...
             | 
             | >Doctor Who Fluxx takes Fluxx through Time And Relative
             | Dimension In Space. Join with various regenerations of the
             | Doctor, some companions, Gallifreyan tech, and K-9 (but
             | beware of Cybermen, Daleks, Weeping Angels, and the Master)
             | and play the most ever-changingest, timey-wimey version of
             | Fluxx ever created. Doctor Who Fluxx: you'll play it time
             | after time after time after time...
             | 
             | Stoner FLUX:
             | 
             | https://store.looneylabs.com/collections/fluxx-
             | games/product...
             | 
             | >Put on some good music and line up some snacks... Stoner
             | Fluxx is a game about toking with your friends, getting the
             | munchies, and changing the rules.
             | 
             | >Our country seems to be moving closer to finally
             | legalizing marijuana at the national level, so we have
             | completely removed the warning messages on the cards
             | instead of only adjusting them a bit like we have with each
             | print run in the past.
             | 
             | MEET THE LOONIES:
             | 
             | https://store.looneylabs.com/pages/about-us
             | 
             | >Looney Labs was founded in 1997 by two former NASA
             | engineers named Looney. The husband and wife team have been
             | creating fun ever since, with Andy inventing the games, and
             | Kristin running the company. Along with the help of four
             | other full-time employees, several part-timers, and an army
             | of fans, the Looneys are changing the way you play!
             | 
             | ABOUT FLUXX:
             | 
             | https://en.wikipedia.org/wiki/Fluxx
             | 
             | >Fluxx is a card game published by Looney Labs. It is
             | different from most other card games, in that the rules and
             | the conditions for winning are altered throughout the game,
             | via cards played by the players.
        
         | runlaszlorun wrote:
         | I'd use the analogy of current dynamic language VMs being
         | written C. You're not modifying structs at runtime or creating
         | C functions as a user of the dynamic language. But the creators
         | of the VM are providing as thin a layer as possible on top of
         | that to give the runtime behavior it's dynamism.
         | 
         | There's an often repeated line that WebAssembly isn't really
         | "assembly" and it's not "web". There's a lot of truth to that.
         | I dove in hoping for a cross platform, web enabled assembly. It
         | looks a lot like an assembly but I find it's relatively few
         | restrictions like lack of a true jump command rippling out more
         | than one would have expected. It's also sortuva stack machine
         | and sortuva register machine at the same time.
         | 
         | It does share a lot with the internal VMs in many places like
         | the JVM, Python's VM, .net, etc.
        
           | DonHopkins wrote:
           | "I'm a little verklempt. Talk amongst yourselves. I'll give
           | you a topic: WebAssembly is neither Web nor Assembly.
           | Discuss." -Your Host, Linda Richman
           | 
           | https://www.youtube.com/watch?v=oiJkANps0Qw
        
         | ethan_smith wrote:
         | Modern WASM implementations use JIT compilation with dynamic
         | code generation capabilities that effectively bypass the
         | Harvard architecture limitations, allowing for runtime code
         | updates through module instantiation and function replacement.
        
       | potholereseller wrote:
       | Apparent source code, though last update is January 1, 2025:
       | https://fossil.turtleware.eu/wecl/timeline
        
       | jinlisp wrote:
       | When executing (time (loop for i below (expt 10 8) count t)) it
       | takes a long time, sbcl takes less than a second on this. So not
       | useful when speed is required. More: (time (loop for i below
       | 1000000 count t) takes 7 seconds on my computer, so counting to
       | (exp 10 8) would take 700 seconds, and sbcl do that in 0.1
       | seconds, so in this example the ratio is 7000 times slower than
       | sbcl.
        
         | jackdaniel wrote:
         | Bytecodes compiler used in this build from repl is one-pass
         | with very little optimizations, so it is not surprising.
         | Natively compiled code is much faster.
        
           | jinlisp wrote:
           | Should it be possible to implement an optimization compiler?
           | so that compiling the code in the web page produces results
           | similar to ECL or sbcl?
        
             | jackdaniel wrote:
             | With enough code - yes. But not right now. You may
             | precompile to native though.
        
         | mishoo wrote:
         | In SLip: https://lisperator.net/s/slip/                   SL-
         | USER> (time (loop for i below (expt 10 8) count t))
         | Evaluation time: 19376ms         100000000              SL-
         | USER> (time (loop for i below 1000000 count t))
         | Evaluation time: 272ms         1000000              SL-USER>
         | (defun fib (n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2)))))
         | #'FIB         SL-USER> (time (fib 32))         Evaluation time:
         | 1601ms         2178309
         | 
         | These timings are in Firefox; Chromium is almost 2x faster.
         | Also, it doesn't completely freeze the browser in the mean time
         | (we have green threads).
         | 
         | I used to think it's quite slow, but somehow it's much faster
         | than any other posted here. The only Lisp in browser I know to
         | beat SLip (by a large margin) is JSCL, which compiles to JS.
        
           | jinlisp wrote:
           | Both slip and jscl takes the same time in my computer: 63
           | seconds to run the loop.
        
             | mishoo wrote:
             | Hm, you're right, JSCL seems abnormally slow on this loop
             | (27.5 sec here). SLip consistently takes 19.3 sec. My CPU
             | is rather beefy (Ryzen 9 HX 370). What's your hardware and
             | browser?
             | 
             | But JSCL is much faster on the fib example, that's why I
             | thought it should be generally faster. After all, it
             | compiles to JS.
        
             | mishoo wrote:
             | I can see what happens there in JSCL.. I took a look at
             | (disassemble (lambda () (loop for i below (expt 10 8) count
             | t)))
             | 
             | Seems TAGBODY is compiled into a while(true) which sets an
             | exception handler on each iteration. (and then, LOOP
             | macroexpands into a TAGBODY). I don't think there's a
             | better way to do it, BTW -- JS is simply not a friendly
             | compilation target. But `try` on each iteration is quite
             | costly, that's most probably the bottleneck here.
        
       | jinlisp wrote:
       | I was going to ask if maxima (a symbolic computation system) can
       | be implemented in the browser, but it was answered four months
       | ago [1]
       | 
       | [1] https://news.ycombinator.com/item?id=42853528
        
         | mixedmath wrote:
         | Do you use maxima? Would you say it's still worth using and
         | learning?
        
           | jinlisp wrote:
           | It depends of what you need, but for example for calculus is
           | a nice program. There is also sympy and Wolfram Mathematica.
           | For symbolic computation I think that Mathematica is the
           | strongest then maxima and then sympy, but sympy is based on
           | python and I think it will get stronger. If you need
           | numerical computation then there is octave or matlab or
           | julia.
        
             | mrbungie wrote:
             | For symbolic computation there is also Maple (*shudders at
             | the thought*).
        
           | johnisgood wrote:
           | Yes, I think it is worth learning. GNU units is worth
           | learning, too. You know these math riddles? You can solve it
           | using GNU units alone. :D
        
             | anthk wrote:
             | Qalc from libqalculate it's a mini-maxima.
        
       | jinlisp wrote:
       | This is another comment of the author about maxima in the browser
       | from four months ago: I'm experimenting with WASI and the GC
       | extension for WASM, but that's months from today if we speak
       | about complete port (given my time capacity at the moment). Don't
       | know if the gc extension is used in this example.
        
       | bevr1337 wrote:
       | Why was LISP not one of the first languages able to compile to
       | WASM? I've been curious ever since the awesome WASM project
       | started tracking different projects. They use emojis for progress
       | and LISP has been a hatching egg.
        
         | no_wizard wrote:
         | It sorta has been. As a language design it is already native
         | via the WAT[0] which compiles to web assembly.
         | 
         | [0]:
         | https://webassemblyman.com/wat_webassembly_text_format.html
        
           | bevr1337 wrote:
           | Do you know why only sorta? My understanding is that only toy
           | implementations exist right now but nothing production ready.
           | I'm poking around Google and GitHub and not finding any new
           | information.
           | 
           | > Implementing Lisp onto WebAssembly is so obvious that you
           | may wonder why somebody did not have this idea long ago.
           | 
           | I did find this on the Femto GitHub and got a chuckle. Yes,
           | dear author, that is exactly the piece of information I want
           | explained. Too funny.
        
             | no_wizard wrote:
             | It doesn't have to very last trapping of a proper LISP if I
             | recall correctly is why I say kinda.
             | 
             | It's an S expression language though with some similarities
             | to LISP
        
               | bevr1337 wrote:
               | Thanks for clarifying. I've been speculating on this for
               | a while but haven't had the chops to know what to
               | research. The details folks are providing are yielding
               | much better search results.
        
         | dmkolobov wrote:
         | If I had to guess:
         | 
         | 1. lack of native GC, you had to roll your own by providing a
         | runtime.
         | 
         | 2. lack of tail-call elimination in V1 of the spec. This
         | essentially forces you to trampoline everything.
        
           | stassats wrote:
           | > lack of tail-call elimination
           | 
           | But lisp doesn't need TCO.
        
             | bevr1337 wrote:
             | Whoa, what a surprising fact! I had not considered TCO in
             | LISP was "nice to have." That's a good example where it's
             | easy to hack but hard to make production ready.
        
             | dreamcompiler wrote:
             | Common Lisp doesn't technically require TCO but Scheme
             | does.
             | 
             | IMHO a Common Lisp without TCO is not a serious tool
             | because I cannot write tail-recursive code with it.
        
               | wavemode wrote:
               | Typical programming style in Common Lisp is procedural,
               | not functional.
               | 
               | The CL spec doesn't guarantee tail-call elimination, and
               | most CL implementations don't guarantee it either (it
               | could be on or off depending on the current optimization
               | level). So most people don't bother relying on it.
        
               | dreamcompiler wrote:
               | True. My CL code is atypical because I prefer functional
               | style to iterative style. I know how to use declarations
               | to turn on TCO for implementations that support it, which
               | is most of the big ones. ABCL being a notable exception.
        
       | b0a04gl wrote:
       | tbh imo the slowness isn't the bottleneck. browser bytecode's
       | always gonna trail native, that's a given. what matters is you're
       | feeding live eval into static pages. lisp as a runtime inside the
       | web, not around it.
       | 
       | if wasm interop clicks, even at shared memory level, lisp can
       | directly drive ui updates. state changes, you eval, dom shifts.
       | pure control flow without detour
        
       | jackdaniel wrote:
       | Btw, eval (ed "wecl.lisp") to see some interesting function
       | definitions, like canvas or webgl access drafts.
        
       | deosjr wrote:
       | I recently shared a project I did using Hoot, by Spritely
       | institute. It's Guile Scheme compiling to WASM, and it works
       | really well! See https://spritely.institute/hoot/
       | 
       | Latest on my project, in case you want to try it out:
       | https://deosjr.github.io/dynamicland/whiskers.html
        
       | feeley wrote:
       | Related:
       | 
       | The Gambit Scheme REPL that comes with a tutorial, supports
       | threads in the browser and has a JS FFI:
       | https://try.gambitscheme.org
       | 
       | Gambit in emacs in the browser: https://feeley.github.io/gambit-
       | in-emacs-in-the-browser/
        
         | mishoo wrote:
         | Hey, nice to see Ymacs is still used somewhere else than on my
         | website :)
         | 
         | I don't know if you've been tracking it lately, but there was a
         | big overhaul last year [1]. The version in your second link
         | doesn't seem to work in current Firefox. If you'd like to
         | update and need any help, please feel free to get in touch.
         | (also, there's still some of your code in Ymacs :) although I
         | kinda broke filename completion...)
         | 
         | [1] https://lisperator.net/blog/ymacs-reloaded/
        
       ___________________________________________________________________
       (page generated 2025-06-26 23:02 UTC)