<<02-06-2012>>

04:11:58*XAMPP joined #nimrod
06:10:17*XAMPP quit (Quit: There is no such thing as coincidence, only the inevitable.)
06:13:48*Psyclonic joined #nimrod
06:18:28*llm joined #nimrod
10:08:17*apriori_ joined #nimrod
10:08:48dom96good morning everyone
10:14:35apriori_there doesn't happen to be a c header to nim converter, does it?
10:18:26dom96apriori_: There is a tool which does that; c2nim
10:18:47dom96https://github.com/Araq/Nimrod/tree/master/compiler/c2nim
10:18:47apriori_can you give an example on how to use it on headers?
10:18:51apriori_yeah, I got that
10:19:17dom96http://build.nimrod-code.org/docs/c2nim.html
10:19:19dom96That might help
10:19:39apriori_ok, thank you
10:25:50apriori_uff, c2nim dies on the opencl headers ;)
10:27:38dom96You need to adjust the headers until c2nim understands them :P
10:27:51apriori_yeah, maybe...
10:27:58apriori_but this very first case doesnt make sense at all
10:29:35dom96Does c2nim crash?
10:29:41apriori_nope, just:
10:29:42dom96or just give you an error about the header file
10:29:47apriori_CL/cl_ext.h(67, 49) Error: ';' expected
10:30:17apriori_http://pastebin.com/s0p9fiVa
10:30:19apriori_code section...
10:30:20dom96Take a look at the docs, the limitations section.
10:30:24apriori_49 is right after the (
10:30:45apriori_I did, there is no real hint about that
10:30:57apriori_though I assume its the calling convention put in the forward declaration
10:31:23dom96Try to simplify it
10:31:28apriori_on it
10:47:13apriori_uff, opencl does some very wicked typedef stuff in their headers...
10:50:33dom96if it's not really important just remove it
10:50:47apriori_well, I think that special stuff actually is
10:50:54apriori_it forces some alignment on vector types
10:51:16apriori_but I will come to that later.. just commenting out and trying to get some very basic stuff running
10:57:55apriori_hm.. c2nim really has some problems with function pointer types
11:04:33apriori_is there some info on how nimrods module system works?
11:04:57apriori_I just tried to import something which is located in a subdirectory relative to a .nim... import Cl.cl notation doesn't seem to work.
11:07:18dom96I think `import "cl/cl"` will work
11:07:58apriori_nope
11:08:25apriori_ah, wait
11:08:32apriori_some error in the generated cl.nim
11:15:52apriori_now I got a real issue..
11:16:05apriori_the C library defines struct with names like _cl_platform_id
11:16:27apriori_c2nim transformed the c typedef
11:16:28apriori_typedef struct _cl_platform_id * cl_platform_id;
11:16:30apriori_to:
11:16:35apriori_cl_platform_id* = ptr _cl_platform_id
11:17:06apriori_which would be just fine.. if the compiler wouldn't complain about the leading underscore of _cl_platform_id
11:18:50dom96hrm, change cl_platform_id to PCLPlatformID and _cl_platform_id to TClPlatformID
11:19:10dom96I guess there is a lot more of these types.
11:19:28apriori_yeah.. but is that then a real pointer to the struct opencl wants there?
11:19:28dom96I don't think c2nim can automatically change the name like that
11:19:33apriori_which is defined in the lib?
11:20:17dom96i guess
11:20:55apriori_seems like I need a testcase for that
11:26:46*llm quit (Quit: ChatZilla 0.9.88.2 [Firefox 12.0/20120420145725])
11:40:33apriori_dom96: I don't think I properly described the issue..
11:40:56apriori_I want the equivalent of a simple C forward declaration of a struct type, which lies somewhere in a lib
11:41:30dom96In Nimrod you do not need to forward declare types
11:41:51dom96As long as they are in the same 'type' section it should work, I think.
11:41:56apriori_but how can I create an instance of such a struct that if nimrod has no clue about it?
11:42:41dom96Don't create it?
11:42:55dom96For the purposes of a wrapper it's not needed.
11:43:15apriori_it is needed ... it contains data one has to fill etc.
11:43:23apriori_otherwise I would need to write such stuff in C
11:44:05dom96I don't think I get what you mean.
11:44:15dom96Declare it as an object then?
11:44:32apriori_yep, you really don't get it ;)
11:44:37apriori_but wait a minute.. searching something
11:45:58apriori_dom96: ok, well..
11:46:03apriori_let us start from the beginning ^^
11:46:16apriori_in opencl.. there is a struct called cl_platform_id
11:49:17*Zerathul joined #nimrod
11:49:49apriori_and I can't find any definition of that struct and its field anywhere.. so I assume its just a declaration to something which is in the opencl libraries
11:50:06apriori_typedef struct _cl_platform_id * cl_platform_id;
11:50:16apriori_thats all I can find.. no proper struct declaration of _cl_platform_id
11:51:01dom96oh! Just declare it like this: TCLPlatformId*{.pure, final.} = object
11:51:39*Zerathul quit (Client Quit)
11:52:03apriori_ok, will try that
11:52:09apriori_thank you for your patience ;)
11:54:18dom96np
12:23:39Araqapriori_: you can tell c2nim how to translate identifiers
12:23:55apriori_Araq: ok, I will look into that..
12:23:58apriori_now I gotta go though
12:23:59apriori_bye
12:24:00Araqand you can tell c2nim about the CL_API_ENTRY macro too
12:24:04Araqbye
12:24:13apriori_ok, thank you
12:24:19*apriori_ quit (Read error: Connection reset by peer)
12:40:23Araqping zahary
14:13:13Araqoh hi Psyclonic
14:13:30Araqdidn't notice your arrival :-)
15:34:29TasserAraq, he ninja'd in
15:38:29AraqTasser: indeed :-)
16:01:30Araqzahary: got my message about slurp and staticRead?
16:01:54zaharywhich one?
16:03:11zaharyI'm almost done btw. I'm currently coming up with an example for staticExec in the docs
16:04:38Araqthe one where I argued that 'slurp' is like 'include'
16:04:48Araqand 'include myvar' shouldn't be supported either
16:04:54Araq(and isn't)
16:05:11Araqso I'd like to have both slurp and staticRead
16:06:44zaharywell, I it's easy to do it this way, but I kind of disagree that staticRead should not be tracked automatically
16:07:52Araqit shouldn't until we got the caching API IMO
16:08:46zaharyexecuting process can have many purposes, but when shouldn't modified files read by staticRead trigger a rebuild?
16:09:43Araqhm good point
17:17:47Araqyummy :-)
17:20:26Araqzahary: what are standalone except and finally blocks?
17:28:01zaharythey are like atScopeExit and onError from D and clay
17:28:36zaharyI have a bit more work on except tho
17:28:36zaharyotherwise, they are used like this:
17:28:36zaharyf = fopen("somefile")
17:28:36zaharyfinally: close(f)
17:31:33zaharyI haven't made up my mind on "except:". should we call it onerror instead?
17:31:33zaharyright now, it does consume the exception and I'm also considering leaving it this way and introducing separate onerror that's more standard (that doesn't consume it)
17:33:07*ccssnet quit (Read error: Connection reset by peer)
17:38:33Araqhm "onerror" is not particularly asthetic
17:39:01AraqI'd prefer 'except' for now
17:39:46zaharyyeah, I wanted to be consistent too
17:39:58Araqhowever, I'm not convinced that's needed
17:40:24zaharywell, if only as a checkbox feature, I think it's nice
17:40:26zaharyhttps://github.com/jckarter/clay/blob/v0.1.0/doc/language-reference.md#scopeguardstatements
17:40:26Araqwhen one needs to program transactions, it may be better to create a macro for this purpose
17:40:33zaharyhttps://github.com/jckarter/clay/blob/v0.1.0/doc/language-reference.md#scopeguardstatements
17:41:40Araqas a macro can know about the "rollback" convention
17:41:57Araqbut I haven't really thought about it
17:44:08zaharyin C++ I miss such facilities sometimes when the RAII code is kind of unique and one-off. example that comes to mind is stack management in lua (you mush always call lua_popstack or lua_settop with a different number/order/etc)
17:59:35Araqbtw how is `*x` supposed to work?
17:59:47Araqvar `*x` = 0 # gensym
17:59:57Araq`*x` # gensym again? o.O
18:00:18Araqi.e. how to use 'x'?
18:01:17zahary`*x` every time, yes
18:01:36zaharycould be of interest: http://wiki.luajit.org/New-Garbage-Collector
18:02:20zaharywe have deprecated `*x`, right? I could try to do something with a pragma instead
18:04:01zaharyif you ask how it works, the idea is that * is mapped to unique ID during a single expansion of the template, so every time you say `*x`, you get <same-unique-id>x
18:09:18Araqyeah `*x` is deprecated and indeed I'm going the pragma way :-)
18:09:41Araqfyi I also decided to make locals 'byref' when captured in a closure
18:09:53Araqbut there is a 'bycopy' pragma that can change the default
18:10:17Araqthe variables in the built-in countup and countdown iterators will have the 'bycopy'
18:10:55Araqso capturing a for loop var has the right semantics
18:11:59Araqit feels a bit optimized towards rossetta code examples but oh well :-)
18:13:01zaharyyeah, we talked about bycopy/byref before. sounds good
18:14:48Araqthanks for the link
18:14:51Araq"Also, a search for a "quad-color" GC (or variations) does not turn anything up. In the absence of evidence to the contrary, I (Mike Pall) hereby claim to have invented this algorithm. "
18:14:58zaharybut I don't get the countup/countdown part. shouldn't every iterator var be captured this way?
18:15:26Araqugh, he should have a correctness proof for that ... but hey, it's Mike Pall after all
18:16:21Araqwell I'm not sure every "iterator var" should be captured this way
18:16:49Araqand the new implementation runs after transform() so iterator vars are lost by the time we run the lambda lifting
18:18:47zaharyin pseudo javascript, the problem is often triggered like this
18:18:47zaharyfor elem in elements():
18:18:47zahary changeStyleBtn.click do:
18:18:47zahary elem.css "color", "red"
18:19:14zaharyexpected outcome: change all elements, what happens: only the last one gets changed
18:19:47zaharyand the code is silly, because the loop could be inside the click handler, but the purpose is to illustrate the point
18:21:46AraqJS is weird I need to check how it behaves in nimrod :-)
18:24:25Araqfor interfaces = tuple of closures we need byref capturing
18:24:34Araqso that's more important
18:25:22Araqin fact, I don't mind too much should it be the only capturing mechanism; python gets it wrong too :P
18:34:02zaharyif you put an explicit copy on the first line of the loop like this:
18:34:02zaharyfor elem in elements():
18:34:02zahary var elemCopy = elem # in your algorithm, this variable will never be placed directly on the stack, right? instead it will become a member of the closure object?
18:34:02zahary something do: elemCopy
18:34:53zaharyin C# there is only by ref and I guess their only modification to the compiler is the introduction of such an implicit variable
18:35:15zaharybut nevertheless, more control doesn't hurt
18:36:17Araqit will become a member of the closure object, yes
18:36:39Araqbut in a later version closure objects may be put onto the stack if they don't escape
18:36:55zaharyyeah, that's why I said directly
18:37:36Araqoh I missed the 'directly' :-)
19:15:56Araqer, ... we've talked about this: capturing another variable that copies the for loop var does NOT work
19:16:36Araqbecause this new variable is then shared
19:17:18Araqbut that's however a problem only because I perform the closure allocation not in the loop body, but at outer proc entry
19:17:20Araqhm
19:37:52Araqzahary: you broke nimbuild :P
19:37:55Araqlib/system.nim(2178, 62) Warning: unknown magic 'StaticExec' might crash the compiler [UnknownMagic]
19:37:57Araqlib/system.nim(2178, 15) Error: implementation of 'staticExec(command: string, input: string): string' expected
19:38:19AraqI had the same problem, just use ' = nil' as implementation
19:39:28zaharyyeah, I noticed, sorry about that, but I thought unknown pragma is just a warning
19:39:51zaharyah, so no need for new sources after all, ok
19:42:58Araqwell unkown pragma should only be a warning :-)
19:43:06Araqbut I missed that part
19:43:28Araqwe'd need a mUknown that's different from mNone to make it work :D
19:46:28Araqhey using localError() in the backends is cheap :P
19:47:01AraqI wanted to have the backends free from error reporting, but I can see it's the simplest and fastest solution :-/
19:47:44Araqit's however not correct, 'nimrod check' doesn't invoke the backend ...
19:48:32Araqit's good enough for now, but I suppose we need another pass checking for magics in weird places ...
19:52:31zaharyI also considered efCompileTime expression flag for sem
19:55:54Araqugh, I never liked the flags for nodes
20:12:39Araqcase expressions?
20:13:05Araqand try expressions?
20:13:19Araqbtw how do they render?
20:13:54Araqzahary: no codegen for c++ destructors yet?
20:15:46zaharywell, after weighting all the implications I'm about to decide against them - with the current approach we get destructors working in C, C++ and evals - otherwise there must be 3 separate implementations
20:18:42zaharythere is a future feature I'm interested in - generating headers with types that wrap nimrod types and allow idiomatic use from C++, but even my previous plan with real destructors woudn't get us this for free and it's still possible to achieve
20:20:58*ccssnet joined #nimrod
20:21:16zaharyabout the new expressions, they are only parsed for now (no sem, no rendering, etc)
20:22:27zaharyI just took the opportunity to add them to the parser as they were somewhat similar to my other changes
20:29:06AraqI see
20:34:43Araqbut we'll get most advantages once the code gen uses C++'s try statement instead of the setjmp approach, right?
20:35:04AraqI like fast try statements :-)
20:36:48zaharyyes, I compared some C++ code for destructors vs this approach using many try statements and there is no difference in the assembly
20:37:41zaharyit's interesting to see how setjmp compares, but we should probably recommend destructor-heavy code to use C++
20:38:02Araqyeah
20:38:23Araqit's nice to have the C backend for quick turn around times though
20:39:01Araqis there a difference between try { try { }} and try {}?
20:39:14AraqI mean for performance
20:39:34Araqfor the setjmp solution there is
20:39:56Araqso I'm a bit worried that you don't merge implicit try-finally statements
20:40:04zaharyshoudn't be. in C++ what matters is only the creation of a new object
20:41:13zaharyhmm, I have to think about when such merges could occur in practice
20:42:05Araqvar x = open"abc"
20:42:12Araqfinally: x.close
20:42:18Araqvar y = open"xyz"
20:42:23Araqfinally: y.close
20:43:06Araqif I'd written with an explicit 'try', I would have merged the close operations somehow
20:43:25Araqit's not possible in the general case though
20:44:51zaharyyou could have written it like this:
20:44:51zaharyvar x, y
20:44:51zaharytry:
20:44:51zahary x = open
20:44:51zahary y = open
20:44:51zaharyfinally:
20:44:51zahary if y != nil: close y
20:44:52zahary close x
20:44:53zaharybut that's not equivalent
20:45:38Araqbut I'd do it this way :-)
20:46:56zaharythe try approach will be faster in C++, this would be faster in C (unfortunately it's trade-off that's left for the user to decide)
20:46:57AraqI've already adapted to Nimrod's "try is expensive" ...
20:48:10Araqfor a destructor we could have a {.merge.} pragma ...
20:48:31Araq(I think .merge already exists but means something entirely different)
20:50:14zaharyultimately I want to use the C++ codegen, because that will allow me use more existing third party libraries and our own codebase
20:50:36AraqI know
20:52:01Araqwe could require that calling 'destroy' twice does no harm
20:52:08Araqwhich is good style anyway
20:52:31Araqand then we could put destructors in the same finally section
20:53:02zaharyseems very tough requirement
20:55:53zaharyI'd like to use more noInit types in my code as well - this also makes things harder for the C codegen
21:02:48TassernoInit types=
21:03:35zaharynimrod initializes all variables to zero by default
21:07:37zaharyit's worth pointing out that any code involving exceptions will probably run faster in C++ and I think most rational people should use that
21:08:18zahary:) including us in the compiler itself
21:14:25Araqmaybe if the destructor is annotated with .noSideEffect?
21:14:32Araqbut ugh forget it
21:14:37Araqthis doesn't make sense
21:16:03Araqso you mean that's hard to perform a no-op 'destroy' when the memory is not initialized?
21:17:39zaharyyep
21:18:38Araqhm good point
21:21:12Tasserwhy so?
21:23:03Araqit's hard to do any checks on non initialized memory
21:27:32Araqso my idea is that vars et. al. declared in a template are gensym'ed unless declared with an {.export.} pragma. opinions?
21:27:54Araqor perhaps {.inject.}?
21:29:45dom96hello
21:30:06Araqhi dom96
21:32:25dom96So Prometheus was disappointing.
21:32:37Araqstop it
21:32:45Araqit will be the best movie ever
21:33:11dom96You can convince yourself all you want
21:33:30Araqdom96: syntax question: 'inject' or 'export' for vars that shall escape a template?
21:33:57dom96Define "escape" :P
21:34:10Araqcurrently this is possible:
21:34:18dom96Should be included in the resulting code or should not?
21:34:18Araqtemplate t() = var x: int
21:34:21Araqt()
21:34:26Araqx = 23
21:34:36Araqbut I'd like to forbid that
21:35:08dom96Those keywords kind of suggest to me that 'x' would behave like you just described
21:35:19dom96i.e. it would be in the resulting code
21:35:24Araqyep
21:35:27Araqthat's the plan
21:35:33dom96Ugh, it's so hard to describe this for some reason
21:35:53Araqto disallow the above code and make you use a pragma to get back the behvaviour
21:36:04Araqtemplate t() = var x {.inject.}: int
21:36:19dom96Won't this break a lot of code? since by default currently everything has that pragma?
21:36:54Araqyeah but we broke templates already with the 'immediate' stuff
21:37:14Araqbetter do it properly then
21:37:51Araqand for instance, jester should benefit quite a lot from that
21:38:15dom96"the 'immediate' stuff"?
21:38:49Araqno the arguments are sem'checked before template instantation to allow overloading of templates
21:38:54Araq*now
21:39:08Araqand you need the immediate pragma to disable that
21:40:40dom96ahh
21:42:57dom96Wouldn't it be better to have this: var x*: int ?
21:43:10dom96I don't really like the idea of a pragma for this.
21:43:49Araqbut then what you write to declare a global variable in a template?
21:44:31dom96How about a new keyword?
21:45:06dom96or: `var x: int`
21:45:12Araqmeh, 'export' is already planned for the '*'
21:45:23Araqand 'inject' is too useful to be a keyword
21:45:37dom96Would backquotes work?
21:45:44Araqnah
21:45:52dom96hrm.
21:45:57dom96var ~x: int
21:46:06dom96or
21:46:10dom96var x~: int
21:46:12Araqvar x~: int
21:46:15Araqyeah
21:46:17Araqhm
21:46:26Araqor better:
21:46:29Araqvar x+: int
21:46:34dom96hrm.
21:46:49dom96Sure I guess.
21:46:53AraqI like the pragma better
21:47:05Araqscope injection is evil and deserves an ugly pragma
21:47:09dom96But it's so much typing :\
21:47:23dom96I guess that's true.
21:47:32dom96I won't be scope injecting that often
21:47:38Araqlet me check how many of my templates would be affected
21:49:08dom9616 posts on one thread, the forum definitely needs paging.
21:49:38Araqwe could also delete old threads instead :P
21:49:41AraqXD
21:50:07dom96yeah, I like the idea of answering the same questions multiple times.
21:50:47AraqI answer more questions than you do anyway :P
21:50:52Araqso it's more work for me
21:51:53dom96It seems you like work. Go ahead, you'll get to delete the old threads AND answer the same questions again!
21:52:00dom96:P
21:55:27Araqok, I'll go the 'inject' way
21:55:46Araqmost of my templates don't have a 'var' section anyway
21:55:59dom96Awesome. Rafael Vasco's GLFW bindings work nicely.
21:56:17Araqdid you try the example program or what?
21:56:48dom96yeah
22:01:16dom96oh and vladar put his nimgame library on github too
22:01:51Araqdo I want to see the code?
22:02:52dom96I don't know. Do you like methods? :P
22:04:18Araqno
22:07:24dom96Araq: How are the closures going?
22:07:51Araqhave been reviewing zahary's changes instead :-)
22:08:06dom96i see
22:09:09*dom96 will finish his changes to sockets
22:09:13Araqeven unittest does no scope injections
22:09:34Araqthis change won't change much code at all
22:09:39Araq*break
22:10:06dom96oh cool. I'm glad you guys are using nimbuild :)
22:12:19Araqsure, how else should we run the testsuite?
22:12:32*Araq forgot how to invoke the tester
22:12:42dom96haha
22:39:21*filwit joined #nimrod
22:39:36filwithi dom96
22:39:55filwitsorry I missed you yesterday, but I'm guessing you where probably done after your exam anyways
22:40:48dom96hello filwit
22:41:17filwitdoes kinda suck we're in such different timezones
22:41:25filwitit's what, 1am over there?
22:41:35dom96nah, 11:40
22:41:44filwitoh alright, not to bad
22:42:35filwitI was trying to get on earlier today, but I was gone all day, and now I need to finish something for my brother
22:42:45filwitotherwise I'd say we should work on Aporia
22:43:02dom96Ahh, well my "friends" want to play Worms Reloaded anyways.
22:43:05dom96So it's alright
22:43:12dom96Will you be here later on?
22:43:44filwithopefully, I have a bit of work to do, but I'll try and come to a good stopping place soon
22:44:02filwitI did get the "intelligent tab" in aporia almost finished
22:44:04dom96I'm not sure how long I will be up for though :\
22:44:17filwitya, no worries
22:44:20filwitmaybe sunday
22:44:20dom96"intelligent tab"?
22:44:21filwit?
22:44:30filwitya, that's what I'm calling it
22:44:34dom96What is it?
22:44:40dom96And sure, sunday is alright.
22:45:09filwitwell I was telling you that I was making it dedent when you pressed return after a blank line
22:45:17filwitwell I've taken that a bit further
22:45:30filwitso it auto tabs into if/procs
22:45:53dom96oh cool.
22:45:53filwitand it wont dedent if you're "inside" a if/proc body, only at the end
22:46:12dom96For some reason when you said "tab" I thought tab as in well tab not indentation :P
22:46:24filwitand pressing delete dedents where applicable (shift-backspace can be used to force single delete)
22:46:47dom96Perhaps you should call it the "super nimrod mode" :P
22:46:48filwitI don't mean delete dedent the entire line btw
22:47:22filwitah lol, "super nimrod mode" sounds a bit to cool for what it does
22:47:37dom96heh
22:47:52filwitbut it actually does make things easier to work with, especially when just writing quick if statements and stuff
22:48:03filwitcause it auto tabs, and exits intelligently
22:48:56dom96I think you should call it that. We'll add more awesome features to it in the long run :)
22:49:00filwitI'm thinking that the auto dedent thing should be a "sub option" to the intelligent tabbing option though, cause some people might just want to have it auto tab after ifs and stuff without that
22:49:22filwitlol, alright, I'm all for having cool names
22:49:46dom96You can add another tab to the settings dialog and have lots of different checkboxes there :)
22:50:10dom96Although I guess the "Editor" tab has enough space
22:50:33filwitmaybe we could add VIM style navigation, but with a spin so that you're not in Input/Nav modes, you just press Alt-J to move up, etc
22:51:30dom96Well I'm used to arrow keys anyways.
22:52:04filwitya, I never actually used VIM, but I know one of the reasons people like it is because you never have to move your hands from the keyboard
22:52:27filwitthough I don't like there keyboard short-cuts really, I think that concept has merit
22:53:16filwitwe could just make A/S/D/W controls navigate when pressing Ctrl, or maybe move them to J/K/L/I
22:53:26filwitanyways...
22:53:31filwit:)
22:53:56dom96Perhaps we should have a plugins API?
22:54:09filwitthat would be cool
22:54:16filwitwhat we really need is to convince Araq to make the compiler as a service
22:54:25dom96yes, for better suggest :)
22:54:30filwitso we can get Sugguest and Overview quickly
22:54:42filwit(and he ends up doing all the work for it)
22:54:46filwit;-P
22:54:49dom96lol
22:55:20filwitno seriously though, that would open the door to a lot of dev tools
22:55:23filwitnot just suggest
22:55:41filwitrefactoring, built-in REPL, etc..
22:55:52filwitcould all take advantage of that
22:56:16dom96yes, all of that will have to be implemented though
22:56:21dom96in the compiler
22:56:40dom96I wish my compiler hacking skills were good enough to implement these things
22:56:49filwitguess I'm going to have to start digging into the compiler then :)
22:57:10filwitthough I'm with you, I doubt I'll be of much use to it right now
22:57:39filwitbut I've learned a lot about such things recently with all the D discussions I've had
22:57:58filwitstill...
22:58:22filwitanyways man, I've got to do some stuff
22:58:33filwitI think I'm going to hop off here so this isn't a distraction
22:58:37filwit:)
22:58:56filwitI'll talk to you later, or more likely tomorrow
22:59:04filwitbye
22:59:38dom96see ya
23:00:47*filwit quit (Quit: Leaving)