00:00:00 --- log: started forth/06.08.01 00:20:56 --- quit: nighty_ (Client Quit) 00:43:28 --- quit: Amanita_Virosa ("wewps.") 01:08:04 --- log: started forth/06.08.01 01:08:04 --- join: clog (n=nef@bespin.org) joined #forth 01:08:04 --- topic: 'Welcome to #forth. We discuss the Forth programming language, simplicity, and a variety of technical subjects.' 01:08:04 --- topic: set by ayrnieu on [Thu Jun 22 20:55:25 2006] 01:08:04 --- names: list (clog segher_ Quartus_ uiuiuiu Snoopy42 virl warpzero Quiznos Raystm2 Zymurgy_ Shain saon Quartus madgarden jcw virsys nighty madwork ohub ccfg wart juri_ michaelw) 01:23:02 --- quit: Quartus_ (Read error: 110 (Connection timed out)) 01:30:18 --- log: started forth/06.08.01 01:30:18 --- join: clog (n=nef@bespin.org) joined #forth 01:30:18 --- topic: 'Welcome to #forth. We discuss the Forth programming language, simplicity, and a variety of technical subjects.' 01:30:18 --- topic: set by ayrnieu on [Thu Jun 22 20:55:25 2006] 01:30:18 --- names: list (clog segher_ uiuiuiu Snoopy42 virl warpzero Quiznos Raystm2 Zymurgy_ Shain saon Quartus madgarden jcw michaelw juri_ wart ccfg ohub madwork nighty virsys) 05:14:26 --- join: PoppaVic (n=pete@0-1pool64-136.nas22.chicago4.il.us.da.qwest.net) joined #forth 05:21:44 --- join: Quartus_ (n=Quartus_@209.167.5.1) joined #forth 05:24:23 morning 05:26:04 anyone awake yet? 05:26:16 yeah 05:27:40 have you figered out how to handle the situation where part of the dictionary is written out to a binary file for later, on-call reloading and execution, like linux binaries are? 05:28:32 where the part to be written is a complete and transient part that doesnt need to be present all the time? 05:28:46 I thought about it, but it would necessitate writing a relocable linking-loader and coming up with all the goodies of an assembler and ld. 05:28:58 that's too much; 05:29:09 OTOH, if you mean just the pcode, it's doable. 05:29:25 i've been think that with relative offsets in lfa and cfa, it would be easier 05:29:30 and pfa too 05:30:04 absolute addresses would be the primary problem 05:30:15 I have a bad feeling that living entirely with offsets could become really old, really fast - slowing up the system. 05:30:45 well, computers are fast enough now 05:30:52 I hate that excuse 05:30:59 it's the truth tho 05:31:25 Until idiots write idiotic code - same excuse with memory, too 05:31:35 at what point to we Forthers say 'speed is fast enuf?" 05:32:17 well, i'm done with such limited excuses. i'm moving on. 05:32:29 well for such little things they are more than fast enough. 05:32:38 the computers were fast enough when they hit 50mhz 05:32:43 I see know purpose in deliberately writing shit that is slower than it should be, or pre-optimizing. Same with data: some folks want to pray that there is an infinite amount. 05:32:59 know/no 05:33:26 Now, sure - if adding a level/layer of code over the basics slows the system a little, that's understood. 05:33:27 PoppaVic pls focus? we're discussing Forth code, not code in other HL language 05:33:31 languages 05:33:47 and we here in the channel dont write crap 05:33:48 :) 05:33:56 oh... 05:34:07 I see - all OTHER code is the problem, eh? 05:34:22 code in higher level languages is problematic 05:34:37 and btw. forth is one of the fastest interpreter/compiler languages around. 05:34:43 I never mentioned "another" language 05:34:47 i've always known that 05:35:03 PoppaVic "it's slow" is not a common forth complaint 05:35:34 and i think the overhead of one or asm insns in the next routine is acceptable 05:35:47 or two * 05:36:21 and even including debugging code to next for 24.7 debugging being available is ok too 05:36:44 and it's a 'normal' app not a special one like a game 05:36:55 the question is, to what base is the offset added to 05:37:22 well, when we think in C then types come into play. 05:37:36 it's an int it's an char offset.. 05:37:45 but we're not talking about c 05:37:46 :) 05:38:25 well, PoppaVic is coding his meta-thingy in C 05:38:29 I would think that a 'loader' would need a corresponding 'compiler', Quiznos. 05:39:00 ..an "generator" and "reloader", perhaps 05:39:02 compiler words can generate rel-offsets easily 05:39:49 as for a loader, so far i can only determine one word that links the new vocab into the current vocab 05:40:46 Seems likely that you'd want to compile the collection "normally" and then cut loose the generator/extractor. Perhaps it could also 'forget' back to where you began, and replace all that with a new word that marks the 'binary' and refers to it? 05:41:51 well the "generator/extractor" would be the normal compiler words - so the're not really connected. 05:42:05 why or what needs to be forgot? 05:42:31 presume you "load mystuff.f" 05:42:35 k 05:42:48 this would just run the normal interp/compile. 05:42:57 yes 05:43:23 Now, presume you can also say "modularize snarfle" 05:43:28 k 05:44:29 the first word is the generator, and the second is the dictionary-point we want to begin modularizing from. We already know that it all compiled if it loaded, right? So.. we are merely going to create that binary-object now. 05:44:45 --- join: vatic (n=cturner@pool-162-83-254-201.ny5030.east.verizon.net) joined #forth 05:44:59 k 05:45:48 It MIGHT be better to simply do "modularize mystuff.f", letting it temporarily replace the interp and compiler words - but it seems iffy and sloppy. 05:46:43 Quiznos: In any event, there are several ways to approach this mess, and the more I looked into it the more ill I got. 05:47:05 why are you thinking about interpreter and compiler words, i dont get that. as I see it, there's a word that saved a namespace to a binary file for later reloading. 05:47:21 this has to be as simple as possible. 05:47:36 the reason for rel-off is to avoid load-time style fixups 05:47:49 Quiznos: yeah, but when you can defer words and reorder loads and such, it starts to look hairy to me. 05:47:53 and by doing that only one word needs to be created at loading 05:48:25 doesnt DEFER compile to code that does a runtime tick and compile? 05:48:29 iirc, tathi had once suggested using mmaps. 05:48:41 thats interesting 05:48:54 but i wanna avoid using kernel stuf for the time-being 05:49:03 too much entanlgement issews 05:49:15 s/much/many 05:50:05 ok, so, what if deferals are avoided? 05:50:22 as in, modulated code cant use defers 05:50:36 or, s/modules/programs/g bc that's what i think they are 05:51:48 I honestly don't know, Q. I've decided - for now - to trust in a badass FAST interp/compile and just handle source at this time. 05:51:56 kk 05:53:13 I suspect it's a case of, "let's write a set of filters" 05:53:17 as i see it, (i have to restudy to recall) ['] is compiled into runtime (') that searches for unknown text at runtime. right? 05:53:29 source->module.. and module->dictionary 05:53:34 k 05:54:24 deferal is delayed until runtime to search for God knows what ;) 05:55:02 and not only searching but code that could be injected at runtime for execution 05:55:14 kinda like a virus 05:55:18 or a worm 05:58:47 --- join: Ray_work (n=Raystm2@199.227.227.26) joined #forth 06:03:38 --- join: timlarson_ (n=timlarso@65.116.199.19) joined #forth 06:05:58 Quiznos: oh.. yer suggesting defer acts like a worm, or the deferred word, or.. what? 06:06:07 --- join: timlarson____ (n=timlarso@65.116.199.19) joined #forth 06:06:46 --- quit: timlarson_ (Nick collision from services.) 06:06:51 --- nick: timlarson____ -> timlarson 06:07:21 --- join: timlarson_ (n=timlarso@65.116.199.19) joined #forth 06:07:33 well in a fully operational and networked Forth, a worm that tranfers itself around to machines via the 'net 06:07:51 no, not defer; defer is an "enabler" :) 06:07:58 ahh 06:08:07 heh, good word :) 06:08:10 I sorta' thought it was part of the issue. 06:08:10 enabler 06:08:24 Sure, people can be "enablers", too 06:08:26 it's a potential to be aware of with where i'm heading 06:08:51 Tis another reason I prefer source-input 06:08:55 k 06:09:01 bbiab, there's a breeze outside 06:28:00 breeze used up 06:28:35 hmm.. 06:30:08 breeze alld up 06:30:13 oops, all used up 06:31:39 I hate when the weather fucks my radio *sigh* 06:32:07 how's that happen? 06:32:20 iono* too high up? 06:32:30 Seems that Toledo's signals get bounced poorly or something. 06:32:51 * PoppaVic falls back on his Bob&Tom cd's 06:33:04 ah 06:35:04 * PoppaVic comes back to writing the 'instantiator' func. 06:38:21 Heh. I was looking at Quiznos comment about writing binary files, and that reminded me of a bug that I had a few days ago when I was writing the interpreter. 06:38:35 heh - fun shit, eh? 06:39:24 I was realloc()'ing the CFA area as I was adding words. Which resulted in the addresses getting all fried up whenever the pointer changed (sometimes realloc() returns the same pointer, if it can simply grow the area). 06:39:41 eww.. I hate realloc() 06:39:49 I love it. 06:40:01 it's misused far, far, FAR too often 06:40:18 All depends on what you're doing. There are times when it's right, times when it's not. 06:40:44 I prefer buffers, and then "lifting" results if valid and malloc will work. 06:42:03 Again, it all depends on what you're doing. 06:42:20 * PoppaVic shrugs 06:42:58 Like a lot of other funcs, when you NEED it - you need it bad. Otherwise, I avoid it like Plague. 06:43:24 What *would* be nice is a version to realloc() that zeros the newly allocated memory. 06:43:31 Not the entire block of course, that would be pointless. 06:43:43 But the area that it grew from to. 06:43:56 realloc is not difficult to overload, of course 06:44:34 Of course. 06:44:47 it's just a malloc (and maybe true realloc), and memcpy, and free - or failure. 06:46:04 Even easier (albeit a trifle slower) to calloc. 06:47:38 But, yeah.. I added some new code, then a few tests, and got blown away with spastic output.. Turned out I was forgetting to rezero a local struct and the stack was reusing a prior-ptr in it - and storing it. 06:48:45 ..so, a klass that had no members was picking up the previous klass' members. /homer 06:51:56 ooops 06:54:38 I've got mine running fairly nicely. I need to figure out how to work in CREATE/>DOES, however. Normally, it'd be pretty easy, but the way this is architected will require some thinking. 06:55:05 yeah, words like those can ruin yer whole day. 06:55:56 near as I can tell, there is mostly a word akin to 'semi' - like "does" 06:56:21 --- join: nighty_ (n=nighty@66-163-28-100.ip.tor.radiant.net) joined #forth 06:56:23 embedded, I mean.. Behavior-altering. 06:57:51 I suspect that ';' is to NEXT as ";;" or "does>" is to PSEUDONEXT 06:58:30 it gets less-than-amusing, translating between models and languages 06:58:36 I'm also trying to think of a decent way to implement an 'elseif' type word. The normal if/else/then leads to some fugly looking words. It needs to not require a 'dup' for every if. 06:58:42 Yah, that it does. 06:59:13 I've never really liked the forthish if...endif 06:59:20 Basically, consume the test value only if it's true, otherwise leave it on the stack for the next if. 06:59:34 No. And I swear by C's switch() statement. 07:00:00 I rarely use case/switch - but it's fine for limited alternatives. 07:00:24 Perhaps you need a test/offset/exec set 07:00:59 Hmmm. What would that look like? 07:01:27 hmm... Not sure, there ARE forth docs on vectoring words. 07:01:50 basically, true/false vtable versus cases 07:01:56 I wrote some colon definitions to support vectored execution, but without tests 07:02:17 Yeah, I'm still far below the interpreter, let alone compiler. 07:02:23 rxStateTable 07:02:23 jumpTableStart 07:02:23 ' rxStateMachineSigil jumpTableEntry 07:02:23 ' rxStateMachineAddress jumpTableEntry 07:02:27 jumpTableEnd 07:02:36 It's not elegant, but it does work. 07:02:45 Especially since I don't have create/does. 07:03:14 Historical forths might help. 07:03:51 I've got mostly "information overload", except I have to discount a lot of "asm" 07:04:25 One of the more impressive Forths out there, IMHO, is Tom Zimmermans FPC. It's amazing how much work one guy did. 07:04:54 Yep. F83 and FPC were really nice, given the limits and platforms 07:04:56 jcw, calloc() erases the allocated vector 07:05:23 Yes, I use that all the time. I prefer it, in most cases, over malloc. 07:05:34 Quiznos: which is fine, if yer next step is a test - and then memcpy. 07:05:38 especially if I'm storing any pointers in the allocated memory... 07:06:24 jcw: ##C purists will argue that '0' doesn't, but.. That's only viewpoint-valid 07:07:10 that '0' doesn't what? 07:07:43 well, NULL doesn't have to be zeroes; and (of course) floats and doubles are odd, too 07:07:59 If you're talking about NULL != 0, I'm not worried about the two obsolete arichtectures that don't use 0 for NULL. 07:08:02 I usually ignore the detractors, however 07:08:12 jcw: yeppers 07:08:44 to me, zero is zero - not +0 or -0 or -foo - zero. 07:08:52 Excatly. 07:08:56 Exactly, event. 07:08:58 gah... 07:09:29 now, if some funcs can use -0/0/+0 for "tendencies" or "directions", fine. 07:09:31 It's far more worrisome having to deal with binary data on multiple endian architectures. 07:09:58 I have one program that makes a test when it starts and says "Sorry, I don't run on Sun machines." and exits. 07:10:11 This is why I write funcs and code to ascertain "where the fuck am I?" and otherwise just write C 07:11:06 Sun's are not even that bad... Took me awhile, but I could end up coding on linux and ftp to the sun/solaris-box, and back & forth 07:12:07 comprehooded 07:12:18 Oh, I have nothing against Suns in particular. It's just that this app had to deal with lots of binary data, I didn't have funding to make sure it ran on large endian machines, and I knew the customer had Sun boxes (about 1 in 10 to x86). So I just made sure nothing bad would happen. 07:14:23 funding??? wtf is "funding"? ;-/ 07:14:32 Budget? 07:14:59 Dude, I never get paid for code - "funding" is a wetdream. 07:15:16 heh 07:15:19 How do you pay for beer? 07:15:23 Or RAM? 07:15:31 funding is "subsidy" :) 07:15:42 I live at home, trying to take care of Mum and the farmstead. 07:15:44 scratch, cabbage, green 07:15:59 07:16:14 EPUs 07:16:19 ? 07:16:29 (Economic Participatory Units) 07:16:40 lol 07:16:44 FRNs 07:16:46 jokes 07:16:49 toilet paper 07:16:53 FRNs? 07:16:59 (not to be confussed with HolyPaper) 07:17:10 Federal Reserve Notes (negotiable instruments) 07:17:15 evidence of debt 07:17:16 ah. 07:17:35 the last one is from Act of Congress 07:20:35 where was I, before the wife got me into screaming? 07:27:42 --- quit: madwork ("?OUT OF DATA ERROR") 07:29:34 --- join: madwork (n=foo@derby.metrics.com) joined #forth 08:02:31 --- join: JasonWoof (n=jason@c-71-192-33-206.hsd1.ma.comcast.net) joined #forth 08:02:32 --- mode: ChanServ set +o JasonWoof 08:17:51 --- quit: PoppaVic ("Pulls the pin...") 08:34:02 --- join: PoppaVic (n=pete@0-1pool47-158.nas30.chicago4.il.us.da.qwest.net) joined #forth 08:39:11 --- join: PoppaVic1 (n=pete@0-2pool198-68.nas30.chicago4.il.us.da.qwest.net) joined #forth 08:39:27 --- quit: PoppaVic (Nick collision from services.) 08:39:28 --- nick: PoppaVic1 -> PoppaVic 08:42:10 --- join: arke (n=arke@pD9E073EC.dip.t-dialin.net) joined #forth 08:42:20 is there a forth that runs on .NET? 08:47:12 http://www.dataman.ro/dforth/ 08:47:15 Google is your friend. 09:02:05 w000t 09:02:06 thanks 09:02:56 hehe 09:06:59 --- nick: Quiznos -> GoogleMaster 09:07:09 The GoogleMaster is here 09:07:36 --- nick: GoogleMaster -> Quiznos 09:10:16 Goooooogleee! 09:11:41 jes? 09:30:46 --- quit: PoppaVic ("Calls it a Knight") 09:37:18 man, this weather is rediculous 09:37:30 yees 09:37:52 high 98 today, 101 tomorrow 09:38:16 library opens in 20 minutes. I'll be heading over there soon 09:38:59 drink water on the way 09:39:30 i'm suffering in my room with the tv, radio, running AC, and box fan opposite the AC near the door. 09:40:03 it's noisy but i'm comfortable; the room temp is bouncing tween 68F and ~74F 09:40:16 it's warmer in the rest of the apt 09:40:35 that's a good range for me 09:40:41 74 is fine without clothing 09:41:05 my comfort zone is alittle lower, mid 60s 09:41:08 weather.com says the current conditions: 91F Feels like: 100F 09:41:26 i get false readings from my back porch therm 09:42:29 I haven't been around a good thermometer much 09:42:41 but my memory of office work a few years ago was that I started sweating at 72 09:42:47 heh 09:43:23 but 71 was ok for just sitting there 09:43:53 humidity > 60% for me is not comfortable 09:44:18 :) 09:44:26 it's been humid here for 2 months 09:45:28 humidity: 58% 09:45:52 * Quiznos shudders 09:46:48 ok bbl 09:53:41 jcw, Why don't you have create/does> ? 09:53:53 Because I have not written it. 09:54:10 On purpose? 09:54:57 Because I lack understanding of the details how create/does> should work. 09:54:58 That is to say, do you not want it? 09:55:11 Oh. Well, if you need implementation help, let me know. It can be done quite simply. 09:55:17 I would like it, yes. Although I am not sure it will fit in my model. 09:56:00 What is it about your model that you think might prevent it from fitting? 09:56:01 The gforth implementation talks about the code area and data area of a word. I don't have separate spaces. 09:56:10 Oh. You don't need separate spaces. 09:57:39 Do you have VARIABLE ? 09:57:49 Yes 09:58:16 And it's a Forth VARIABLE? It creates a new word that returns the address of an allocated dataspace cell? 09:58:29 OK. In my system, a created word is added to the dictionary (obviously). One of the fields in the structure of the word is an array of pointers to other words. When the word is created, this array is preallocated to 1024 pointers. When the ';' is encountered, it is shrunk down to the size actually needed. 09:58:50 Ok. 09:59:07 Yes. If no one gets in a tizzy, I'll post the 7-8 lines of code that create a variable, so you can see how this works. 09:59:10 So you lack HERE and an actual dataspace? 09:59:17 Correct. 09:59:38 dictionaryEntry_t *de; 09:59:39 char *token; 09:59:39 assert (getToken (&token)); 09:59:39 assert (!createWord (&de, token, 6)); 09:59:39 de->attributes |= ATTRIBUTE_VARIABLE; 09:59:39 de->cfaList [0] = searchDictionaryByNameEx ("(lit)"); 09:59:41 de->cfaList [1] = (dictionaryEntry_t *) &de->cfaList [4]; 09:59:44 de->cfaList [2] = searchDictionaryByNameEx ("exit"); 09:59:44 Are you against adding a linear dataspace and a HERE ? 09:59:45 de->cfaList [3] = (dictionaryEntry_t *) TOKENTYPE_INTEGER; 09:59:48 de->cfaList [4] = (dictionaryEntry_t *) 0; 09:59:49 dictionaryRoot = de; 10:00:24 Haven't really thought about doing that. Managing it may be a hassle. 10:00:38 So you also lack , (comma) in that case. 10:00:42 Yes. 10:01:14 But I'm not adverse to managing that in the C code. 10:01:14 CREATE returns a pointer to dataspace, where you can ALLOT and , new values. So without a dataspace, CREATE would be limited in use. 10:02:02 It should be a very simple thing. malloc or calloc a region of arbitrary size, make HERE a word that returns the value of a variable usually called dp that points to the beginning of the block. 10:02:25 ALLOT adjusts dp by the value on the stack. , stores at the address in dp and ALLOTs it upward by one cell. 10:02:37 c, stores a char at the address in dp and ALLOTs it upward by one char. 10:02:55 Right. I'm familiar with the , c, ALLOT and friends functions. 10:03:14 After that, you'll have a reason to build CREATE and it'll behave normally. 10:03:16 You're thinking basically just reserve that space to support create/does> type words? 10:03:27 Since I already support variables and such. 10:03:39 Yes. A CREATEd word has no ALLOTed dataspace, just a pointer to the next free cell. 10:04:04 That is probably a viable solution. 10:04:28 Then, if you wish, I can help you build CREATE and DOES> in straightforward fashion. 10:05:27 You have EXECUTE now, right? 10:05:30 Yes 10:08:02 OK, so I need DP, ALLOT, ",", C, and HERE. For the moment, I'll ignore worrying about hitting the end of the allocated memory. 10:08:06 I think in your model I would build CREATE from VARIABLE. A CREATEd word has two values, one being the copy of dp it was given when it was built, and the other being an xt. At runtime, a CREATEd word places its pointer on the stack, and executes its xt. Its xt defaults to a noop word. 10:08:07 I should be able to write these in a few minutes. 10:09:53 For me that would (lit), , exit. 10:10:10 I don't see an execute in there. 10:10:25 And I'm not sure I quite follow, but I'm sure you do. :) 10:11:19 I don't follow about the execute. 10:12:00 (lit) pushes the next value on to the stack. would be the dp it was given when built. exit is the end of the word. 10:12:18 So for a CREATEd word, I should push the dp and execute it? 10:12:52 No. You also need to do (I'm guessing about your internals here) (lit), xt_of_noop, (execute) 10:13:52 And when doing this, save the address of where the xt_of_noop is stored in a global called, say, 'latestcreate' or something else suitable, so DOES> can get at it later. 10:16:11 jcw: : variable create 0 , does> ; : constant create , does> @ ; 10:16:12 :) 10:16:32 In fact, : variable create 0, ; 10:16:47 Yes, I was just ... helping :) 10:17:36 CREATE basically takes a name from the input stream, creates a word in the dictionary called that, and has that word, upon execution, return the position of HERE at the time it was created. 10:17:41 sorry if I'm being redundant :) 10:18:04 Yes, but it also can execute additional code assigned to it by DOES>. 10:18:34 well, yes 10:18:38 hehe 10:18:59 but CREATE doesnt need DOES>, thats all I wanted to say :D 10:19:05 If it couldn't, it wouldn't be any better than HERE CONSTANT foo 10:19:05 man i havent talked forth in a while 10:19:06 hehe 10:23:13 i lost interest in forth for a while 10:23:15 but 10:23:19 im gaining interest again 10:23:22 ?!??! 10:23:22 not in the same light though 10:23:47 what did your interests wander to? 10:24:33 oop languages 10:24:45 and 10:24:45 err 10:24:50 systems of languages 10:25:26 as in, several languages, each with its own function 10:25:34 like javascript, css, html, etc but not quite 10:26:29 and the entire deal object oriented 10:26:30 but 10:26:34 im taking stuff from forth as well 10:26:38 someday I'll write my little IDE hehe 10:27:47 im surprised this is news to you, this has been for about a year now 10:27:47 hehe 10:28:34 I'm not a big fan of OOP. Too restrictive. 10:28:56 I agree partially. 10:29:01 I'm off, I'll talk in a few hours 10:30:05 later 10:30:26 Sure, just as I start to stir up trouble, he leaves. ;) 10:31:44 keep talking, I'll reply later ;) 10:32:27 Okaay. create appears to work. here words. , words. c, works. allot works. 10:32:49 Ok. Now the slightly trickier bit, DOES>. 10:33:03 I'm operating blind here. Do you have IMMEDIATE words? 10:33:34 Yes. 10:34:04 So here's the 30000 foot overview. When you have DOES> working, you'll be able to run this example: : foo create 5 , does> @ . ; 10:34:11 Then foo bar 10:34:19 will create bar, which when run will display 5. 10:34:28 Trivial and useless example, but we can use it for reference. 10:34:51 Sounds good. 10:35:05 Oh, should create and/or does> be immediate? 10:35:24 DOES> should probably be immediate for ease of implemementation. CREATE can't be. 10:36:14 So DOES> is immediate, so it takes action at compile time. It will compile, say, (does), and then (here it gets foggy because I don't know your internals) compile an exit. 10:36:43 (does) will have special action at runtime. It will assign the address of the code just past the exit to the latestcreate. 10:37:28 Now, if you can't execute a specific address, but instead can only execute a defined token, you'll need to do something slightly more complex to get that to happen, like end the current definition with ; and start a new, unnamed definition after DOES>. 10:38:34 That's the fog, because I don't know how internally complex you've built what you've got. 10:38:57 Alright. First, as a test, I should be able to say : foo create spot ; and when I run foo, it should create spot, correct? 10:39:03 If so, I need to verify that will work. 10:39:11 Yes. CREATE should work. :) 10:39:20 Well, it needs to work as we expect it to :) 10:39:28 Oh hang on. 10:39:28 No. 10:39:33 : foo create spot ; will not work. 10:39:33 So really, it should be : foo create ; 10:39:35 foo spot 10:39:36 CREATE is not immediate. 10:39:36 Right. 10:39:47 Also, CREATE spot 5 , spot @ . should display 5. 10:40:51 Hmm. spot is not leaving anything on the stack. 10:40:58 That's a problem. 10:41:11 You said it should place there HERE at create time? 10:41:28 It should place a copy of the contents of dp from when it was created. 10:41:35 Right. 10:43:04 I support I shall have to implement '@'... sigh. 10:43:21 How do you use variables now if you don't have ! and @ ? 10:43:40 set/get, like Factor. 10:43:49 Gah. 10:43:55 : foo create spot ; will NOT create a word named "spot" 10:44:00 create is not immediate 10:44:01 get may work. Need to check the typing. 10:44:01 Right, we caught that one. 10:44:19 You really, really need @ and ! and c@ and c@ to access your linear dataspace. 10:44:27 oops, that got said already 10:45:35 * JasonWoof grins at the idea of a "forth" without memory access 10:45:47 I have memory access. Just to typed spaces. 10:45:55 bah 10:46:17 I think one of the biggest time savers of forth is you don't have to do this sort of crap: 10:46:20 Well, I'm walking you through building CREATE/DOES> in a conventional way; if you want to do horrible things to it after, I can't stop you. :) 10:46:51 char* addr = (char*)malloc(1000); if (addr == null) { die("couldn't allocate memory"); } 10:46:56 This is not intended to be a generic Forth. The target audience is people writing test scripts for a product, and the NEED that kind of protection. 10:47:25 right 10:47:41 my solution to needing protection in forth is to run it in a virtual machine that doesn't crash 10:47:48 For protection, no reason the memory access words can't only use addresses relative to the dataspace area, so that users can't randomly trash process memory. 10:47:49 ie it checks memory addresses before using them 10:48:07 Yes, or all addresses could be checked. An implementation detail. 10:48:21 it's pretty easy to implement: 10:48:25 OK @ works. 10:48:49 I am going to reserve @, !, etc, for the dp space. 10:48:56 : @ ( addr -- x ) mem_mask & mem_base + fetch ; 10:49:03 And create spot 5 , spot @ . works as expected. 10:49:42 what's dp stand for? dictionary pointer? data pointer? 10:49:42 Ok. 10:49:58 It's old convention for the variable underlying HERE. 10:50:09 The issue is not crashing machines. The issue is wasting time while they try to figure out why a number instead of a string is printing, etc. And I support strings as a native type, because string handling in Forth sucks donkey butt. 10:50:14 I know what it is, I'm just curious about the etimology 10:50:33 * JasonWoof looks up etimology to see how to spell it and to see if it's the word he meant 10:50:40 It is the word you meant. 10:50:45 It is not spelled correctly. 10:51:01 Back to what we're working on. 10:51:04 I would guess 'data', but it'd be 'dictionary' too for a non-Harvard model. 10:51:11 etymology, and seems to be what I meant, pretty much :) 10:51:41 well, in the old days they refered to the heap as the "dictionary" 10:52:00 seems an awefully confusing terminology though 10:52:04 Sure, no idea when the earliest harvard model came about. I might have something in my notes. 10:52:13 whatever 10:52:45 Alright, so DOES> should compile "(does)" (or something similar) and an "exit" where? 10:53:26 Right after the (does). 10:54:04 The (does) and exit go inline with the current word being compiled? 10:54:08 Right. 10:54:31 As I said above, whether 'exit' is the right thing to do here will depend on how your system is built, but lets start with that and see how badly it goes. 10:54:41 :) 10:55:54 And what do we want (does) to do? 10:56:40 We want to replace the noop call in the created word? 10:56:48 (does) puts the xt of the code following the exit into the latest created word, via your latestcreate variable. 10:59:11 How will it get executed if it's following the exit? 10:59:27 It won't. That's why the exit is there. The CREATEd word executes it. 11:01:58 I'm twisted up somewhere. 11:02:36 Waiting. 11:03:46 I'm re-re-re-reading this. 11:04:23 Suppose i write : myconstant create , does> @ ; 11:04:32 Then 5 myconstant foo 11:04:36 6 myconstant bar 11:04:45 foo and bar both share the does> code. 11:04:58 Is the goal to replace the noop in the created word with the xt of the word after the exit? 11:05:26 Right. That's what I said... (does) puts the xt of the code following the exit into the latest created word, via your latestcreate variable. 11:05:41 Maybe I got the exit's twisted up. 11:09:23 oooh, segmentation fault. That's never good. 11:13:40 etymology 11:13:54 --- nick: Raystm2 -> nanstm 11:15:39 quartus, myconstant Fig calls that a `defining word' 11:16:09 does> doesnt mean "code sharing" 11:17:16 `does> @' means that the code following the does> is compiled into the PFA of a new word when it is being compiled by the defining word 11:18:40 pfa? 11:18:58 Your limited understanding of the specifics of one incredibly antiquated method of implementing Forth are neither relevant to the general mechanism, applicable to all Forth systems, nor appropriate in the context of the implementation I'm helping jcw with. 11:19:03 0ld sk0ll terminology 11:19:09 the word being created executes a lit first, then the code compiled from the source just following does> 11:19:20 quartus, ok 11:20:51 Yea, and I've got a problem here. Because of the nature of my system, and the block that contains all the CFA gets moved when the ; is parsed, it's causing my pointer to the code in that word to change. In effect, I don't know where the word went. I'll have to think about this. 11:21:14 --- quit: virl (Remote closed the connection) 11:21:20 If you can't find a word later, how do you execute it? 11:21:38 The dictionary doesn't move, but the pointer to the list of CFAs. 11:21:44 But you can find it. 11:22:37 The inner interpreter knows where it is, but the word itself that's executing does not. It's not passed in as a parameter, and it's not a global. 11:23:03 So that was what I was saying, 'exit' there may not be appropriate to your weird setup. You may instead need to end the current definition after (does), using ; , and then start a new definition. 11:24:01 Backpatch the (does) so it knows what to paste into the CREATEd word. 11:26:58 Of course you'd have to be able to find the (does), too. Having your definitions shift around in memory after ; is a pretty annoying implementation feature. 11:27:44 Why do you do that? Why allocate 1024 cells and then shrink them after? Why not store all code in a contiguous region? 11:27:49 jcw, if words are struct Word { fields} *Dictionary; then you need **Dictionary 11:30:07 I suppose you could track the offset into the definition of the (does), and backpatch it that way. 11:30:47 At any rate, I think you follow the mechanism and know what you need to accomplish -- would I be right about that? 11:31:04 Yes. 11:31:41 In the coretest file, there's a word named WEIRD that puts a DOES> implementation to the extreme test. 11:32:06 : WEIRD: CREATE DOES> 1 + DOES> 2 + ; 11:33:47 I can't think of a useful application of the technique, but what that would do is create a word that has one DOES> clause as its initial action, but then redefines the most recently CREATEd word with another DOES> clause. Tricky stuff, but if you pass that test you've got it nailed. 11:34:02 It would probably work now if the signature checking was disabled. When it calls a word, it checks for a signature to validate it's actually calling a word, and not wandering around in memory. Because I'm calling into the middle of a word, and not passing the top level structure, when I run the defined word, it throws an error. 11:34:27 Ok, so perhaps the technique I mention above might apply; end the current definition after (does) the normal way, start a new one. 11:34:37 And backpatch accordingly. 11:35:06 Or add the appropriate signature inline. 11:35:08 Whatever works. 11:35:56 I could start a new one. I'd need to add a flag in the header for hidden words, but that's pretty trivial. 11:36:09 jcw backpatching indicates logical problem with design. 11:36:27 No, in fact it doesn't. 11:36:49 For everything I've done so far, I'd say 95% of my design was clean. 11:37:06 jcw, your (does) will need to know the new xt one way or another, so it can store it in the CREATEd word. 11:37:08 Especially since I implemented the core in about 10 hours. 11:37:41 Yah, I can work around that since I now have a good picture of how it should work, thanks to you. 11:38:24 Good. Glad I could help. It'll give you a chance to experiment with it. Being able to create ad-hoc data structures in dataspace is useful, may even be useful to your users. :) 11:38:48 We'll see if they get that sophisticated :) 11:38:48 See if you can make WEIRD: work. 11:39:09 I'm going to shelve it all for a few hours and go play in the street. That usually helps gel things. 11:39:16 Heh. 11:39:46 I've enjoyed your help with this. Much better than the "that's wrong, do it this way" approach. 11:40:33 I'm glad about that too. I've built enough internals to be able to generalize, and I don't have one set-in-stone notion of how internals should be laid out, so perhaps that helps. 11:41:14 I do think yours is especially weird, but then it's your baby, so. :) 11:41:38 :) 11:46:31 It's actually not hard to visualize. Just imagine a linked list of structures. One element of the structure is a pointer to the name, there are some flags, a pointer to a C function if it's a native word, or a pointer to an array of pointers to structures. It's "weird" in that it has variable typing, but if we call mine weird, we have to call Factor weird. 11:46:45 Factor is weird. 11:51:32 hehe 11:51:37 Factor is very weird 11:52:09 anything involving forth and java has got to be weird 12:32:28 --- join: snoopy_1711 (i=snoopy_1@dslb-084-058-183-009.pools.arcor-ip.net) joined #forth 12:32:56 --- quit: Snoopy42 (Nick collision from services.) 12:33:25 --- nick: snoopy_1711 -> Snoopy42 12:34:39 jcw, just before I head out into the heat -- you can see from the way it works that a DOES> clause could be in another word apart from the one that does the CREATE. 13:03:59 it's nice in the library 13:04:07 I've been in here long enough that I'm actually getting cold 13:04:25 and it's positively miserable outside 13:04:39 the wonders of modern technology :) 13:05:00 what libr where? 13:05:08 northampton, ma, usa 13:05:11 forbes 13:06:22 sorry, i have my own R's 13:09:09 --- quit: Quartus_ ("jmIrc destroyed by the OS") 13:10:02 --- join: Quartus_ (n=Quartus_@209.167.5.1) joined #forth 14:12:57 --- join: crc (n=crc@pdpc/supporter/active/crc) joined #forth 14:12:58 --- mode: ChanServ set +o crc 14:21:09 Yay, I got to work on Forth today at work. 14:22:11 woot - doin what? 14:22:55 Well, adding some tests for a new platform to my automated remote test system. 14:23:45 And after working on bloated SOAP crap for a while, I love going back to my own Forthy version of RPC. :) 14:24:43 so you're saying you actually want to drop the SOAP? 14:24:56 madwork coo 14:25:20 No, I can't drop the SOAP. This, however, is a different project. 14:26:33 I love being able to define a new remote word call in 1 line of code. 14:27:03 --- quit: Quartus_ ("jmIrc destroyed by the OS") 14:28:24 Destroyed. Sounds harsh. 14:31:56 --- quit: timlarson ("Leaving") 14:32:00 --- quit: timlarson_ (Read error: 104 (Connection reset by peer)) 14:35:09 --- join: I440r (n=mark4@24-177-235-246.dhcp.gnvl.sc.charter.com) joined #forth 14:51:12 --- join: futhin (n=wunderwa@bespin.org) joined #forth 14:51:44 --- nick: futhin -> thinfu 14:51:51 --- mode: ChanServ set +o thinfu 14:58:42 --- mode: ChanServ set +o I440r 15:05:43 --- quit: Ray_work ("User pushed the X - because it's Xtra, baby") 15:08:53 --- mode: ChanServ set +o Quartus 15:08:55 #@$(&*@#$(*@ if this crap keeps up I'm going to have to stop using e-mail for a year 15:09:13 rm -rf spammers 15:09:23 I'm so bloody sick of reading over the e-mail before I read it to try to decyfer what I wrote and what they are saying in respense 15:09:48 JasonWoof: i've just given control of the channel back to i440r 15:09:56 feel like I should try what my 8th grade teacher did: 15:10:07 and i added quartus as an alt 15:10:23 he said if he got another paper with the wrong there/their/they're he'd underline that word and give it back, and not look at the rest until it was fixed 15:10:34 im not really the manager type and its rare that any form of moderation is needed in here :) 15:10:52 thinfu: nice going ;) 15:11:09 hopefully it'll shake things up 15:11:14 i'm pro-shaking 15:11:16 yeah, people can mostly work out their issues without help 15:11:18 in any situation ;) 15:11:29 pro-shaking? 15:11:44 a healthy channel is a channel that gets shaken regularly 15:11:48 yeah 15:11:49 that where you sleep with celebrities? 15:11:53 lol 15:12:00 nah i just like shaking things up 15:12:04 in any situation 15:12:08 thats partly why i troll 15:12:09 oh, shaking not shacking 15:12:10 to shake things up 15:12:13 chaos rulez ? 15:12:15 :) 15:12:24 yup yup 15:12:45 I kicked somebody a few times in a row for telling me how I feel 15:12:50 chaos is a subset of complexity, and it turns out complexity increases everytime things are shaken up 15:12:59 repeatedly, even after I told him that I don't feel that way, and to stop 15:13:04 JasonWoof, you feel cool. You said so. 15:13:17 chaos is simply an order of higher complexity 15:13:18 Quartus: cool? I'm sweating my balls off. 15:13:24 its not the absense of order 15:13:25 Oh. Left the library? 15:13:41 yeah, I'm back home. the library was going to close anyway 15:13:51 although I didn't stay quite as long as I could. 15:13:59 I was hungry, and I have to make dinner anyway 15:14:08 I should be doing that now in fact 15:14:20 i deleted kc5 as an op in here, if he ever comes back as a regular he can be re-added 15:14:41 one day, i'll learn forth. ;P 15:14:41 heh he hasn't been here in more than a year 15:14:58 I don't think kc5 is coming back 15:15:00 you must've really pissed him off I440r ;) 15:15:02 you meanie 15:15:12 unless the people he's not wanting to be around leave for a long time 15:15:37 Was that it? Last I saw him he was Howard Hughes-ing, only without the wealth. 15:15:42 no actually i think he is having emotional issues atm 15:16:21 hmm, i don't know anything about that but he hangs on some of the other forth channels all the time 15:16:38 ya ? 15:16:49 there shouldnt be any other forth channels :P 15:16:52 lol 15:17:14 there should, it indicates the community is healthy 15:17:28 anyways there's 4 strong forth channels and like 2 or 3 idler ones 15:17:29 I know he was pretty sick of I440r's close-minded rantings 15:17:29 ya 15:17:38 :) 15:17:55 JasonWoof, i know im opinionated - thats why i made quartus the alternate 15:18:01 i'm counting slava's channel as a forth channel 15:18:11 er 15:18:13 #concatenative 15:18:42 :) 15:18:49 ok, showertime, then cooking, then games... bbl 15:19:06 I440r: quartus isn't exactly a conterpoint for you 15:19:19 jasonwoof or crc are more opposite and more temperate 15:19:22 quartus is a bit of a troll 15:19:26 lol 15:19:31 Troll? Me? 15:19:56 How amusing. 15:20:27 yeah, the reason i don't hang on #forth is cuz i get uncontrollable urges to troll everyone that doesn't forth like crc does 15:20:32 and i troll crc a lot too 15:20:36 oh well 15:21:53 "how amusing." is something a troll would say btw :) 15:22:12 As well as, I'm sure, any other retort I might have made. :) 15:22:49 hmm 15:23:12 i wonder if anybody here is into evolutionary computation, genetic algorithms, etc 15:23:40 i would be if i understood them :) 15:24:02 I've done some neural net work, but not in Forth. 15:24:33 yeah i've noticed neural nets have similarities 15:24:38 what with the learning algorithms etc 15:25:09 I'm a greater proponent of rule-based systems, as with those you can figure out *why* the code did what it did. 15:26:26 yeah i'm sure most people would be afraid to go the extreme route with harnessing the power of evolution to solve all the problems we have, at the expense of understanding why things work 15:26:50 In my case it was experimental work in loan approval systems at a financial institution. 15:26:52 but we can just evolve the book that explains why things work ;) 15:26:56 ah 15:27:07 ok thats much different ;) 15:27:17 The neural net worked, but there wasn't any good way to explain why it voted the way it did. 15:28:19 Closest I came to being able to perform that kind of audit was to make a group of partially-trained nets vote, and see where the dividing line fell. 15:29:02 frankly i don't know much about any of the "ai" stuff, neural nets, evolutionary etc 15:29:11 thinfu: Tim Perkis wrote some interesting essays on genetic computation with Forth... 15:29:33 but i've spent the last few years on and off thinking about the incredible potential of harnessing the power of evolution to solve just about any kind of problem we can think of 15:29:35 how a correct answer is achieved is not important, just that it IS achieved 15:29:38 and to evolve machines on the fly 15:29:46 vatic: nice 15:30:05 I440r, it is important in a context that requires you to be able to detail the 'how'. 15:30:38 "the neural networks performed their magic and the answer was 42" :) 15:31:45 So the bank wants the software agent to aid in making a consistent decision, but they also need to be able to explain why a loan was or wasn't approved, esp. in a legal context. With rule-based systems they could do that. 15:32:20 thinfu: http://citeseer.ist.psu.edu/perkis94stackbased.html 15:32:47 vatic: already there ;P 15:33:29 thinfu: Perkis was/is one of the members of the League og Automatic Composers 15:33:37 og = of 15:34:22 thinfu: http://www.perkis.com/wpc/index.php 15:36:18 haven't heard of automatic composers 15:37:32 ah neat 15:37:44 thinfu: http://crossfade.walkerart.org/brownbischoff/ 15:38:20 thinfu: the original networked computer band circa late-1970s... 15:39:28 --- join: virl (n=virl@chello062178085149.1.12.vie.surfer.at) joined #forth 15:45:01 vatic: you do much with evolutionary computation yourself? 15:45:42 thinfu: I did some work synthesizing audio waveforms, not in Forth tho... 15:45:52 thinfu: I intend to get back to it. 15:46:27 thinfu: inspired by Karl Sims work with images... 15:47:39 thinfu: http://www.genarts.com/karl/papers/siggraph91.html 15:52:16 there was another forther that was really into music too, he wanted to make use of the analog capabilities of the f21 forth chip to build a synthesizer iirc 15:52:47 thinfu: lemme know if you remember a name... 15:53:33 I do recall somebody who was generating color-organ stuff from, I think, midi files, using Forth. 15:54:23 Quartus: there's a whole history of Forth in the arts: HMSL, Formula, etc... 15:54:37 Right. 15:56:18 --- nick: nanstm -> Raystm2 15:56:29 Quartus: Is anyone working with the soundstream (I hope I have that right) capabilties of the Palm in Quartus? 15:56:42 Not to my knowledge. 15:57:02 Possible, of course. 15:58:39 * Raystm2 home. 15:58:41 Hi all. 15:58:45 Hi Raystm2. 15:58:49 backloggin' 16:00:41 Some one told me he was in a little illuminati, then phrased it illuminatino. I immediately thought of a word to describe a specialist at the Census, Enumalatino. Someone who knows how many have crossed the boarder. 16:01:08 "I see a little illuminatino of a man..." 16:01:17 haha 16:01:50 How about Illumitony and Illumitina? 16:01:51 's gotta moosh 's gotta moosh can you do the fandango. <--- that can't be right? 16:02:08 --- quit: madgarden ("?OUT OF DATA ERROR") 16:02:13 It can't be, no. 16:02:58 that's what it sounds like to me. :( 16:03:07 heh 16:03:09 I'm not interested enough to look it up. 16:03:15 There's at least one website for misunderstood lyrics. 16:03:34 One I recall is "I'm gonna rock and roll all night, and part of every day" 16:04:05 haha and... "There's a bathroom on the right" 16:04:33 Even John Fogarty wished he said it that way. 16:05:52 Ya that Kiss, with there EV -ER-EE 16:06:29 3 syls of 2. nice stretch and made the line unforgetable. 16:06:47 --- join: madgarden (n=madgarde@Toronto-HSE-ppp3708723.sympatico.ca) joined #forth 16:11:17 * Raystm2 was fortunate to be in the presence of a local Fried Chicken and Catfish Franchise Founder today. He practically spelled out his entire rise to success for us, while picking up his order today. 16:11:52 From the chicken of the sea to chicken of the land? 16:12:03 hehe. 16:12:05 ya. 16:12:34 One order of chicken if by sea, two orders of catfish if by land, I think. 16:12:57 you know, get what you don't normally have access to. 16:12:57 the legendary journey of Israel Bissel? 16:13:07 Hey that's right. 16:13:11 * Raystm2 from MA 16:13:21 He got the raw deal there. 16:13:42 Well, maybe not, in this modern time of the History Channel. 16:17:01 I bet he got a raw butt riding all those, what, 300 miles or so? 16:17:23 Not a journey I'd want to undertake. 16:17:36 --- quit: nighty_ ("Disappears in a puff of smoke") 16:20:13 whats the formula for success? 16:20:18 code more forth? ;) 16:20:56 If your not a seasoned businessman, then the next best thing is to buy a franchise. 16:21:46 I suppose just about every franchise food joint uses the same basic practices to be successfull. No re-inventing the wheel there. 16:23:31 * Quiznos learns something stunning: i took a local commuter flight down to Phila to catch a another flight and on the way south i saw huge rolling, hills that looked like the result of ocean wave crests 16:24:19 the retreat of the ice cap? 16:24:24 nop 16:24:49 remember, the local flight was also gaining altitude 16:25:10 good alcohol? 16:25:18 nop 16:25:37 topological maps also show what i saw! 16:26:12 but with maps its harder to process the numbers and lines 16:26:35 are we talking lower Canada and much of New York and Pennsylvania? 16:26:40 im back 16:26:41 hi 16:26:49 ARKE!!!!1111oneoneoneone 16:26:58 well, i'm located in the northeast are of pa 16:27:06 near the pocanose 16:27:10 okay strip mining? 16:27:14 nop 16:27:27 :) massive flood? 16:27:33 bingo! 16:27:37 global 16:27:49 40 day kind? 16:28:05 anthracite/coal does NOT need millions of years to form 16:28:09 ray yep 16:33:01 forth as a replacement for verilog 16:33:03 discuss 16:33:22 chuck did it already. 16:33:25 16:33:58 i know 16:34:04 but it doesnt seem like we're getting blessed with it 16:34:12 either as a commercial product or a PD product 16:34:20 and its definetely something I'd like to try 16:34:29 not to mention that I really really really like the whole colorforth idea 16:34:30 Has any of the chips Chuck designed seen the light of day? I know the Patriot chip was based on something he was involved in. 16:34:54 yes I think several have but i dunno the specific 16:35:05 ultratechnology.com just read jeff foxes stuff, it says 16:35:17 although its a bit biased in its wording but bias is easy to pick out# 16:35:22 I don't know either. If he works at extreme tolerances, it may be that what works for a prototype is hard to reliably produce in mass quantities. 16:35:50 i dunno 16:36:41 Back when Fox was going on about "1,000,000 times performance improvement" I expected a chip to appear on the commercial market anytime. 16:37:20 I think the problem is that hes too biased 16:37:33 He does set the high-water mark for bias. 16:37:36 I do think small chips in a big array/grid are the future but ... i dunno 16:38:04 I do as well. 16:38:33 Modularity seems to be the direction of much of computing 16:38:33 for the last 10 years, apparently, its just been "yeah, we have this new company, and we're making this amazing chip" ... 16:38:40 I find new chips interesting in the abstract, but we're not short on computing power now, and nowhere near maximizing the use of what we've got. 16:38:52 agreed. 16:39:17 the problem is the software 16:39:32 things like .NET and stuff is great but the problem is the enterprise mentality 16:39:44 The problem is the software engineer. 16:39:45 ya. 16:40:09 its not even that 16:40:28 its just that theres a general mentality of this enterprise framework factory factory factory 16:41:34 Big corporations don't want brilliance, not in-house anyway. Harder to replace. Gets uppity. 16:46:01 I know that's true. 16:47:06 I've had to down play my "brilliance" AND my compensation requirements just to keep my job. I know I'm worth more. I know I can't get it easily anywhere else. I walk the tightrope. 16:47:52 I'm at the top of my game and if i'm not carefull, I'll premadonna myself right off the rope. 16:47:59 mcafee sw has a vuln. mcafee ack's the vuln; does not affect y2007 products 17:01:03 string theory on pbs now 17:01:05 i don't use antivirus software at all 17:04:05 i've only had 1 minor virus in the last 10 years affect my windows setup 17:08:28 --- mode: ChanServ set +o arke 17:08:37 --- quit: thinfu ("leaving") 17:09:18 --- quit: madgarden ("?OUT OF DATA ERROR") 17:11:03 --- join: madgarden (n=madgarde@Toronto-HSE-ppp3708723.sympatico.ca) joined #forth 17:23:43 What's the popular pastebin to use for Forth? 17:24:09 pastebin.ca is stable. 17:24:24 i duno about popular tho 17:24:52 There's one for Retro, but we've never broken the ice outside of retro, might ask crc if it's okay. 17:26:38 I did this earlier today as follow-up to helping jcw implement CREATE/DOES>, thought it might be useful to somebody somewhere. 17:26:40 http://pastebin.ca/110900 17:27:33 ty 17:27:58 Ahh, I remember implementing DOES>. Good times. 17:28:04 It's a functionally-identical drop-in replacement for CREATE/DOES>/>BODY under gforth, but it might be helpful if you're interested in how an underlying implementation might work. 17:28:14 nods 17:28:54 convenient number of paste 110900 or nearly 009 011 backwards and that's the 411 to find the pastebin with the create/does> tutorial. 17:29:09 Raystm2, you're a numerologist too? :) 17:29:28 By which I mean, as well as all the other things you are, rather than "just like me"? :) 17:29:30 not officially but my mind won't quit playing them in interesting ways. 17:30:41 It's not finished, in that I haven't added the appropriate stack diagrams to the new CREATE/DOES>/>BODY, but that shouldn't be too much of an obstacle. 17:31:17 With that file loaded, Gforth still passes coretest.fs. 17:31:35 cool. 17:31:40 * Raystm2 reads 17:33:23 I'm not suggesting this as a replacement, or as an optimal implementation, just as a general reference implementation. 17:35:24 Ya, it makes sence. 17:37:41 Such words require incestuous knowledge of the implementation, so it's not portable, but hopefully it's clear enough despite that. 17:39:30 ...incestuous? 17:39:39 Created/does means to me... Create a word or a class of words that do THIS first. 17:40:16 or using crc's def of later "and maybe subsequently THAT as well. 17:40:20 " 17:41:32 madgarden, in the technical sense of excessive intimate detail. 17:41:41 Raystm2, I'm not sure I follow. 17:41:58 "excruciating detail" 17:42:03 madgarden: I read incestuous as... 17:42:03 "a knowedge of an implementation that you wouldn't normally require had you picked up a forth and faithfully new you needn't look under the hood. 17:42:15 lol 17:43:01 Quartus, I'd prefer "carnal" to "incestuous." ;) 17:43:13 Quartus: i've never used create/does> knowingly. I may have not needed it yet. 17:43:37 madgarden, "incestuous knowledge" is the common idiom. Can't say I've run across "carnal knowledge" in that context. 17:43:42 madgarden: I believe most of the men in this chat would. 17:44:15 Quartus lol 17:44:30 But now we know why incestuous is used and not carnal. 17:44:44 Well, even "intimate" is better than "incestuous." I mean... ew. 17:44:52 Google runs hugely in favour of "incestuous knowlege" as the technical phrase, though "carnal knowledge" turns up a few times (though only a few, it's almost always in a sexual context). 17:45:30 * arke is looking through DeltaForth 17:45:47 aaaah shit 17:45:50 nope 17:45:53 looks like i have to roll my own 17:45:55 arke Nan says hi. 17:46:10 hi nan :) 17:46:12 American Heritage dictionary, "incestuous", definition 3: Improperly intimate or interconnected: “Press-politics relations are notoriously incestuous” (Boston Globe). 17:46:57 That says allot about politiians and the Press. 17:47:21 But it's a non-sexual usage, just as the phrase "incestuous knowledge of the implementation" is. 17:47:59 ok, I can't use this delta forth 17:48:02 "carnal knowledge", as a phrase, is a euphemism for sexual intercourse itself. 17:48:03 it doesnt work like normal forth 17:48:15 it works like a C compiler that accepts forth syntax 17:48:46 is that carnal or insestuous? 17:49:15 arke, you mean it isn't interactive? 17:49:48 --- join: docl (n=docl@74-36-210-133.dr01.hmdl.id.frontiernet.net) joined #forth 17:50:01 Who was looking for that the other day? 17:50:04 Ah. juri_ 17:51:06 Oops. : (create) ( addr -- ) should be (create) ( addr1 -- addr2 ) 17:51:40 Quartus i've been mentioning c2forth 17:51:43 exactly. 17:52:06 arke what url for your thing? 17:52:14 Well, hmm, maybe not. (create) can have any side-effect. So it's (create) ( addr1 -- ...? ) or something like that. 17:58:08 (create) ( addr -- addr | ...? ) 17:58:17 Grr. 17:58:22 arke do you have the url to deltaforth? 17:58:25 (create) ( addr1 -- addr2 | ...? ) 17:59:05 Quiznos, I thought you were the Google Master. http://www.google.com/search?q=deltaforth 17:59:11 i am 17:59:19 i'm PhD Procrastinator too 17:59:22 :> 18:54:12 --- quit: docl ("leaving") 18:57:05 --- join: nighty_ (n=nighty@CPE00119576a9c5-CM0012c90d36fc.cpe.net.cable.rogers.com) joined #forth 19:01:47 --- quit: I440r (Remote closed the connection) 19:06:07 --- quit: uiuiuiu (Remote closed the connection) 19:06:09 --- join: uiuiuiu (i=ian@dslb-084-056-224-218.pools.arcor-ip.net) joined #forth 19:12:30 Quartus: thanks for that CREATE DOES snippet. I missed most of the discussion... 19:12:59 Sure. I just tossed it together to be sure what I was telling jcw would work, but if it's useful I'm glad. 19:13:37 (create) ( addr1 -- FUBAR ) 19:13:54 Something like that. I prefer (create) ( addr1 -- addr2 | ... ) 19:14:34 or (create) ( addr1 -- addr2 | clause> ) 19:14:44 --- quit: vatic ("using sirc version 2.211+KSIRC/1.3.12") 19:14:49 (create) ( addr1 -- Ctrl-Alt-Del ) 19:14:57 Maybe not. :) 19:18:07 It's kind of a constructed conundrum. I factored out (create) for no particular reason. Had I left it in the code, it wouldn't likely have been gifted with a stack diagram, so there'd be no question as to how to annotate it. :) 19:19:10 Well, I suppose it's better factored out. Makes each CREATEd word smaller. 19:45:32 --- quit: nighty_ (Client Quit) 20:03:02 A simplification of the CREATE/DOES> code: http://pastebin.ca/111034 20:39:26 I see to have an eggen and the chick problem here. 20:39:44 how so? 20:39:45 : myconstant create , does> @ ; 20:39:50 OK, here we go. 20:40:32 myconstant gets created, and compiles 'create' and ','. does> executes, and ends the current word, creates a new word (xxx---xxx for now), and compiles '(does)' 20:40:54 Right. 20:40:55 It saves the address of the 'xxx---xxx' word for backpatching. 20:40:59 Ok. 20:41:12 Create, when it runs, saves a pointer to noop word. 20:41:20 Well, hang on. It should immediately backpatch the right spot in myconstant. 20:41:23 create runs with you save 5 myconstant five. 20:41:30 hmm. 20:41:46 That spot being a literal immediately in front of (does). 20:43:01 But create hasn't run yet, so how does it know where to patch? 20:43:23 myconstant is backpatched so that (does) can put the right xt into the created word later, when it's created. 20:43:51 CREATE stores the most recently-created word's backpatch in a variable I called 'latestcreate' in the pastebin above. 20:43:53 http://pastebin.ca/111034 20:44:15 So (does) takes its backpatched literal xt, and puts that in the right place designated by latestcreate. 20:44:18 Yea, I saw that. 20:46:23 Plus your description above is out of order a bit. I said "right" too hastily. DOES> executes, compiles a literal to be backpatched, compiles (does), then ends the current word, then begins a new word. 20:46:35 : use ( xt -- ) ( store it in the latest word's data field ) ; 20:46:35 : does ( -- ) r> use ; 20:46:35 : does> ( -- ) postpone does postpone r> ; immediate 20:46:35 : create ( -- ) : 0 , does> ; 20:47:09 segher, I'm not sure how helpful that's going to be for his implementation; it isn't quite Forth. 20:47:15 His implementation, I mean. 20:47:35 quartus: heh okay. it's quite beautiful though :-) 20:48:03 It seems to make quite a few assumptions about the implementation. 20:48:28 just that return address is put on the return stack, really 20:48:56 I'll have a look at it. 20:49:01 :-) 20:51:34 OK, as I said, in this case when I hit the DOES>, I end the current word and start a new word. Do I want the literal and the (does) at the end of the ended word, or at the start of the new word? 20:51:50 Actually, It hink you answered it. 20:52:03 In your example, that code should be in myconstant. 20:55:36 segher_, is that your entire 'create'? Where does it terminate the created word's definition that is started with : ? 20:56:30 quartus: does eats r> .... 20:56:35 eats its return entry 20:56:44 Sure. That's not what I'm asking. 20:56:54 your create does : ... never does ; . 20:57:08 colon, but no semicolon. 20:57:18 you mean, a word using create , where's that ended? 20:57:37 No, I don't mean that. 20:57:42 what then :-) 20:57:50 I mean, you've defined CREATE, above. It uses : to define a new word, right? 20:58:17 yeah 20:58:19 OK, assuming I can compile WEIRD: how to I use it to test? 20:58:48 jcw, do create foo and then foo . foo . the two values returned should be addresses, second one higher than first by 1. 20:59:02 segher_, so if I just do CREATE foo 20:59:06 when is that definition terminated? 20:59:30 quartus: when does> is run, it compiles r> 20:59:48 So you cannot use your CREATE by itself. Has to be inside a definition that also includes DOES>. 20:59:54 no you can 21:00:02 Bumber. Same numbers. 21:00:14 CREATE isn't normally terminated, you know 21:00:29 Or do you mean WEIRD: foo foo . foo . ? 21:00:40 CREATE _itself_ includes a DOES> , heh 21:00:44 The dataspace associated with a CREATE isn't bounded, but the definition itself is findable in the dictionary, and thus has to be terminated by ; if it's created by :. 21:00:49 jcw: yes 21:01:02 Sorry 21:01:07 works. 21:01:12 Aces! 21:01:24 Damn, you're good. 21:01:41 Only when I type what I'm actually thinking, jcw. :) 21:01:45 :) 21:02:08 quartus: ah i see. okay, that's another system dependency i suppose. my systems don't care if i don't terminate a definition 21:02:20 Ah. I thought there were some quirks hidden in there. :) 21:02:28 I (obviously) now have a HERE space, and the HERE space operators (! w! c! ! w@ c@ , w, c,) are all range checked. 21:02:33 jcw, that's neat. 21:02:48 You're partway along to having a Forth that can call itself a Forth. ;) 21:02:50 quartus: just replace the : with HEADER or something, and you'll be fine 21:02:58 Heh 21:03:02 segher_, not quite that simple I'm afraid. 21:03:39 Should subsequent foo .'s continue incrementing the address? 21:03:59 I suppose I can answer that myself by running it in gforth. duh. 21:04:05 quartus: well it is -- it's how i used to do it :-) 21:04:25 jcw, no. First time it's run it reassigns its own DOES> code to the 2 + part, and then after that it always does that. It's a really odd thing to do, but it does show if your CREATE/DOES> works according to Hoyle. 21:04:26 excellent. The correct answer is 'no'. 21:04:52 segher_, ok, go and do it in gforth and get back to me. :) 21:06:05 jcw, if you want an exercise, write a word that creates self-incrementing constants. 21:06:29 Hint: use CREATE/DOES> :) 21:07:03 Yes. Now that I have a new hammer in my toolbox, I need to find more nails. 21:11:03 It's a one-liner. Supposing it's called INCREMENTING -- 5 incrementing monkey monkey . -> 5 monkey . -> 6 monkey . -> 7 and so on. 21:16:51 segher_, also, in your system, what does '0 ,' accomplish in create? 21:20:28 --- join: snowrichard (n=richard@adsl-69-155-177-154.dsl.lgvwtx.swbell.net) joined #forth 21:26:48 hi 21:26:53 Hi snowrichard. 21:27:12 just updated my site at http://schizophrenicprogrammer.info 21:27:15 http://www.referenceaudiomods.com/Merchant2/merchant.mvc?Screen=PROD&Product_Code=NOB_C37_C&Category_Code=VOLUME&Product_Count=2 OMG... 21:28:11 snowrichard, I like the FAQ, it's very concise. :) 21:28:17 quartus: the 0 , makes room where does> will store the xt of the code to be executed by the create'd word. could be ['] noop , 21:28:43 jcw, that's amusing. "The standard bakelite knob is certainly the best sounding compromise..." 21:29:05 segher_, I take it you're assuming a segregated data and codespace. 21:29:12 485 for a wooden knob? 21:29:15 quartus: yeah 21:29:35 quartus: i use a plain old bog standard forth execution model -- mostly ;-) 21:29:37 I know! The only people more ignorant than so-called "audiophiles" are politicians. 21:29:52 More to the point, the suggestion is that the knob on the amp makes some kind of difference to the quality of the sound, which makes a whole lot of stupid seems smart by comparison. 21:30:11 http://programmingishard.com/ Wanna add some Forth snippets? 21:30:23 Programming is easy. Comedy is hard. 21:30:44 segher_, did you finish the gforth version? :) 21:31:00 Programming is hard. Which is why it should be left to paid professionals, such as myself. 21:31:11 quartus: can't find my gforth sources. exercise left to the reader 21:31:16 Oh? When is my cheque coming? :) 21:31:18 Make sure you tell your friends that programming is hard. 21:31:40 It's in the mail. 21:31:57 So apparently LYING is not hard! :) 21:32:41 "The point here is the micro vibrations created by the volume pots and knobs find their way into the delicate signal path and cause degradation (Bad vibrations equal bad sound)." 21:32:46 BAHAHAHAHAHAHAHAHAHA 21:33:01 hehe 21:33:25 (Bad brains equal big stupid). 21:33:40 I can't read some of the PHP examples without highlighting them. the colors are invisible 21:33:53 (i'm colorblind) 21:34:11 Opera has overridable colours. 21:34:18 overriding colours? Something like that. 21:35:00 segher_, then you'll have to take my word for it that it's a bit more complex than just swapping header for : 21:35:41 And now for the most important part of the day: burning a back up to CD, and offsite copies on two different machines. 21:37:22 jcw, did you write INCREMENTING? 21:37:29 Not yet. 21:38:06 quartus: not unless _you_ prove that :-) 21:38:34 Can easily show that your code with header instead of : just plain don't work, pal. :) 21:39:31 so do that :-) 21:39:46 Done. Spark up your gforth and feed it your code and see the proof for yourself. :) 21:42:55 replace : 0 , by header reveal dovar: cfa, 21:43:13 yes gforth is way too verbose :-) 21:43:58 my code is missing that reveal btw, there's a real bug 21:44:55 sooo... you don't test it after you write it? 21:45:31 no, this was from some old design doc 21:45:47 So in other words you have copied the code directly from gforth's existing CREATE. 21:45:55 Not gonna cut it. :) 21:45:55 yeah sure 21:46:26 what _else_ to do to be compatible with gforth's header structure 21:47:02 But that doesn't make your code run under gforth. What are you doing for 'use'? 21:47:38 something with lastcfa @ 21:48:08 Supposing you get that sorted out, will your DOES> work outside of a word containing CREATE? 21:48:14 nope 21:48:20 and it doesn't have to 21:48:31 DOES> in interpretation mode is non-standard 21:48:40 I don't mean in interpretation mode. 21:48:57 ah okay. yes it does work, then 21:48:59 I mean in a word by itself, as per : DOES1 DOES> @ 2 + . ; 21:49:27 yes. it works fine, there 21:49:32 So prove it, man. Write USE for gforth. 21:49:46 why would i? 21:50:20 Aren't you still trying to back your assertion that your code will work in gforth, only requiring minor changes? 21:51:25 i'm not trying to back it. i state it is so. if you don't believe it, that's fine with me 21:51:52 That is bizarre coming from a rational guy like you. 21:52:03 But ok, as you like 21:52:15 :-) 21:56:30 wow, i'm a rational guy. thanks :-) 21:58:02 I figured you to step up and give it a try, or I wouldn't have asked. 22:04:52 Time for bed. Tomorrow we (probably) add counted loops and fence/forget. And warnings for already defined words. 22:05:51 Hrm. I bet forget can get real fun when you factor in deferred words. 22:06:04 FORGET is old hat, I recommend MARKER. 22:06:23 whassat do? 22:06:24 Redefined warnings are good. Nice if you can disable them, too. 22:06:44 MARKER foo makes a word called foo that can roll the whole dictionary state back to that point when you call it. It eats itself, too. 22:08:48 seems like it could be a nuisance to remember to set a marker if you want to do a rollback. Like if you're playing at the command line. 22:09:14 If you're playing at the command line, you'll either just redefine words as required, or restart the environment. 22:09:44 hm 22:10:13 FORGET is way hard to implement (correctly) on many systems; MARKER is much easier 22:11:30 Perhaps I'm missing something, but the exception of changing the CFAs of deferred words to exit, abort, or noop that reference forgotten words, it doesn't seem very complex. 22:12:11 Guessing your dictionary has only the one wordlist? 22:12:17 Yes 22:12:37 FORGET also assumes all your words are layout linearly in data space 22:12:49 Maybe a simplistic implementation does. 22:12:54 true 22:12:59 but not all 22:13:07 I already have FORGET, in essence, when I exit. It trolls back through the word list, freeing memory, etc. 22:13:24 So far, valgrind hasn't found any incorrectly handled allocations. 22:13:32 why would you do that? just have your process killed 22:13:42 ah, for checking, sure 22:13:55 Yes 22:15:08 MARKER can also store additional state and ensure that it's appropriately restored. Interrupt handlers, for instance. 22:15:10 What I'd really like to implement is private name spaces on a per-source file level. If could be finer grained, however. I haven't yet given this a great deal of thought, other than thinking I'd like to not worry about duplicate variable names, etc. 22:15:35 quartus: yeah 22:16:10 Per-source-file? Hmm. Doesn't strike me as useful. Wordlists are useful, for sure, but I can't see why you'd do it on a source-file level. 22:16:39 I break things up at that level, usually. That's the minimum case I'd want to support. 22:16:52 Almost something on the order of all words are private unless exposed. 22:17:14 Sounds considerably more complex than is generally considered useful, but your system is already wierd, so. :) 22:18:21 perhaps you want to explicitly start new namespaces at the start of every source file -- many people do that ;-) 22:18:35 You could almost do this with the hidden attribute. Simply declare all variables and functions you don't want exposed as hidden after the file loads. But that would require manual tracking unless I setup a marker of some sort, then say "now hide all except exposed". 22:19:13 How does that work? If I defined a namespace, how does a function in namespace B call a function in namespace A? 22:19:31 I would recommend setting up a generalized search-order and wordlist capability; one option is to go with the set of words the Standard espouses for the purpose, which work quite well. After that you can decide how you want to use it. 22:20:10 I have built a simple module/public:/private:/end-module facility on top of the standard wordlist stuff that lets me hide and expose words as needed. 22:20:28 You could as easily build a per-file version that wrapped INCLUDE. 22:20:30 ALSO the-wordlist-you-want-to-use . or oyu can export some words to some other wordlist 22:22:26 So if you 'variable xx' in namespace A, and 'variable xx' in namespace B (and assuming your system has duplicate word warnings), when he's doing a define of somekind, he doesn't check outside his wordlist for that name? 22:22:49 he? 22:22:50 i.e., you'd only get a duplicate warning for a name already defined in the current namespace? 22:22:53 she? 22:22:54 Oh. Yes. 22:23:13 Already defined in the current search-order, is how it's handled in the usual case. 22:27:26 I'll have to think about this. In playing with Factor, which uses ALSO (or something similar), I did find the constant need to ALSO just about everything useful irritating as hell. 22:27:45 That's why I build the module facility. Handy. 22:28:25 jcw, it sounds like you're hastily building your compiler using features you're familiar with from other languages. 22:28:31 Your module facility sort of sounds like what I have in mind. 22:28:36 Some truth in that, yes. 22:29:13 Since it's Forth-like at its core, you might want to try some of the tried&true Forth facilities in it (as you did with CREATE/DOES>), modifying them or adding to them after seeing how they fit in natively, as it were. 22:29:35 Such as? 22:29:52 One advantage to that is being able to use, at least in large part, existing snippets for things without having to invent a you-specific way of doing them. 22:30:03 Like, say, wordlists and search-orders. 22:30:37 I suggest building common-practice, and extending it as best fits your environment. Best of both worlds. 22:30:52 Possibly. Although going out to find said snippets and integrating them in can take longer than having an idea of what I want, and just writing it. 22:31:46 Well, you're part of a small community here, and most of us won't be conversant in your private compiler language. So by being able to run more-or-less common Forth, you'll be able to leverage our help. 22:31:56 Likewise we'll be able to use the things you come up with. 22:32:41 As per CREATE/DOES>, you can share solutions that use those now because yours work the way everybody expects. 22:32:48 Here's the basic overview: I am not a proficient Forth programmer, but I can make things work, and I usually rapidly see how to improve them once I have it working. I support the majority of common Forth words, at least for like F83. The ultimate goal is to have a scripting language that has much of the power of Forth (more) 22:34:06 but with type checking and such as native parts of the language, primarily to protect the inexperience person. When they try to assign a string to a memory pointer (or such), it shouldn't let them do it. It's not as strongly typed as Pascal, but there is some. Also, strings are a native type, because Forths string handling is pathetic. 22:35:02 Sure, I follow what you're aiming at. I'm not meaning to sound antagonistic to pet languages, I just wish they were built on a platform that made them a) portable and b) able to incorporate standard code, at least in large part. 22:35:08 I looked at writing this system in Factor, isForth, and gforth, and without becoming intimately familiar with them, I found that they didn't suit my needs, at least, not quickly enough. Factor kept trying to hide things from me, isForth isn't fully fleshed out, and gForth lacked the string support I liked from Factor. 22:35:20 No, I understand that. I'm just giving you background. 22:36:40 I also felt that my writing my own, any limitations I ran into the others, I could work around. I tend to be very mutable, where if something doesn't work as I like, I rip it out and rewrite it. I'm not in the least bit shy about doing that. 22:37:23 I make the suggestion triggered by your comments about some oddball per-file namespace deal. Nothing wrong with that as such, but it means you lack easy communication with people used to the way Forth normally does it. Taking my suggestion, you'd build the common-use tools, and build the oddball stuff on top of it, and it'd be a win for you and for us too. 22:37:30 I want my language to be capable for capable programmers (like create/does>. I guarantee not a single one of my users will understand it), but fairly bulletproof for the less sophisticated ones. 22:37:46 That perhaps might be doable. 22:38:29 While I "speak Forth", the more modern facilities I'm not familiar with. I've always liked Forth, always been a proponent and evangelist, but almost never got to do anything with it were I got paid. 22:39:25 The create/does> stuff is a good example. Once you got the concept nailed into me, the implementation was pretty easy. I lacked a thorough understanding of it needed to work. 22:39:41 er, how it needed... 22:39:48 Well, you see what I'm saying. Having the ability to speak normal Forth means you may be able to use code others write, and others will certainly find your implementation easier to use. 22:40:22 And the scripts that get run may not all be written by your Fisher-Price users. :) 22:40:59 Yes, I don't disagree with your point. 22:42:46 Of course, depending on how weird the underpinnings, there may be some normal Forth things you can't do in your implementation. 22:43:37 So far I haven't hit any. But I imagine it will happen. 22:45:04 What I seriously doubt mine will support any time soon is multi-tasking. 22:45:36 It's suprisingly simple to set up round-robing multitasking, but I wouldn't consider it any kind of priority. 22:45:47 oops. Round-robin. 22:45:49 hehe. 22:46:37 I've never been a fan of round-robin. It's certainly suitable for a number of things, but I really prefer preemptive. 22:47:07 Of course, then you really have to worry about data protection, which complicates it. 22:47:17 And you'd generally use OS facilities for that. 22:47:52 Hmm. Hadn't thought about adding fork() as a word. 22:48:06 That certainly is one really easy thing to do. 22:48:26 Yah. And semaphore support wouldn't be hard, either. 22:48:37 Maybe completely useless for your users. 22:49:02 Just because they're bozos doesn't stop me from rampant featuritis. 22:49:19 True. 22:49:31 Just writing it is half the fun. Maybe more. 22:49:54 *knowing* that if you ever really want to fork and semaphore or named pipes between two or more Forth processes, you *could* if you wanted to. 22:50:28 Anyway I make my suggestion for another reason: I've seen others build a slap-together Forth, find that they can't build certain features in any commonly-found kind of way because of their early work, and then feel a need to defend their system's lack of interoperability to others, and I'd hate for you to be one of them. :) 22:52:20 Yah. 22:53:55 I really need to go to bed. Maybe tomorrow (later today?) I can poke you in the brain for ideas about how namespaces should operate. I'll likely implement something along the lines of the module/public:/private/end-module approach first. 22:54:17 Sure; talk to you later. 22:54:18 Then add wordlists (or dictionaries, or namespaces, or whatever all the cool kids are calling it these days). 22:54:31 If you take my suggestions, it'll build the other way up, but ok. 22:55:33 OK, we'll talk about it later. Thanks again, I'm really enjoying this (even if it does seem like I'm a little dense, at times). Off to bed. 22:55:42 Sure! Later. 22:57:46 --- join: richard_ (n=richard@adsl-69-155-177-154.dsl.lgvwtx.swbell.net) joined #forth 22:58:12 --- quit: richard_ (Read error: 104 (Connection reset by peer)) 22:58:49 hi 23:11:59 --- quit: snowrichard ("Leaving") 23:20:53 --- join: yoyofreeman (n=root@61.150.63.140) joined #forth 23:24:21 --- join: segher__ (n=segher@dslb-084-056-131-060.pools.arcor-ip.net) joined #forth 23:33:55 --- quit: segher_ (Read error: 110 (Connection timed out)) 23:59:59 --- log: ended forth/06.08.01