00:00:00 --- log: started forth/17.04.03 00:00:04 Well, that was why I was hoping someone out here already knew freeforth 00:00:04 : five-x: create, does> @ 5 * ; seems to do just what you need if you had been using ans 00:00:15 perhaps though it is a small channel it could be so 00:00:52 generally speaking there are 8 words in the above statement, so you simply must transalte 1 word at a time until you reach the end of the definition 00:00:58 freeforth has some cool stuff, but the original author seems to have gone dark. No recent postings, no response to email, etc... 00:01:08 For example what is the equivelant of : in freeforth? 00:01:18 Its still : 00:01:36 I know freeforth pretty well, but this stupid little thing has me baffled 00:01:38 and ; is still ; correct? 00:01:39 kevinfish: was going to download it and have a go, but apparently it is not 64-bit clean 00:02:02 and i don't feel like setting up an i386 environment right now 00:02:07 koisoke: yeah, I think its only 32 bit. There is a freeforth2 on github that might be 64 00:02:22 the latter is linux only tho 00:02:32 is there a particular reason why you have chosen freeforth? 00:02:45 I like some of the performance aspects of it 00:03:23 for example, it uses the cpu's status registers for tests rather than popping a t/f value off the stack 00:03:28 here is my reasoning. If freeforth is indeed abandoned then in a sense you are the developer in charge of keeping freeforth working and stable. And if you are using your own forth you will make a much faster forth by writing it yourself from scratch in c 00:03:38 hand written forths are generally always faster than forths written by others 00:03:44 at least according to moore 00:04:40 Well, I may be supporting it then. Me and the guy who's doing freeforth2. I don't think I'm currently at the level of expertise to whipe one up from scratch that's up to par with freeforth 00:04:49 looking at freeforth2 and i see a bunch of 32-bit asm 00:05:09 yeah, I haven't looked closely at freeforth2 cuz I'm doing an app in windows 00:05:15 if you understand forth to the point where you know reverse polish notation and understand macros then you should be able to write your own forth 00:05:29 I've written several already 00:06:03 If you have another person helping you with this 2nd version of freeforth then that should improve your odds 00:06:04 Its just this one has be interested in mastering cuz its so different 00:06:41 I think what I'll have to do is instead of trying to extend existing defining words, write them again from scratch until I figure this out 00:06:53 this is perfectly doable in forth. 00:07:09 redefining to make optimizations is a good strategy 00:07:23 and if you are indeed rewriting the freeforth "standard" into your own thing, this may be necessary 00:07:38 like for example, here's a definition: : fun:` :` lit` lit` #call ' call, ;` ; 00:07:59 fun: creates a word that will call an internal function call (like in a dll) 00:08:47 the :` postpones the colon def 00:09:07 it takes 2 args: the entry address (to be compiled by the first lit`) and the number of args (the 2nd) 00:09:47 do does fun:` postpone the function definition? 00:09:48 the #call ' call, compiles a call to #call which calls the address in the defined word 00:10:10 defining fun: with the trailing backquote makes it an immediate word 00:10:20 I see 00:10:32 so the ` character is used for a different purpose in that situation 00:10:49 but if you did something like : foo fun:` ... ; that would postpone fun: 00:11:07 he he he in your version of freeforth you may want to make that two separate symbols to avoid confusion 00:11:27 its a bit of a mind bender but there is a certain elgance to it 00:11:50 want to have some real fun look at the literal compiler and control flow in freeforth 00:12:14 almost all the words in the dictionary are macros to expand as much into inline code as possible 00:12:32 I haven't had much time to play with it yet but it must really scream 00:12:36 is there a freeforth equivelant to the ans forth word create 00:12:44 yes, it has create 00:12:48 does it have , 00:12:52 yes 00:13:19 here's constant: : constant` create` H@ ! anon:` ; 00:13:47 anon:` restarts it compiling an anonymous definition (its equivalent of interpretation) 00:14:48 so basically 00:14:50 --- quit: dys (Read error: Connection reset by peer) 00:14:53 I think H points to the memory location where the header gets compiled in the symbol table 00:14:54 in terms of the first ' 00:14:58 as in : myword' 00:15:03 that is the same as using the word immediate on that word 00:15:11 yes 00:15:12 and in terms of putting ` at the end of the word 00:15:17 it is like saying ' thatword 00:15:28 as in : pointer-to-create ' create ; 00:15:30 the opposite 00:15:38 similar 00:15:38 : myword` is immediate 00:15:47 strange 00:15:52 and foo ' is similar to ['] foo 00:15:54 so it does not delay it from being evaluated then 00:16:07 ' turns the previous call into a lit 00:16:14 or rather it delays it from being evaluated once but after compilation it gets evaluated each time 00:16:17 it splices the previously compiled code 00:16:22 ^ ? 00:16:56 words that do not have ` are run as normal words during compilation but words that have ` are quoted 00:17:27 words that have a trailing backtick in their dictionary header are immediately executed 00:17:46 but if they have a trailing backtick as they are being copiled into the body of a definition are postponed 00:17:51 Let me show you some ans forth 00:18:10 s" hello" s" hello" .s will show you two different string pointers even though they are the same string 00:18:24 but if I run : mystring s" hello" ; mystring mystring = I get true 00:18:31 or rather 00:18:32 he he 00:18:41 mystring mystring .s will give you two copies 00:18:50 right 00:18:59 that is because s" is sort of a macro and has different compile time behavior than runtime behavior 00:19:34 but that is as far as I understand it because I do not understand the word immediate, or the word create, or the word , 00:19:57 freeforth is pretty bizarre, but is very forth-like in the concept that if you can tweak things a little bit and get a performance gain and shrink the compiler, or speed it up, then go for it. 00:20:56 Like Chuck says: "confusion only exists once, but cost exists forever" 00:22:17 My intuition tells me that there are 9 words in the working ans code and we have already translated 7 of the words 00:22:20 well, most languages like forth, lisp, etc... that heavily rely on macros can twist your brain trying to figure out what is happening when 00:22:31 and so logically if we can translate the other 2 words then we will ahve solved it 00:22:44 I don't think its that easy 00:22:57 first of all in our ans forth version we did not use a backtick in the word name 00:23:08 its not a direct translation thing, cuz freeforth compiles an anon definition and executes it instead of intrepreting 00:23:20 does freeforth have a version of the word does> ? 00:23:25 no 00:23:32 do you know what does> does? 00:23:37 yes 00:23:40 what does it do? 00:23:44 and therein lies the rub essentially 00:24:01 I do not know what does> or create or , do 00:24:02 does is the runtime part of the defined word giving the address to the compiled data 00:24:32 so the part on the left side of does> is the compile time behavior 00:24:40 with create/does you have the compiling part and the runtime part 00:24:44 yes 00:24:56 is compile time behavior immediate? 00:25:04 you craft your data between create and does and then you say what you want to do at runtime on the right 00:25:27 hmmm.... have to think about that for a min. I don't think it has to be. 00:25:27 oh I see 00:25:43 --- join: dys (~dys@ip-109-40-2-79.web.vodafone.de) joined #forth 00:25:51 what is the difference between how the compile time code is handled and how the runtime code is handled 00:25:56 create/does is like the mold that makes the mold that makes the object 00:26:33 : test create 2 + does> 2 + ; 00:26:46 you have to be more specific. The compile time code is taking stuff off the stack that you can tweak then comma into the run time version's data area 00:27:02 see, that wouldn't work cuz you didn't compile any data 00:27:04 My stack is empty 00:27:13 I typed gforth RETURN : test create 2 + does> 2 + ; 00:27:22 you'd have to do something like : test create 2 + , does> @ 2 + ; 00:27:30 what does , do? 00:27:52 comma places the value on the top of the stack here in the dictionary and advances the dictionary pointer 00:28:06 essentially, comma is forth's compiler 00:28:15 here is a word which produces a free pointer correct? 00:28:24 , requests a new free pointer 00:28:25 here is the pointer 00:28:35 here produces a new pointer if you type , 00:28:57 so comma is something like : , ( n) here @ ! 1 cell here !+ ; 00:29:12 what does !+ do? 00:29:12 oops, I mean +! 00:29:29 s/!+/+! 00:29:50 +! is like : +! ( n a) dup >r @ + r> ! ; 00:30:16 it just increments the value at addr a by val n 00:31:13 John[Lisbeth]: have you tried reading starting/thinking forth yet? 00:31:21 here returns the pointer to the start of free data space. it doesn't return a pointer to the pointer, so you can't ! to it like that 00:31:24 I prefer to skim 00:31:44 I am sufficiently certain my assumption abut what , does is correct 00:31:47 ok, yeah, its been a few years since I've used a standard forth 00:32:03 , seems to just put a new pointer in here 00:32:21 so comma is more like : , here cell allot ! ; 00:32:33 so if you did something like here . 100 , here . you'd get a printout of two numbers advanced by one cell 00:32:43 is here a pointer to an index in an array? 00:32:47 kevinfish: yes 00:33:12 well, if you call the unallocated forth dictionary space an array, then yes 00:33:18 but it usually isn't thought of like that 00:34:23 traditionally forth is just a big block of memory with the code/headers at the bottom growing up, the disk buffers at the top, and the stacks at the top growing down 00:34:38 what if I say : anonymous-variable here cell allot ; 00:35:06 that will leave here on the stack 00:35:10 yes 00:35:16 because it is anonymous and not a variable 00:35:25 not a named variable 00:35:37 yeah, I guess that would work 00:35:41 I see 00:35:49 so then variables in forth are actually quite literally just forth words 00:35:53 but then 00:36:17 when I allot cells to a variable that certainly does not add to the dictionary does it? 00:36:43 John[Lisbeth]: ?? 00:36:48 allot cells to a variable? 00:36:49 usually you can do something like variable foo 0 , if you want a double sized var 00:36:54 variable foo 10 cells allot 00:37:06 but that may be breaking the standard 00:37:11 John[Lisbeth]: that is not guarnateed to give the behavior you want 00:37:20 you want create there 00:37:33 variable foo create 10 cells allot 00:37:38 right, some forth's may create those with malloc 00:37:46 in which case they wouldn't be contigious 00:38:12 John[Lisbeth]: Create foo 10 cells allot 00:38:54 why is create foo 10 cells allot better than variable foo 10 cells allot ? 00:39:15 John[Lisbeth]: simply because the standard doesn't guarentee they would be contigious with variable 00:39:29 I see so create is ans standard. Fine works for me 00:39:31 that may call two calls to its heap manager 00:39:33 and even if they were, you would be allocating 11 cells there 00:40:13 it would work fine with traditional forths but the standard allows for non-traditional memory maps/allocations 00:40:26 so lets say I do create foo 10 cells allot 00:40:31 Is that being added to my dictionary? 00:40:41 or are those 10 cells somewhere else 00:40:48 well, depending on how the forth is implemented 00:41:00 does ans specify? 00:41:11 most common forths use a single upwardly-growing heap where the dictionary and alloted data space are just appended onto the end 00:41:13 see, like freeforth actually has what it calls a "heap" where data/code goes and a symbol table where word headers go 00:41:28 but it's implementation-dependent 00:41:55 but according to the standard, for example, data and programs could go in different places, or each call to allot could get allocated to a completely different place 00:41:58 --- quit: dys (Read error: Connection reset by peer) 00:42:56 or they could go the same place and the implementation could add other stuff after the variable's data cell 00:42:58 John[Lisbeth]: what language(s) are you sued to? 00:43:09 s/sued/used 00:43:39 I learned c++ then bash then haskell then lisp then javascript then forth 00:43:58 approximately 4.5 years of programming. 00:44:17 ya, sux how most people start out with an algol variant 00:44:24 messes them up 00:44:33 I'll keep that in mind 00:44:46 bash and c++ Fucked me up 00:45:04 c++ was awful and I hated it and bash was even worse. It was like stepping out of a bad home into a hyper abusive psychotic home 00:45:04 I was semi-lucky. I started out with some basic, then assembly, then forth, then C then lisp 00:45:12 lol 00:45:34 and so after 2 bad languages in a row the problem I wanted to solve was how to choose a language were due to design choices I would never logically be forced to switch. There would not be a thing that that language should be able to do that it could not. 00:45:37 And here I am. 00:45:46 by the time I got to C I realized it was bullshit to have to jam all my programs into an infix algebraic formula 00:46:38 forth is the most satisfying language I've used, but lisp is the 900 lb gorilla that can't really be ignored 00:46:56 C would be so much nicer if it had a decent macro system 00:47:05 well, there's always m4 00:47:13 but that's YET another language to learn 00:47:29 yes, there's always that and then it doesn't know about C's syntax at all 00:48:15 yeah, I used it to craft my 4th in c headers. It did it in about 1/2 a page of code that mostly looked like line noise 00:51:14 I spent 4 years looking for forth essentially 00:51:18 and lisp and forth both do what I want 00:51:24 but forth is simpler 00:51:26 John[Lisbeth]: I can't really think of a language like that. I mean you can do just about anything in forth pretty elegantly, but you might have to build a lot of the utilities yourself 00:51:43 with lisp you can get most everything prebuilt 00:51:51 Have you tried clojure? 00:51:58 so lisp can rewrite it's self completely from the core up and so for that you get everything forth has because you can turn lisp directly into ans and remove all the lisp parts 00:52:12 so lisp and forth are equivelant in their abilities 00:52:24 except that nothing crafts tight code like forth 00:52:32 lisp just happens to require some pieces to it which are much more complex and add bulk 00:52:37 and forth does not have those pieces 00:52:40 not by default 00:52:53 FreeForth is the tightest code I've seen so far 00:53:09 but sadly its only for x86 right now 00:53:13 and not metacompiled 00:53:59 lbforth looks pretty cool. Bootstraps with a metacompiler written in lisp to get you a c-forth and then that is used to metacompile the forth to several different common cpu targets 00:54:26 freeforth is probably pretty tight for a couple reasons 00:54:50 first of all if it is indeed x86 then that makes it tighter than gforth at the least because gforth is written in c to my knowledge and x86 produces smaller forths than c 00:54:54 it saves a lot of stack popping. For example it renames registers rather than swapping 00:55:33 plus it uses the cpu's on status register and compiles jumps based on those flags so that has got to be screaming fast 00:55:42 furthermore ans forth is meant to be a robust forth that could meet the needs of everything a programmer could logically want from their computer to do. That adds bulk 00:55:44 s/on/own/ 00:56:02 Not only are there things not every programmer will need in ans forth but ans forth makes some speed sacrifices just to be portable and backwards compatible 00:56:09 what I'd like to see is a freeforth metacompiled with several target cpu's 00:56:32 freeforth on the other hand is made by a single person and is suited the best to their own needs. There is no telling how much effort was spent on backwards compatile or potability outside of x86 00:56:40 *portability 00:56:53 not that it would not be portbae outside of those environments but doing so would add to the bulk 00:57:02 it would be a challenge, but I don't see anything inherent to x86 in the language's basic design 00:57:23 the point being that a person's own personal forth is way faster than one they got from someone else because it works just for them 00:57:27 that is unless you were dealing in a very different type of cpu 00:57:47 so you really have to choose between portability and speed once you get to a certain point 00:57:57 and it is not black and white but a gradient between portability and speed 00:58:45 basically 00:58:59 I think freeforth could be pretty portable between most conventional cpu designs 00:58:59 if you had a near perfectly abstract machine it may be very slow and if you had a near perfectly fast machine it would only work on your computer 00:59:20 Or you can choose something which is portable to most machines and decently fast 00:59:39 its just that porting freeforth would be a moderately difficult task because there is a lot of (currently hand crafted) assembly 00:59:55 One of the issues with this though is that there are very few forth developers out there compared to other languages 01:00:19 there is one called ff by the author of chicken scheme that has very little assembly but it would probably suffer a bit in speed. Eforth is very similar 01:00:31 Compared to lisp we have very few developers, but lisp already is very spares of developers 01:00:38 yeah, that's why I've been forced to use lisp for most things 01:00:45 indeed 01:00:51 we forthers can not afford to be split 01:00:57 not in my opinion 01:01:04 I'm liking clojure currenty for the broadest coverage 01:01:26 ans is probably the closest thing we have to something that we can agree on. The previous forth standards by moore and his people should be just as good. 01:01:29 I save forth for those tasks where nothing else comes close, like embedded and drivers 01:01:40 I want to use forth for high level programming 01:01:50 then you should probably try factor 01:02:17 In my mind factor is not a good prescident for how it should be done. I think gforth is more appropriate 01:02:41 gforth is certainly a fine system. Isn't it gpl tho? 01:02:53 Yes. This seems like the most logical license. 01:03:00 Although because ans is not gpl this is solveable 01:03:08 kevinfish: why the lisp metacompiler for the C target and forth for all other targets? just historical reasons and inertia? 01:04:01 koisoke: yeah, idk, but I see on his todo list eliminating that 01:04:35 John[Lisbeth]: well, I convinced dirk zoller to use lgpl on pfe so it could be used for commercial projects 01:05:00 generating C is different enough from generating machine code to memory/an image, so two different metacompilers makes sense i guess 01:05:12 ans is what we are talking about not gforth 01:05:17 gforth is an implementation of the ans standard 01:05:39 --- quit: xek (Quit: Ex-Chat) 01:06:11 right, but before you can use it for a commercial project (where you don't want to release all your source code) you're going to have to find/build a non-gpl version of ans 01:06:26 --- join: dys (~dys@2003:5b:203b:100:6af7:28ff:fe06:801) joined #forth 01:08:13 Chicken scheme looks pretty nice for creating stand alone apps 01:09:15 IN order to get forth to be developed to the point where it is as fast and capable as lisp we need at least as many developers as there are lisp developers working on an implementation of ans 01:09:30 and a pretty liberal license: https://opensource.org/licenses/BSD-3-Clause 01:09:30 if it is proprietary then that will not happen because the source will be closed 01:09:41 with a open or free license it could occur 01:10:23 but part of the problem is that many languages are alot easier than forth by far 01:10:29 at least to a new programmer 01:10:32 John[Lisbeth]: do that and you will get something so bloated it is unsuitable for what most people want to do with forth 01:10:33 such as factor 01:10:39 exactly 01:10:43 and that is why you don't do it 01:10:43 well, forth is probably faster, but it could probably use something like clojars/boot for its libraries and build tools 01:10:52 you create a word which will do if you use that word 01:10:59 but if you don't use that word it doesn't happen 01:11:41 this has, in essence, been the same discussion in Forth since I got into it in the early 80's 01:12:05 which is? 01:12:31 reusable libraries, version control, bringing in new blood, etc... 01:12:41 so on the one hand 01:12:51 I think there is no doubt that the ans standard already has libraries built in 01:13:10 I think that people simply do not write and publish them in portable ans forth 01:13:31 there are some standard libraries out there. Nothing on the order of what most other languages have tho 01:13:34 for version control we have git. We do not need to build it into the language 01:13:51 git is great and robust version control 01:13:52 Well, for example, check out clojure/hoplon/boot 01:14:05 it can be done locally if you dont want to release your code to github 01:14:22 and those aren't the only thing we need to bring in new blood 01:14:42 clojure makes sure that you build only against certain versions of libraries so upgrades in them don't break your code 01:14:54 here is my reasoning 01:14:57 I don't know of anything like that in forth yet 01:15:07 but I've been out of it for a while, so maybe there is something now 01:15:14 clojure is immutable 01:15:19 forth is not 01:15:23 we must keep this in mind 01:15:28 John[Lisbeth]: immutability has its advantages 01:15:33 we can make immutable libraries in code but we do not have to 01:15:33 kevinfish: i'm not either, but it is hard to have package management like that when you don't have a package system 01:15:40 we can try to control state at the least 01:15:48 but we do not have to 01:16:04 it wouldn't be that hard to make an immutable forth IMO 01:16:09 imagine gforth but lets change the name to xforth because I mean any forth at all which claims to be ans compliant 01:16:16 lets say xforth is a project on git which does this 01:16:52 if the xforth developer and I are working separately and I use xforth as a base then I can put whatever kind of high level stuff on it I want and the forth below that he made will still be usable for whatever level he intended it for. 01:17:43 you see, I think early on we need to make up our mind: are we going to rely on pre-existing tools to do the machine level optimization, or are we going to let forth do it. If the former, we should probably just stick with a C version because the compilers that are out there are hard to beat. If the latter then something like freeforth is hard to beat 01:17:43 furthermore when you add to an ans forth you need not temper with the ans standard at all 01:17:58 both 01:18:08 not only can we depend on forth but we can use machine tools if we like 01:18:23 and we can also try to implement those machine tools in highly optimized forth as moore proposed 01:18:46 as moore more or less put it if you have written 2 + 2 - you have wasted your time 01:18:57 If we are going to do forth in C then we have the same issues that scheme has: http://home.pipeline.com/~hbaker1/CheneyMTA.html 01:19:09 And you can take a forth program and rip out every single thing that does not do what you want and it becomes one tiny thing that does what you want very well. 01:19:45 If people want forth to behave like a machine component of an operating system they need to remove the parts that are not helping the machine 01:20:08 but if they want to use it more like a shell like a lisp repl is then in that version they need to keep it all in one big heap or what have you 01:20:42 Forth should do everything and if you have been handed a forth that you assume does everything and then you make it so that forth doesn't do everything anymore then you fucked it up 01:22:04 and that includes making it so it can't be used as low level anymore 01:22:08 at least in my opinion 01:22:11 well, you could always do something like target compiling to eliminate all the words that weren't called 01:22:17 kevinfish: i don't see C's advantae there as peformance. naive subroutine threading + peephole optimization is only worse than a good compiler by a factor of ~2-3, so not really worth the overhead and longer compilation turnarounds for most uses. but cross-platform compatibility can be worth something 01:22:45 eliminating all the words that were not called is a very important step but there are more things that you can do 01:23:25 koisoke: yeah, I'm thinking targeting some other portable assembler might be more fruitful 01:24:10 First of all I think if you have something like ans forth or smaller that certainly means you can do low level with it 01:24:16 I think low levelers clearly have no problem using forth already 01:24:44 high levelers have trouble using forth 01:25:32 and I think I can take a forth and if that forth does everything then I can modify that forth to be easy for high levelers and still do everything, plus a few kilobytes 01:25:50 and I think the more experienced I get at forth the less those kilobytes will be 01:26:13 Just the bare minimum to make it as easy as something like javascript 01:27:04 in part it is just making alternate words for words that are cryptic looking. Making a version of : and ; called define and finish-define 01:27:13 or finish-definition 01:27:27 https://www.gnu.org/software/lightning/ 01:27:31 John[Lisbeth]: Why not 'def' and 'endef'? 01:27:38 sure why not indeed 01:27:40 equally phonetic 01:27:42 John[Lisbeth]: nobody wants cobol fingers 01:27:49 certainly not 01:27:58 but you see my point 01:28:06 : dereference @ ; 01:28:08 see what I mean? 01:28:08 : and ; take about a minute to learn and is not what puts people off of forth 01:28:13 and for example 01:28:23 teach new forth programmers to use the { word to get their arguments 01:28:47 the { word makes forth alot easier and comes with ans and makes it much more like lisp or c 01:28:53 it comes for free in gforth so why not 01:29:04 It also enforces comments which are important 01:29:32 It just a matter of adding a few words to forth and not running any of them 01:29:46 well, one thing non-forther's are going to find difficult is to properly factor their code so that the few stack operators can actually get to the arguments, but I've found that to be one of the BEST things about it. To be forced to do it so you are forced to think about (and name) every part of your program 01:30:05 kevinfish: I can vouch for that, 01:30:22 I dunno I think the { word is really great 01:30:37 It helped me solve a problem where I thought I'd need a ~10G database in ~2M of RAM. 01:30:42 that's why I think the BEST way to promote forth is to get to people BEFORE they learn coding the wrong way with one of these algol based langauges 01:30:42 and I think you cant just expect people to like : ($($*$ @ ; 01:30:45 look at it 01:30:55 : ($*($*&(#*$&%(*Q&$(%*$%98374598347598a9&H&h9s8dh98fdsg @ ; 01:31:05 see? 01:31:12 you can do it but give them an easier way to type it 01:31:34 define mything dereference findef 01:31:40 way nicer 01:31:44 there was a forth-like language called "Icon" that was supposed to be good for beginners. It used pictures/icons instead of words 01:31:59 there is a key concept I Think I am not getting accross though 01:32:13 How much space does it add to a forth to define a new word? 01:32:22 on average if you coudl guess 01:32:30 John[Lisbeth]: very little. 01:32:37 It used to be only about 6 bytes 01:32:37 for an empty def, a few dozen bytes 01:32:38 indeed 01:32:46 very very little 01:32:51 back in the days when it was a count byte and the first 3 letters :) 01:33:20 there was a back link, and a link to the code 01:33:22 by todays standards and especially by tomorrows standards too little for us to bother 01:33:25 a data field was optional 01:33:34 defining a word takes very little room at all most of the time 01:33:36 John[Lisbeth]: punctuation has the advantage of being visually distinctive when skimming code 01:33:44 now if I define a word that word may do alot of things, right? 01:33:48 if I use it 01:33:52 if I decide to use that word it may do alot 01:33:53 and now with seporate symbol tables you can toss the symbols when you are done compiling 01:34:07 but if I just define it it is mostly harmless right? 01:34:29 and proliferating synonyms to shave a few minutes off the learning curve has huge costs in readability 01:34:29 I can define a gigantic abstraction system which puts you in all kinds of crazy types and immutable and object oriented and all that jazz and never use any of it 01:34:31 yeah, generally in today's context, definitions are trivial space wize 01:34:31 am I wrong? 01:34:37 define the whole world 01:35:10 I can define a whole object oriented immutable purely-lazy purely-jazz-hands whatchyamacall it doodad system and never run it 01:35:14 just define it 01:35:15 and then 01:35:19 sure 01:35:21 I can define words which control the syntax of it 01:35:28 and then I can define a word which enters into that syntax as a macro 01:35:36 if you have a forth with a good dictionary, like BBL had, with one thread per word, so it still compile's fast, having a lot of definitions will barely be noticed 01:35:39 and then you type gforth thisfileiamtalkingabout.txt 01:35:42 and what happens? 01:35:55 what happensis I am greeted by the standards ans forth prompt 01:36:13 because I have not changed ans at all. Ans is still there. I added a few kilobytes 01:36:34 IDK what modern forth has the dictionary like BBL had, but its worth checking out. It literally gobbles code. No need to keep a compiled version. 01:36:58 this is true 01:36:59 gobbles code? 01:37:00 either way will do 01:37:10 I think they mean it will "interpret" fast 01:37:12 yeah, compiles code at an amazing rate 01:37:16 indeed 01:37:18 that being said 01:37:24 it compiles it so fast you think it didn't work! 01:37:33 we can indeed put an entire high level language on top of ans forth and have it be not very much larger than ans forth 01:38:04 and you would just type a woord liek iamanoob and it would put you in that other language 01:38:15 IIRC webassembly is going to be based on a concatenative/stack language very much like forth 01:38:27 he he he he he 01:38:31 MUAHAHAHAHAHAHAHAHAHAHA 01:38:35 brendan eich 01:38:54 kevinfish: then i should look into it. so many times i have cursed not having something like display postscript for web development 01:39:26 koisoke: IMO the best kept secret for the web work right now is clojurescript/hoplon/aom 01:39:37 but its not forth 01:40:37 kevinfish: was looking at a clojurescript codebase the other day. the particular project was a bit messy but it seemed promising 01:40:41 you can define a word which allows you to have infinite integers 01:40:46 also, supposedly lighttable can be used for web work by writing your app in it then throwing away everything else, but I haven't personally tried it yet 01:41:05 and you can define a word which gives you infinite arrays and functions as variables and immutable objects and all kinds of things 01:41:13 and then define a syntax for it 01:41:18 and allow yourself to inter that syntax 01:41:23 koisoke: I'd stick with the hoplon side rather than the rest, which is still pretty messy 01:41:27 and in about 8 k you can fit in a very high level language 01:41:54 but not use any of it. or as little of it as possible 01:42:11 John[Lisbeth]: IIRC, in just a couple screens of forth, about 30 years ago, chuck implemented the essence of a lisp interpreter 01:42:30 I am sure it could be done in that many 01:42:40 I think it would not take more than a paragraph of forth to make the datastructure for lisp 01:42:57 especially colorforth 01:43:01 that being said 01:43:08 I would want this microlang to be easy 01:43:12 https://github.com/kanaka/mal 01:43:14 I would want it to be as easy as javascript 01:43:21 and feel kind of like lisp or haskell 01:43:34 and it should be good as a shell as well 01:43:46 kevinfish: ! thanks 01:44:02 seems like there was a forth shell I was looking at a few years ago 01:44:06 koisoke: np 01:44:17 I want to make it kind of like perl but not as bad 01:44:33 I just want it to be really easy and decently fast 01:44:41 and if you don't use any of it it should be almost as lightweight as ans on it's own 01:44:44 John[Lisbeth]: yeah, perl seems like a bit of a trainwreck between awk, sed and sh to me 01:44:55 --- quit: ACE_Recliner (Remote host closed the connection) 01:45:15 yeah get rid of the awk and sed. Improve sh but not improve it with awk and sed 01:45:17 improve sh with lisp/haskell 01:45:29 John[Lisbeth]: have you looked at eshell? 01:45:36 yuck 01:45:39 no you did not listen forth shell 01:46:00 eshell is not a suitable shell anyway because it does not support terminal rendering 01:46:08 whereas ans forth on it's own performs terminal rendering perfectly 01:46:09 Well, eshell is an interesting concept combining lisp and shell 01:46:26 I know 01:46:27 however 01:46:28 it is shite 01:46:34 because you cant open graphical applications in it 01:46:56 it might be worth checking out to glean some ideas on how to do a forth shell is what I'm saying 01:46:57 whereas in ans forth you can type s" /path/to/my/graphical/applicaton" system 01:47:09 there is scsh if you want something standalone 01:47:13 I see what you mean 01:47:21 perhaps I could steal from that you are right 01:47:24 probably hasn't been mantained in aeons, but i used it in the early aughts a fair bit 01:47:27 Here is the way I see it 01:47:31 John[Lisbeth]: have you looked at rebol? 01:47:35 no 01:47:58 it doesn't have an orthogonal instruction set, but it has reach 01:48:49 koisoke: oh, scheme, that looks cool 01:49:00 koisoke: have you looked at GuixSD? 01:49:14 I want it to be as easy as javascript and able to do everything bash can do and at default as small as ans forth 01:49:35 scsh and GuixSD seems like a perfect match! 01:49:57 a scheme based package manager, init manager, and shell 01:50:24 kevinfish: i haven't 01:50:55 kevinfish: must have a look. haven't really done anything with scheme in quite awhile 01:50:56 koisoke: check it out. I've installed it. Haven't gotten very far with it yet. Not as advanced as nixos, but based on a standard language 01:51:17 koisoke: IMO its going to take off fast. 01:51:43 John[Lisbeth]: re: synonyms and syntactic sugar to give ans forth mass appeal, that will never work because people used to HLLs expect things like data types and lexical scoping 01:52:13 you can add that in 01:52:13 you might be able to get the latter without totally breaking ans, but you won't get the former 01:52:29 you can get all the things you wanted there without breaking ans 01:52:32 with macros 01:52:42 koisoke: there's several pretty decent yt vids on it 01:52:45 you can use macros to enter into and out of other languages 01:53:29 so when you enter into the other language you have not really encurred any bulk yet 01:53:48 I think what one needs to do is go typeless early on, then have the ability to add type checking to dial the code in and protect it against future breakage 01:53:54 but as soon as you start typing any code in that language besides a command that ends the langmacro, then you will incur bulk 01:54:17 I find types just mess with my creative energies when I'm starting out 01:54:30 it is very trivial to make a second stack in forth using linked lists 01:54:33 thinking about types is jus tnoise at that stage 01:54:50 so youc an put that second lang in a stack in memory so that when you endlangmacro then you have an empty stack 01:55:20 clojure doesn't even use linked lists IIRC. Everything is b-trees, even if its vectors/arrays. 01:55:27 and while in that second lang you can have it garbage collect linked list cells whereas in ans you would have to manually garbage collect those 01:56:09 for every piece of code you write in the other language you will incur memory but ans its self will always remain it's self as good ol ans. 01:56:27 John[Lisbeth]: and then you can't freely mix ans code with your enhanced forth, which for any reasonable definition means you no longer have an ans forth 01:56:30 John[Lisbeth]: what you are essentially advocating is forth as the machine's assembly 01:56:30 and several of these can be going at once so you have several stacks just hanging there 01:56:48 nah cause you've got eval as well 01:56:51 IOW a "forth machine" (e.g. novix) 01:56:52 in teh second language 01:57:15 you can manipulate the ans forth from within the language you are in 01:57:50 well, you guys, I have to hit the hay. Good luck re-inventing the (forth) world! :D 01:57:58 you can also endlangmacro then type some ans code ere 1 2 3 blah blah blah + + and then langmacro now I am typing code in the second lang 01:58:05 kevinfish: night 01:58:15 so I can just switch between the languages seamlessly 01:58:32 I can solve my resource problems in another language and come back and forth and all which ways 01:58:32 John[Lisbeth]: i think most people won't find that as nice as you think they will 01:58:49 I will only include something very basic and simple with infix 01:58:55 or perhaps something similar to infix 01:59:04 like the { word is a good example 01:59:56 because now they have to keep track of what incompatibility-introducing layers are active in a given context 02:00:13 --- part: kevinfish left #forth 02:00:44 not at all 02:01:03 if they enter the second language and never think to type endlangmacro then they will never have to worry about the ans forth beneath 02:01:22 and similarly the ans people will never have to worry about the people in the second language 02:01:27 but if you do use the second language it will add to memory 02:01:32 every time 02:01:36 you can choose not to use it 02:02:24 if you are on a project that uses it you can still endlangmacro and type the code you like and that you think works best in original ans and then langmacro again but you would have not lost any of the memory bulk that they made 02:04:10 think of it like this: you have your user-defined langauge where floats and integers share a stack and arithmetic words are overloaded to just do the right thing, and you write some code there 02:04:32 then you have some other ans code where floats are on a separate stack and float arithmetic uses separate words 02:05:05 yes what is the problem? 02:05:10 --- quit: nighty (Remote host closed the connection) 02:05:57 the problem is that you now have to be mindful of this incompatibility and that makes the learning curve harder rather than easier 02:06:09 so 02:06:16 lets say I have made this second lang and made these floats 02:06:27 in my design I could start by making ans words which operate on these floats 02:06:41 and then later on use those floats in the second language. 02:06:42 --- join: kevinfish (~kevinfish@162-201-44-69.lightspeed.frokca.sbcglobal.net) joined #forth 02:07:09 And so my underlying forth should still be able to use these floats and not use much more memory than ans already does 02:07:26 and then I just need to be able to look at and operate on the stacks in other languages I've made 02:07:37 so I can pull things off of their stack and take a look at it and see what it does 02:07:43 or modify their stack or copy some of it 02:07:51 cause it's just a linked list in memory 02:07:55 oh, hey guys, I kinda figured out my problem with freeforth. You have to either put the preceeding code to the defining word in a string and "eval" it, or put it in a seporate definition, and tick it and compile a call to it. 02:08:18 strange 02:08:26 like: : foo` "5*" eval constant` ; 02:08:36 eval seems like not the best option 02:08:55 or: : six-x 6* ; 02:08:55 : bar` six-x ' call, constant` ; 02:09:12 yeah, well, I'm still researching for a better way 02:09:28 those both work tho 02:09:54 like I said, freeforth is a strange bird 02:10:01 fun to explore tho 02:10:38 John[Lisbeth]: if your goal is to be friendly to people coming from other languages, you are seriously underestimating the hairiness of that 02:10:50 no no no 02:10:52 for a new person 02:11:07 they just type langmacro and then suddenly they are not in ans forth anymore and never have to be 02:11:12 ok, cya l8r allig8rs 02:11:19 --- part: kevinfish left #forth 02:11:31 they will be in an easy language which does things for them and tries to be nice and gentle, and also has macros 02:12:12 and if a high level person jumps in they can sort of put that aside and work on the underlying ans as if it was pure ans up to the ans standard and then enter back into the code that the other person was writing 02:12:21 when you enter back into ans it is a pristine ans 02:12:38 with only a few definitions added and some things in memory based on what the high level programmer did 02:13:15 if you use only linked lists you will be very memory efficient in this language, I assure you. 02:13:20 as well as fixed arrays. 02:13:34 memory is cheap and not the issue here 02:13:39 then what is 02:18:16 the issue is that you effectively have two different languages that are so divergent you need a foreign function interface to talk between them but are trying treat them like one language with a few extensions nobody is forced to use 02:18:55 well on the one hand you can interface with the secondlang if you really want to, right? 02:19:08 but on the other hand you can also just type secondlangmacro and be in there 02:19:25 you would probably do endlangmacro if you want to go back into forth and write some forth 02:19:40 or if you wanted to go into another language besides secondlang 02:21:03 when you pop a thing off of the secondlang stack onto the forth stack you see what it really is as integers 02:21:13 and hopefully you've made functions that operate on those 02:21:36 John[Lisbeth]: how would that be different from if i wrote a little ans forth on top of factor and then called factor a totally ans forth 02:21:51 because factor is not a small enough base to my knowledge 02:22:08 small enough base? 02:22:26 when you download factor it should be a larger file than something like gforth and it should take up more memory when you first turn it on 02:23:32 haven't checked, but gforth is pretty big 02:23:37 Factor includes a lot of libraries. what's your problem with it? 02:23:52 even OpenGL bindings 02:25:07 yes that is sort of the crux of it 02:25:19 javascript on it's own is kind fo small. the interpreter doesnt come with a whole bunch of libraries 02:25:23 it gets bloated if you add the libraries 02:26:07 this would be a thing that is only a few k larger than forth, and when you turn it on it is just forth, but there are language features which if you use will use some bootstrapping and bea ble to load large bootstrapped libraries and such like high level languages 02:26:19 now once you have added those things they are added right, there's no way around that 02:26:33 but the template still exists if you want just the template 02:26:53 and after you have added the stuff the underlying ans forth is still fully available and pristine, however there is still the bloat 02:27:04 the problem is trying to add too much bloat to the template 02:28:34 Javascript is an awful langauge 02:28:39 sure 02:28:43 I am not going to do the same thing javascript did 02:28:50 it's only fast because Mozilla and Google put $$$ in it 02:28:54 I just want it to be as easy as javascript as opposed to a hard la nguage like assembly 02:29:01 javascript is object oriented that's why 02:29:32 first I will start by making the ideal datastructures in forth 02:29:51 but I will not actually make the datastructures just make words taht operate on them 02:29:55 what about Scheme? 02:30:06 For all I care I could make the second lang a lisp 02:30:08 do you not see what I mean? 02:30:08 the R5RS specification is only 50 pages 02:31:20 I could make multiple language interfaces to the same language stack in the second lang if I did it carefully enough 02:31:41 for example for certain types of langs that can be secondlang they can have the same namespace 02:31:47 or perhaps same variable names 02:33:49 For example I could implement linked lists with roughly the same datastructure in multiple languages so in some of these languages I could pass linked lists between them 02:34:33 and in fact if for every secondlang I allow something to be any type whatsoever then by definition I can take a type from another language and begin working on it 02:37:26 no, no you can't, because the representations differ, requirements for manual or automatic memory management differ 02:38:05 The languages will not have to worry about each other's memory 02:38:07 nor will ans 02:38:29 if someone uses a language that uses different datastructures than me then yes they will have to bridge theirs to mine or mine to theirs 02:38:53 but within the context of my own languages I write they will all use common datastructures and will be able to have any datastructure added 02:39:13 I want them to be 1. easy. 2. a good shell. 3. versatile. 4. fast 02:44:29 found this page http://www.complang.tuwien.ac.at/anton/euroforth/ef15/papers/knaggs.pdf maybe somebody will be interested 02:46:41 John[Lisbeth]: and you will have to do that for a lot of language features people expect 02:46:53 gah. just implement it and you'll see what i mean 02:47:22 I could be wrong 02:47:42 all I know is if I on ly define words I can make it almost as small as ans 02:49:11 sure, but that approach won't get you where you seem to be aiming 02:50:20 where am I aiming? 02:51:57 people don't shy away from forth because : is too hard to remember. they shy away from it because it demands a different code factoring style than a lot of other languages, requires conscious attention to the stack, has a different approach to scope from most languages, is untyped except when it isn't, etc 02:52:48 John[Lisbeth]: to have a thin layer on top of ans that gives the language mass appeal without breaking ans 02:53:30 perhaps in my second lang they will not have access to their stack 02:54:29 and you seem to be trying to hold up a load of things that are possible on their own but mutually exclusive and handwaving an insistence that they can all be had at the same time 02:56:36 What I am describing seems quite possible to me 02:56:52 I seem to be able to have a clear picture of it's implemetation in my head 02:58:26 --- quit: dys (Ping timeout: 260 seconds) 02:58:45 the hard part is not really designing it but in learning the code necessary to write it 02:59:01 I must learn macros to do it 03:00:45 I also have to implement a few core datastructures and debug them 03:01:06 i should sleep 03:01:10 night 03:01:23 night 03:06:45 --- join: dys (~dys@ip-109-40-2-79.web.vodafone.de) joined #forth 03:07:06 --- quit: dys (Read error: Connection reset by peer) 03:13:23 --- join: dys (~dys@ip-109-40-2-53.web.vodafone.de) joined #forth 03:28:48 --- quit: wa5qjh (Remote host closed the connection) 03:40:19 --- join: wa5qjh (~Thunderbi@121.54.90.152) joined #forth 04:55:42 --- join: gravicappa (~gravicapp@ppp83-237-164-29.pppoe.mtu-net.ru) joined #forth 05:08:01 --- join: GeDaMo (~GeDaMo@212.225.127.213) joined #forth 05:18:47 --- quit: proteusguy (Remote host closed the connection) 05:53:29 --- join: proteusguy (~proteus-g@49.228.102.10) joined #forth 05:53:30 --- mode: ChanServ set +v proteusguy 06:02:13 --- join: proteus-guy (~proteus-g@2405:9800:b408:bc31:4a51:b7ff:fe38:d966) joined #forth 06:03:36 --- quit: proteusguy (Ping timeout: 258 seconds) 06:05:23 --- join: Zarutian (~zarutian@168-110-22-46.fiber.hringdu.is) joined #forth 06:06:05 --- join: Zarutian_ (~zarutian@168-110-22-46.fiber.hringdu.is) joined #forth 06:06:06 --- quit: Zarutian (Read error: Connection reset by peer) 06:06:06 --- nick: Zarutian_ -> Zarutian 07:14:42 --- quit: beretta (Quit: Leaving) 07:51:00 --- join: neceve (~ncv@86.125.247.109) joined #forth 07:51:00 --- quit: neceve (Changing host) 07:51:00 --- join: neceve (~ncv@unaffiliated/neceve) joined #forth 07:58:53 --- quit: Zarutian (Quit: Zarutian) 08:18:58 --- join: dual (~bonafide@cpe-74-75-153-119.maine.res.rr.com) joined #forth 08:36:55 --- join: Zarutian (~zarutian@168-110-22-46.fiber.hringdu.is) joined #forth 08:37:31 --- quit: Zarutian (Read error: Connection reset by peer) 08:39:05 --- join: Zarutian (~zarutian@168-110-22-46.fiber.hringdu.is) joined #forth 10:04:33 --- join: leaverite (~Thunderbi@121.54.90.159) joined #forth 10:05:58 --- quit: wa5qjh (Ping timeout: 268 seconds) 10:05:58 --- nick: leaverite -> wa5qjh 10:12:10 --- quit: dys (Ping timeout: 240 seconds) 10:19:11 --- quit: neceve (Quit: Konversation terminated!) 10:22:38 --- join: true-grue (~true-grue@176.14.222.10) joined #forth 10:32:42 --- part: tangentstorm left #forth 10:53:58 --- quit: Zarutian (Read error: Connection reset by peer) 10:55:26 --- join: dys (~dys@ip-109-40-3-167.web.vodafone.de) joined #forth 10:55:31 --- join: Zarutian (~zarutian@168-110-22-46.fiber.hringdu.is) joined #forth 11:47:08 I've always tended to format my c or c++ code more densly than most other c/c++ coders, but dang, after working with forth for a while, when I come back to a c-like language... there is so much screen realestate wasted with superfluous whitespace 11:48:58 zy]x[yz: http://code.jsoftware.com/wiki/Essays/Incunabulum 11:50:30 nice 11:51:35 Full J source https://github.com/jsoftware/jsource/tree/master/jsrc 12:20:22 --- join: vsg1990 (~vsg1990@static-72-88-80-103.bflony.fios.verizon.net) joined #forth 13:23:59 --- quit: GeDaMo (Remote host closed the connection) 13:38:25 --- quit: true-grue (Read error: Connection reset by peer) 14:04:12 --- join: true-grue (~true-grue@176.14.222.10) joined #forth 14:10:53 --- quit: John[Lisbeth] (Ping timeout: 246 seconds) 14:23:15 --- quit: gravicappa (Ping timeout: 256 seconds) 15:06:00 --- join: qzo (~qzo@2601:281:8300:f6c0::8) joined #forth 15:22:53 --- quit: true-grue (Read error: Connection reset by peer) 15:37:17 --- join: ricky_ricardo (~quassel@2602:306:328f:79f0:fccf:4afd:1470:a073) joined #forth 15:37:54 --- quit: ricky_ricardo (Client Quit) 15:38:29 --- join: ricky_ricardo (~quassel@2602:306:328f:79f0:fccf:4afd:1470:a073) joined #forth 15:45:45 --- join: John[Lisbeth] (~user@2601:601:8f01:a6a0:6577:c7b2:afad:6883) joined #forth 15:47:49 --- quit: ricky_ricardo (Remote host closed the connection) 15:49:56 --- quit: John[Lisbeth] (Ping timeout: 246 seconds) 15:58:38 --- quit: qzo (Read error: Connection reset by peer) 16:00:45 --- join: qzo (~qzo@2601:281:8300:f6c0::8) joined #forth 16:06:29 --- join: ACE_Recliner (~ACE_Recli@c-50-165-178-74.hsd1.in.comcast.net) joined #forth 16:14:18 --- quit: wa5qjh (Remote host closed the connection) 16:54:35 --- join: nighty (~nighty@p001.gate.atson.jp) joined #forth 17:01:42 --- quit: ACE_Recliner (Ping timeout: 260 seconds) 17:02:46 zy]x[yz: I noticed this with design in typography and layout. "Clean" style always looks to me like 'I have little to nothing to say so here is loads and loads of white space' 17:10:00 I feel like a lot of forthers' websites have no css. 17:10:57 kiss 17:18:59 --- join: ACE_Recliner (~ACE_Recli@c-50-165-178-74.hsd1.in.comcast.net) joined #forth 17:20:05 css is to me just poormans overbloated tk options database. 17:24:34 My next battle is to help make gopher more popular again: https://news.ycombinator.com/item?id=13855634 17:24:34 I want separation of documents and software. Gopher clients are simple enough that I can write one in amForth and browse gopherpedia on an AVR. Gopher also means alternative operating systems other than Linus/BSD/Windows/OSX could be useful. 17:24:34 There's got to be a way to enforce the 'no webapps' security protocol, at the protocol level, by verifying that the content written = content read back by the user. 17:27:15 Maybe I'm an extremist, but I don't think AGPLv3 would help much even if it was actually used. 17:29:24 what the heck is that? ArGvados Penalty Language version 3? 17:35:40 Zarutian: Affero General Public License https://en.wikipedia.org/wiki/Affero_General_Public_License 17:35:40 It is copyleft/gpl that is activated by a user interacting with the software over a network as well instead of just by linking or direct distribution of binaries. 17:35:40 GPLv3 proper was going to include the Affero clause until Google made big threats against the Free Software Foundation. The FSF subsequently made a tactical retreat and did not include the Affero clause in GPLv3. 17:37:54 ...the Affero clause is only activated by "directly" interacting with the software service, so I guess your ISP's routers and switches are unaffected. 17:54:08 --- quit: dys (Ping timeout: 264 seconds) 18:02:50 you know, always looked at these 'licenses' as just dead comments. For instance the 'AS IS' (Asis light!) disclaimer has no effect where I live. 18:09:45 --- join: roboguy` (~roboguy_@205.59.124.24.cm.sunflower.com) joined #forth 18:16:52 --- quit: qzo (Read error: Connection reset by peer) 18:18:46 --- join: qzo (~qzo@2601:281:8300:f6c0::8) joined #forth 18:51:30 --- join: neceve (~ncv@86.125.247.109) joined #forth 18:51:30 --- quit: neceve (Changing host) 18:51:30 --- join: neceve (~ncv@unaffiliated/neceve) joined #forth 18:57:53 * crc likes gopher 19:00:56 I haven't written a client yet, but my personal pages are now running on a gopher server written in a forth dialect. 19:03:37 --- quit: Zarutian (Quit: Zarutian) 19:04:58 --- quit: roboguy` (Remote host closed the connection) 19:05:32 --- join: roboguy` (~roboguy_@205.59.124.24.cm.sunflower.com) joined #forth 19:06:33 --- quit: roboguy` (Read error: Connection reset by peer) 19:07:08 --- join: roboguy` (~roboguy_@205.59.124.24.cm.sunflower.com) joined #forth 19:07:53 --- quit: Vendan (Quit: ZNC - http://znc.in) 19:08:02 --- quit: nighty (Remote host closed the connection) 19:10:32 --- quit: vsg1990 (Quit: Leaving) 19:13:42 --- join: bluekelp (~bluekelp@bluekelp.com) joined #forth 19:20:12 --- mode: ChanServ set +v bluekelp 20:16:49 --- join: dys (~dys@ip-109-40-3-167.web.vodafone.de) joined #forth 20:47:08 --- quit: neceve (Quit: Konversation terminated!) 21:38:20 --- quit: roboguy` (Remote host closed the connection) 21:39:13 --- join: roboguy` (~roboguy_@205.59.124.24.cm.sunflower.com) joined #forth 21:48:03 --- quit: roboguy` () 23:59:59 --- log: ended forth/17.04.03