colorful rat Ratfactor.com > Dave's Repos

snobol4th

A Forth written in Snobol4
git clone http://ratfactor.com/repos/snobol4th/snobol4th.git

snobol4th/log.txt

Download raw file: log.txt

1 2024-09-03 2 data array works. next: push/pop 3 4 2024-09-05 5 push and pop work 6 getting word tokens works 7 8 2024-09-06 9 dictionary name table works 10 11 Problem: I can easily store a token 12 sequence in the directionary. But 13 to make a return stack function 14 correctly, I would need to store 15 both the name *and* position of the 16 last call site? 17 18 Solution?: Instead of storing the 19 token sequences in separate table 20 entries, what if I store all source 21 in the same string and just store 22 pointers to it? 23 24 And if the return stack is empty, 25 we're reading from stdin. 26 27 28 2024-09-10 29 30 Holy cow, this works: 31 32 : 2x DUP + ; 5 2x . CR 33 : 4x 2x 2x ; 5 4x . CR 34 35 Words calling words. So the return stack works. 36 Whew. Definitely had some tough bugs there for 37 a bit, but nothing some "print debugging" can't 38 fix. 39 40 2024-09-11 41 42 Well, now that my initial goal is accomplished, 43 I feel a bit aimless. 44 45 I could just start implementing various words, 46 but that doesn't exactly fill me with joy. 47 48 So I've decided to go get a new goal. 49 I've always liked the 99 Bottles of Beer exercise 50 where you print out the lyrics to the song 51 in your favorite programming language. 52 53 I found a good one and threw it into a 99.forth 54 file. 55 56 Is it weird that it's kind of a relief to see 57 errors so I know what to do next? No, it is not 58 weird. 59 60 $ snobol forth.sno <99.forth 61 ERROR: '(' not in dictionary. 62 ERROR: 'Bottles' not in dictionary. 63 ERROR: 'of' not in dictionary. 64 ERROR: 'Beer' not in dictionary. 65 ... 66 67 Looks like I need to implement "( ... )" comments 68 first. 69 70 This, of course, will cause a whole cascade of 71 other words needing to be defined. But that's the 72 whole idea. 73 74 It looks like the total list of words to implement 75 the traditional bootstrapped functionality needed 76 for 99 Bottles is something like: 77 78 ' ( +LOOP , - -1 . ." 0BRANCH 1- = ?DUP @ BEGIN 79 DO ELSE HERE I IF KEY SWAP THEN UNTIL [CHAR] 80 81 (To get this list, I did a little manual recursive 82 walk through JonesFORTH to get the definitions of 83 the words used in 99 Bottles.) 84 85 86 ' ( +LOOP , - -1 . ." 0BRANCH 1- = ?DUP @ BEGIN 87 DO ELSE HERE I IF KEY SWAP THEN UNTIL [CHAR] 88 89 90 ... Many days later ... 91 92 Went a totally different direction. Not slavishly 93 following traditional implementation of the Forth 94 words. Nope, just making straightforward Snobol 95 functions for what's needed for 99 Bottles. 96 97 ... Aaaaand, DONE ... 98 99 I guess I wasn't very good about keeping up the log 100 but I will have some conclusions about how this 101 went that I'll be writing somewhere.