Taking a break from pytorch, I spent the weekend learning Forth.
Stack languages incited confusion and fear in me, but now.. I have Sonnet 3.5 haha!
The prompt was simple "i want to learn forth, i understand the basic stack ops, but teach me more, loops and words and more complicated things" and so it started.. loops, allot, cells, return stack, custom types, recursion etc.
I just kept asking it, every word, every symbol that confused me, asking about the same thing from different angles, from writing a tiny interpreter to 'macro expanding', breaking down expressions and rewriting them in various ways.
I set 1 hour intervals, and don't do anything else besides switching between emacs and sonnet, blasting Cyberpunk 2077 Radio, and playing in gforth, 5 minutes break, and then go again.
Now I can make tic-tac-toe :)
I understand now why http://collapseos.org/ is a Forth operating system, the language allows for such sophisticated constructs, and yet it is so small and elegant, I regret not diving into it earlier.
What kind of teacher would the Opus 3.5 be? or GPT5?
I CAN'T WAIT!
I think it is important to learn different languages, like LISP vs C vs Forth, it is amazing when a language twists your point of view, makes you question everything, and see the world differently, inspire new ideas and have new thoughts.
Just like subject-object-verb (japanese - cows grass eat) vs subject-verb-object (english - cows eat grass), or object-subject-verb (warao - grass cows eat), each forces you to think differently.
I wish they thought some SOV or SVO languages daughter's school, instead of 4 SVO languages, dutch, german, english and french, though.. 96 quatre-vingt-seize (4*20+16) is quite funny.
There is nothing stopping you now, open Sonnet and just start typing.
create board 9 allot : board[] board + ; : reset-board ( -- ) 9 0 do '-' i board[] c! loop ; : print ( -- ) 3 0 do \ j 3 0 do \ i j 3 * i + board[] c@ emit loop cr loop ; : check-line ( a b c -- flag ) board[] c@ rot board[] c@ rot board[] c@ dup '-' = if drop drop drop 0 else over \ a b c -> a b c b = \ a b c==b rot rot \ c==b a b = \ c==b a==b and \ c==b && a==b then ; : check-win ( -- ) 0 1 2 check-line if 1 exit then 3 4 5 check-line if 1 exit then 6 7 8 check-line if 1 exit then 0 3 6 check-line if 1 exit then 1 4 7 check-line if 1 exit then 2 5 8 check-line if 1 exit then 0 4 8 check-line if 1 exit then 2 4 6 check-line if 1 exit then 0 ; : play ( -- ) 'X' 'O' begin over emit ." 's turn" cr print over key '0' - board[] c! swap 1 check-win = if print cr emit ." wins" cr exit then again ; reset-board play bye
create w 50 allot create g 50 allot s" hello" w place : d ." Stack: " .s cr ; : print ( addr -- ) dup c@ 0 do dup 1+ i + c@ emit loop drop ; : setup ( -- ) w g w c@ move g 1+ w c@ '-' fill ; : play 10 \ lives begin g print cr dup . ." lives left, guess a character: " key cr false w c@ 0 do over w 1+ i + c@ = if w 1+ i + c@ g 1+ i + c! drop true then loop nip 0 = if 1 - dup 0 = if ." you lose " cr exit then then w 1+ w c@ g 1+ w c@ compare 0 = if ." you win " cr exit then again ; setup play bye