00:00:00 --- log: started forth/06.12.10 00:05:38 Hi ygrek 00:07:15 hi 00:31:24 --- quit: virl (Remote closed the connection) 00:45:52 --- join: virl (n=virl@chello062178085149.1.12.vie.surfer.at) joined #forth 01:00:39 --- quit: virl (Remote closed the connection) 01:23:54 --- quit: zpg ("brb") 01:35:06 --- join: zpg (n=user@soup.linux.pwf.cam.ac.uk) joined #forth 01:40:26 --- quit: zpg (Remote closed the connection) 01:52:11 --- join: zpg (n=user@user-514d7663.l2.c2.dsl.pol.co.uk) joined #forth 02:24:59 --- join: Cheery (n=Cheery@a81-197-54-146.elisa-laajakaista.fi) joined #forth 03:11:58 --- join: Mitja (n=abcd@unaffiliated/mitja) joined #forth 03:35:45 --- quit: ayrnieu (Remote closed the connection) 03:36:56 --- join: ayrnieu (n=julian@pdpc/supporter/sustaining/ayrnieu) joined #forth 03:39:56 --- quit: ayrnieu (Remote closed the connection) 03:41:16 --- join: ayrnieu (n=julian@pdpc/supporter/sustaining/ayrnieu) joined #forth 03:41:33 wb ayrnieu; hey Cheery, Mitja 03:41:45 hi 03:42:12 hey, zpg. 03:42:50 Morning chaps. 03:43:33 hi 03:43:46 Perhaps digging deeper into "POSTPONE", "LITERAL", "COMPILE," etc. isn't such a good idea having skipped sleep. Fascinating stuff though. 03:46:49 You might also find this interesting; I wrote it during the conversation with shine, earlier: : generator ( n -- xt ) here >r , :noname ( n -- n' ) r@ postpone literal postpone @ postpone + postpone dup r@ postpone literal postpone ! postpone ; r> drop ; 03:48:17 okay, hang on let me yank that and reformat so i can read it properly. 03:48:20 people sometimes come up with cute syntaxes for so many postpones, and you might see why. 03:49:29 it's not complex enough to need formatting. I might just wrap it over two lines. 03:49:59 Does somebody have C code for getting words delimited with whitespace from any file stream? 03:50:25 sorry, Cheery, I don't know what you mean to ask. 03:50:42 just a simple parser for forth syntax. 03:51:23 do you mean, does anyone have a nice way in C to split a string of Forth words into some easier-to-handle structure? 03:51:32 Yes! 03:51:38 ayrnieu: overtired; it's nice to look at new code when it's well formatted. 03:51:47 Cheery: what, like a list of tokens? 03:52:03 well, list of words would be already nice. 03:52:03 zpg - the thing is, there's no *nice* way to format that. 03:52:05 ayrnieu: what's this code supposed to do? 03:52:23 I know it is easy, but I'm too bored to do it myself. :) 03:52:36 ayrnieu: it depends what the goal is. if you want a token list to format, then the first task is hacking up a quick list implementation. 03:52:53 Cheery: when you say parser, what are you aiming to output? 03:53:34 something I can pass for my lookup word. 03:53:44 or function, like they say in C. 03:54:16 Cheery, toka has a minimal parser, it may be adaptable to what you want 03:54:36 Cheery - you can just turn all whitespace into \0 and then have head() tail() functions to walk it as a list. However, this can't possibly handle Forth code in a very nice manner, as any Forth word can provide its own syntax. 03:55:48 zpg - you don't understand what my code does? 03:56:03 i see a sea of postpones. 03:56:32 it seems to be function generator. 03:56:32 well, of course. 03:56:32 ayrnieu: possibly even such would go, I've only one thing that I'd like to interpret some characters as both words and whitespaces. 03:56:59 yes, the name and stack comment may give that away. It makes more sense in the context of Shine's question. 03:57:23 surely this could be better factored. 03:57:37 zpg - have a go at it. 03:57:50 i might well do so. 03:58:06 eyes are literally blurring in and out, hence the greater level of idiocy than usual (a small margin of difference) 03:58:09 zpg - but 'it seems very long because I see many postpones' is not a failure of factorization. 03:58:43 i had a similar conversation with Quartus a while back about a string of "postpone x postpone y postpone" z etc. 03:58:53 Shine asked me to do this in Forth: http://forth.pastebin.ca/273813 03:59:43 ah i see. 03:59:46 makes more sense now 04:00:27 well, I see that I didn't actually do that. My generated function adds an argument to its stored value. 04:02:01 : generator2 ( n -- ) generator >r :noname 1 postpone literal r@ postpone literal postpone execute postpone ; r> drop ; :-) 04:02:21 could probably improve that with COMPILE or somesuch, but I very rarely use such words. 04:03:03 stack comment should be ( n -- xt ) , with ( -- n ) for the :noname comment. 04:05:13 Say, would fseek() work for stdin? 04:05:26 ie, reversing it a small bit. :) 04:06:51 : curry1 ( x xt -- xt' ) >r >r :noname r> postpone literal r> postpone literal postpone execute postpone ; ; : generator2 ( n -- xt ) generator 1 swap curry1 ; there you go, factorization. 04:08:54 Cheery, it may, depending on buffering modes 04:10:11 mine's not much better. 04:10:13 : incf ( addr -- ) 04:10:13 dup @ 1+ swap ! ; 04:10:13 : plusser ( n -- xt ) 04:10:15 here >r , :noname r> postpone literal postpone dup postpone incf postpone ? postpone ; ; 04:11:50 though i prefer something like this (naming is literally v. temporary) 04:11:52 : incf ( addr -- ) dup @ 1+ swap ! ; 04:11:52 : plusser' ( addr -- ) dup incf ? ; 04:11:52 : plusser ( n -- xt ) here >r , :noname r> postpone literal postpone plusser' postpone ; ; 04:12:27 just reads better, economy of 'postpones', you can read the stack comments for the ill named "plusser'" 04:13:39 although I wonder why you do I/O. : incf 1 swap +! ; 04:15:53 okay, i've got a nice-ish version 04:17:50 try this --> http://forth.pastebin.ca/274076 04:18:16 enter "five++" and "eleven++" a few times. 04:18:25 (thanks for pointing out the 'incf' idiocy) 04:19:20 I'd never call someone an idiot for that. Particularly not after my needless use of r@ instead of r> 04:19:30 :) 04:19:34 i enjoyed hacking this up actually. 04:20:00 i'm not well schooled in forth yet, but quite like the elgance of create-accumulator 04:21:06 now compare what you originally pasted me, and tell me which seems easier to follow :) as i said, the onslaught of postpones really obscured what was going on. and 'generator' was a bit generic. not that my factoring's much better, but accumulator seemed more apt. 04:21:18 : create-accumulator ( n "name" -- ) create , does> 1 over !+ ? ; 04:22:12 i don't follow that. 04:22:23 using accumulator, I'd just say: 10 accmulator alias ten++ , or somesuch, giving the XT a name instead of having a specific create...does> to execute an XT. 04:22:33 what don't you follow about it? 04:23:03 in your create-accumulator, is n the XT? 04:23:22 no, n is the original value to be incremented. There is no XT. 04:23:56 oh sorry. 04:24:03 you've just reduced it down to a simple one line word. 04:24:25 yeah, obviously if we were going for the create-accumulator in itself, then the :noname stuff is unnecessary. 04:24:43 just thought i'd tack it on. 04:25:51 zpg - well, you're the one that wanted to do I/O in the word and also name the resulting function. It turns out that adding these criteria narrows the domain and simplifies the solution. Just as what shine actually wanted can be more simply accomplished than what I did at first. 04:26:16 now, this might be a useful thing for all of us to remember :-) 04:26:24 yeah, it's a neat example actually 04:33:57 i guess this particular example illustrates prototyping until a far more elegant solution is met. then you have to ask, am i liable to use XTs in themselves, or just opt for named words? after all, consistently calling an XT seems to suggest defining a separate word. 04:35:41 well, you can see how dealing with XTs made it simple for me to write a CURRY1 , and you can see how narrowing the task produced a hugely simpler word. 04:38:08 I don't have a strong opinion about this, sorry. 04:39:15 you're still calling generator in your code. 04:39:17 an odd amalgam. 04:39:47 IAC, create..does> solution lends itself poorly to an application that wants to have lots of unnamed generators, possibly in a data structure. And you can still have CURRY1 and such for named words, with tick. 04:40:22 do you refer to where I call GENERATOR in GENERATOR2 ? 04:40:43 yes 04:40:50 hang on, this might all be superbly stupid... 04:42:16 dagbrown - one of the Zeldas had something similar. And other games have bosses where you are supposed to lose. I *broke* one of these games by unexpectedly-to-the-programmers beating a boss that was supposed to kill me, on the Game Gear. In another game, I kept hitting reset each time I died, kept trying harder, and was really fucking angry when it turned out to be a clever plot thing. 04:42:24 sorry, mischan. 04:42:29 heh 04:49:03 --- join: Shine (n=Frank_Bu@xdsl-84-44-128-23.netcologne.de) joined #forth 04:49:14 OK, summary of my tries here: http://paste.lisp.org/display/31866 04:49:25 Shine: you're the man of the hour, it would seem. 04:49:37 we've been discussing this generator/accumulator stuff. 04:50:00 ayrnieu: since when is Shine a she? 04:50:32 I've no idea what gender Shine has. 04:50:47 ayrnieu: and for some of those, the sea of postpones still seems overkill. Shine: see http://forth.pastebin.ca/274076 too. 04:51:04 my homepage could give you a hint: http://www.frank-buss.de :-) 04:51:11 currying for Forth looks interesting 04:51:11 * zpg chuckles 04:52:09 zpg - again, 'lots of postpones' isn't an error, it's an artifact of Forth's verbose way of expressing such things. It's overkill in the sense that it doesn't do exactly what generator4 does, but that's the point of the file :-) 04:52:26 i disagree 04:52:44 if you're postponing 3+ words, i'd think about factoring and then postponing the factor. 04:54:21 no, you'd just execute the factor. But the only purpose of that is to make the word seem to be less complex; morever, this won't help you interleave postpones and other words. 04:55:12 I think you're misapplying a perfectly nice bias for short words on poor postpone, because you haven't learned to read past it. In some colorforth, you wouldn't even notice that the word seemed long. 04:57:25 obviously, factoring isn't generalised -- it'll be problem-specific. 04:59:03 shine - aye, you can do higher-order functions and such in Forth -- and lots of other nifty, advanced-seeming techniques, too. Some of them just need to adapt a bit, as with this example where a closed-over variable becomes a personal location in HERE 05:01:14 for greater enjoyment, translate this classic example to Forth: (let ((balance 0)) (defun withdraw (n) (decf balance n)) (defun deposit (n) (incf balance n))) 05:02:13 yes, looks like it is possible and not too difficult with Forth and if you need to close over more than one variable, you could use a struct{ 05:03:43 or, you could just close over multiple variables. There's no magic in putting more in HERE for CREATE..DOES> , nor compiling more values into a :noname 05:04:32 hopefully you're not conceiving of even more postpones in one word definition. 05:05:08 zpg - sure. Different functions of this sort will differing numbers of postpones. 05:05:22 christ. 05:06:41 zpg - if this really is armageddon for you, join the ranks of They Who Have Created Cute Postpone Syntaxes And Then Yawned And Somehow Never Used Them Much In Practice. If you take it too far, you'll turn into one of those compile-only-forth types, who think their variants of Forth so much more succint for having a one-letter word to interpret words, instead of an eight-letter word to compile them. 05:08:16 you can also do as Wil Baden does and EVALUATE 05:11:50 see this: 05:11:50 http://forth.pastebin.ca/274113 05:12:19 no extra postpones in spite of the additional cell.. 05:12:30 we increment the lower cell, decrement the upper. 05:14:09 ayrnieu: quit over-inflating the issue. my point is simply that you can avoid ugly, hard to read definitions with simple factoring. and i'm not even any good and writing this stuff. 05:14:14 but it seems instantly more readable. 05:16:06 you should swap at the beginning, increment/decrement in the other order, and not swap when printing. 05:18:04 although doing I/O in the word at all makes it quickly degrade into a CREATE..DOES> :-) 05:18:18 well, it remains nameless. 05:18:45 and the swap before ". ." is to preserve the cell order to avoid confusing. 05:19:16 "seesaw" could be factored to avoid the inline ugliness, but i think the main point is made re: POSTPONE. 05:19:23 to avoid confusing output, sure, but the order is already arbitrary. 05:20:10 if you create with "5 10 generator" then the printouts should be in the same order -- i know i'd get confused if i was getting reversed printing. 05:20:18 and all for the price of one swap; seems silly. 05:20:49 zpg, the order inside the word is already arbitrary. If you store it the oher way at first, you can avoid the swap on each run of the generated word. 05:21:27 that's a v. good point. 05:21:28 there's no 'all' here, it's an obvious improvement that I'd make without thinking about it. 05:27:25 IAC, OK, I agree: a few extra once-off words and a few extra calls in a language with almost-free function calls, these are worth the clearer result and the not having a cute syntax for postpone. 05:29:47 "IAC"? 05:30:11 but this solution isn't universally applicable: you've still need to deal with the return stack, and to write macros that include control words. 05:30:16 in any case. 05:30:48 :) ah ok. 05:31:34 i agree, the "seesaw" stuff is just to illustrate the clarity afforded when we don't add extra postpones. i'm not suggesting the code is of any merit. 05:37:33 * ayrnieu : not impressed with PFE's thousand-page HTML documentation 05:39:18 oh, good, it was just OpenBSD's fault for pointing me at only that. 05:43:18 ayrnieu: "withdraw" and "deposit" is a bit easier than general purpose closures: http://forth.pastebin.ca/274143 05:45:37 Shine - that depends on your Forth not placing cells on the stack at : , and so will break with Forths that do this. 05:47:59 otherwise: : deposit ( n -- nbal ) [ literal ] tuck +! @ ; : withdraw negate deposit ; 05:48:17 well, and LITERAL is immediate anyway. 05:50:25 seeing as withdraw and deposit are only compiled once, using "here 0 ," seems arbitrary too. 05:50:43 base @ here 0 , base ! ... base ! \ very cruel. 05:51:07 zpg - it sneaks a variable into both of them 05:51:19 by the lexical example, earlier. 05:51:40 sure. 05:53:09 btw: win32forth generates an error, when the stack depth changes while compiling a word. But if : and ; doesn't use the stack, it should work, shouldn't it? 05:53:30 that will work if : doesn't change the stack, yes. 05:54:22 in ANS Forth , you can't rely on :'s stack-effect. gforth IIRC places three values on the stack. 05:56:24 the bank-account balance example is cute in Lisp, but you'd never do it that way in forth. You'd either have VARIABLE BALANCE or you'd have the balance passed on the stack. 05:57:25 using a closure saves you a global named variable 05:58:30 --- join: tathi (n=josh@pdpc/supporter/bronze/tathi) joined #forth 05:58:30 --- mode: ChanServ set +o tathi 06:00:35 that's not as common a worry in Forth, however. You can anyway use wordlists to name a variable and narrow its visibility. 06:02:40 closures are very neat for writing function generators as per our earlier examples. 06:03:30 my point above 'seeing as withdraw and deposit are only compiled once, using "here 0 ," seems arbitrary too.' was simply that defining 'variable balance' simplifies matters in this particular case. it depends whether this is all you're aiming for or whether you want to write a bank account generator. 06:16:40 Shine - here's what I mean :-) http://paste.lisp.org/display/31874 06:18:19 ah, oops, : end-scope drop set-current previous ; 06:18:46 PFE does some normalization after loading a file, I guess, for me to seem to not need that previous. 06:22:51 nice, looks like you have invented lexical variables for Forth, and with some parse-magic it would be even possible to implement a Lisp-like let-syntax :-) 06:24:23 would be a good idea to summarize these advanced programming concepts in a web page and writing a "translation" in Lisp for every Forth construct 06:25:17 (or a translation in C, but this would be too much work, because the code would be much longer and less readable) 06:25:57 ayrnieu: very nice sir! 06:26:20 I don't know how to much of this in C. 06:29:06 ayrnieu: hmm, for all the scoping you've implemented, balance is still visible at toplevel, and defining a new variable, balance, fried the lexically scoped one. 06:29:25 zpg - see my corrected end-scope 06:29:48 defining a new balance absolutely should not fry the 'scoped' one. 06:30:00 sorry, just pasted from the http://paste.lisp.org/display/31874 06:30:03 trying again now 06:30:04 I think you must've done something else. 06:31:09 deposit doesn't search a wordlist for BALANCE every time it runs, after all -- that search was done at compile-time. 06:34:04 hmm, defining "variable balance" at toplevel still seems to fry matters. 06:34:05 try it. 06:34:15 i added this as an extra peek: : balance? ( -- nbal ) balance @ ; 06:34:30 do a few deposits 06:34:41 then "variable balance 1000 balance !" 06:34:44 nope, no frying. There can't possibly be frying. 06:34:50 hang on 06:35:01 ayrnieu: in C++ there is a lambda implementation http://www.boost.org/doc/html/lambda.html , of course the source code for such template meta programming doesn't look very easy, but I have no idea how to implement it in C (maybe with some macrology ugliness) 06:35:11 --- part: tathi left #forth 06:35:38 ayrnieu: you're right, i'd evidently fried the previous session with the old code. my apologies 06:35:41 works a charm. 06:36:15 zpg - : balance? 0 withdraw ? ; -- won't require you to put this extension within the new-scope ... end-scope 06:36:31 * zpg nods 06:36:37 all working nicely, but i take the point. 06:36:55 seriously, i'm very impressed. i'd been pondering lexical fencing in forth and hadn't thought it possible. 06:37:07 very concise, readable and clean definition. kudos. 06:37:32 it's not entirely free, but thanks 06:37:46 free? 06:38:11 well, you've still the wordlist. 06:57:08 --- join: PGR (i=opera@ant-25.ug1.dp.ukrtel.net) joined #forth 07:08:37 --- quit: PGR (Read error: 145 (Connection timed out)) 07:16:35 IAC, a wordlist makes for a nice syntax and might come in handy, later. 07:33:50 --- join: Crest (n=crest@p54894B97.dip.t-dialin.net) joined #forth 07:48:04 --- join: neceve (n=claudiu@unaffiliated/neceve) joined #forth 08:02:33 --- join: nighty_ (n=nighty@sushi.rural-networks.com) joined #forth 08:10:36 belatedly, I thought I'd sent this earlier: you could also make the variable unfindable, as with: variable balance .... ' balance >link l>name count blank \ leaving only the overhead of dictionary entry never again used as such, instead of entry+wordlist as in the new-scope code -- although that code works on any ANS Forth. 08:10:42 You could also store an address from HERE in BASE and compile that into the code, giving you no overhead beyond the data cell itself. On a forth where compilation doesn't HERE , you could do this within deposit at compile-time, with no variable as go-between. 08:21:29 --- join: tathi (n=josh@pdpc/supporter/bronze/tathi) joined #forth 08:21:29 --- mode: ChanServ set +o tathi 08:51:55 --- join: earth| (n=sqrt@84.13.56.251) joined #forth 08:54:26 --- join: uscore (n=sqrt@82-35-248-212.cable.ubr06.dals.blueyonder.co.uk) joined #forth 09:02:27 --- quit: earth| (Read error: 60 (Operation timed out)) 09:14:24 --- join: jackokring (n=jackokri@static-195-248-105-144.adsl.hotchilli.net) joined #forth 09:34:12 --- quit: jackokring (Read error: 54 (Connection reset by peer)) 09:37:35 --- quit: ellisway (Read error: 104 (Connection reset by peer)) 09:48:44 --- join: virl (n=virl@chello062178085149.1.12.vie.surfer.at) joined #forth 10:14:09 --- quit: Shine (Read error: 104 (Connection reset by peer)) 10:15:00 --- join: Shine (n=Frank_Bu@xdsl-84-44-202-208.netcologne.de) joined #forth 10:25:50 --- quit: ygrek () 10:34:14 --- join: mur` (n=user@200-181-92-147.bsace705.dsl.brasiltelecom.net.br) joined #forth 11:09:27 --- part: mur` left #forth 11:17:10 --- join: Snoopy42 (i=snoopy_1@dslb-084-058-109-129.pools.arcor-ip.net) joined #forth 11:21:40 --- join: marble (n=glass@cpc1-bolt6-0-0-cust18.manc.cable.ntl.com) joined #forth 11:34:51 --- join: ellisway (n=ellis@host-87-74-241-174.bulldogdsl.com) joined #forth 11:44:52 --- quit: neceve (Remote closed the connection) 12:16:43 --- join: Quartus_ (n=Quartus_@209.167.5.1) joined #forth 12:16:44 --- mode: ChanServ set +o Quartus_ 12:35:10 --- quit: tathi ("bbl") 13:16:28 --- quit: Cheery ("Download Gaim: http://gaim.sourceforge.net/") 14:10:47 --- join: jackokring (n=jackokri@static-195-248-105-144.adsl.hotchilli.net) joined #forth 14:23:13 --- quit: ellisway (Read error: 131 (Connection reset by peer)) 14:50:24 --- nick: segher_ -> segher 15:01:34 --- quit: jackokring (Read error: 60 (Operation timed out)) 15:21:26 --- quit: Mitja () 15:50:06 hey 15:51:48 what's up? 15:58:37 --- join: Zarutian (n=Zarutian@194-144-84-110.du.xdsl.is) joined #forth 16:04:44 Hi Quartus. 16:04:49 --- nick: Raystm2- -> Raystm2 16:06:51 * Raystm2 creates ludditeForth. It uses a real dictionary, 2 springloaded plate stackers, a steno pad and a chalkboard. 16:07:14 heh 16:09:08 You can't add any words to the dictionary unless you write in the margins or get your word approved by Funk and Wagnell but, hey, you got the entire english language to use so yes this Forth is borne as bloatware. 16:09:21 --- quit: virl (Remote closed the connection) 16:09:33 Ned Ludd would be pleased, especially if you set fire to a loom while you build it. 16:10:00 --- join: snoopy_1711 (i=snoopy_1@dslb-084-058-109-129.pools.arcor-ip.net) joined #forth 16:10:13 :) 16:11:00 For that we need to invade a third-world nation, where such devices are actually used. 16:12:15 Mexico: the largest exporter of U.S. Americans in the world. <-- From Paul Harvey's morning news. 16:12:32 Page two. 16:13:13 insert: Sleep Comfort add here. 16:13:21 ad even doh! 16:13:28 And that man's name was Burt Reynolds. 16:16:12 I met Burt at his brothers house in South Lake Tahoe in 1983. I was in a band playing the party and the band was ushered into a bedroom when we arrive to discuss Burt's entrance, which included two 6'4" California blond/tanned young men in matching Hawain shirts and khaki shorts. 16:16:34 Burt bookends. 16:16:43 Exactly. 16:17:11 He's pretty short, himself. Cigar in one hand, Scotch rocks in the other. 16:17:32 --- quit: Snoopy42 (Read error: 145 (Connection timed out)) 16:17:56 --- nick: snoopy_1711 -> Snoopy42 16:21:50 --- join: ellisway (n=ellis@host-87-74-241-174.bulldogdsl.com) joined #forth 16:44:31 What? IMDB says he's 5'10" :) 16:45:26 And it says William Shatner is 5'9 1/2". 16:54:41 --- part: marble left #forth 18:02:36 --- quit: Raystm2 (Read error: 110 (Connection timed out)) 18:49:46 --- quit: ellisway (Read error: 131 (Connection reset by peer)) 19:15:40 --- join: Raystm2 (n=NanRay@adsl-69-149-50-26.dsl.rcsntx.swbell.net) joined #forth 20:10:10 --- quit: nighty_ ("Disappears in a puff of smoke") 20:16:34 --- join: ellisway (n=ellis@host-87-74-241-174.bulldogdsl.com) joined #forth 20:32:22 --- quit: segher (Nick collision from services.) 20:32:31 --- join: segher (n=segher@dslb-084-056-174-216.pools.arcor-ip.net) joined #forth 21:01:28 --- join: snowrichard (n=richard@12.18.108.162) joined #forth 21:14:10 --- quit: snowrichard ("Leaving") 21:21:13 --- quit: segher (Read error: 145 (Connection timed out)) 21:21:45 --- join: segher (n=segher@dslb-084-056-156-137.pools.arcor-ip.net) joined #forth 21:58:41 --- quit: zpg (Read error: 110 (Connection timed out)) 22:26:47 --- join: Cheery (n=Cheery@a81-197-54-146.elisa-laajakaista.fi) joined #forth 22:38:58 --- quit: Shine (Nick collision from services.) 22:39:03 --- join: Shine_ (n=Frank_Bu@xdsl-213-196-229-123.netcologne.de) joined #forth 22:39:16 --- nick: Shine_ -> Shine 22:50:16 --- quit: Shine ("Chatzilla 0.9.77 [Firefox 2.0/2006101023]") 23:29:50 --- quit: uscore ("\") 23:59:59 --- log: ended forth/06.12.10