flux changed the topic of #ocaml to: Discussions about the OCaml programming language | http://caml.inria.fr/ | OCaml 4.00.1 http://bit.ly/UHeZyT | http://www.ocaml.org | Public logs at http://tunes.org/~nef/logs/ocaml/
thomasga has quit [Quit: Leaving.]
alang has joined #ocaml
watermind has quit [Quit: Konversation terminated!]
<pippijn> adrien: probably the worst part of my parser generator is that it assumes that the EOF token has terminal-id 0
<pippijn> it handles the EOF token specially
<pippijn> but for things like JSON, there is no need for an EOF token, at all
<pippijn> because it has a well-defined end of stream
djcoin has quit [Quit: WeeChat 0.4.0]
<pippijn> what does camomile mean? how did they come up with that name? I know the plant, but why did they call a unicode library after a plant?
penryu has left #ocaml []
<Drup> so, it's possible to put in a mli : "type bla = blu = { truc : string }" but not "type bla = blu = < truct : string >" ? Am I doing something wrong ? =O
alang has quit [Ping timeout: 245 seconds]
madroach has quit [Ping timeout: 264 seconds]
madroach has joined #ocaml
alang has joined #ocaml
talzeus has joined #ocaml
darkf has joined #ocaml
carleastlund has joined #ocaml
q66 has quit [Quit: Leaving]
turnersr has quit [Quit: Leaving]
Xom has joined #ocaml
Xom has quit [Client Quit]
ygrek has joined #ocaml
shinnya has quit [Ping timeout: 256 seconds]
Neros has quit [Ping timeout: 240 seconds]
yacks has quit [Ping timeout: 245 seconds]
gnuvince has joined #ocaml
gnuvince has quit [Changing host]
gnuvince has joined #ocaml
alang has quit [Ping timeout: 256 seconds]
void64 has quit [Ping timeout: 260 seconds]
yacks has joined #ocaml
turnersr has joined #ocaml
walter has joined #ocaml
alang has joined #ocaml
yacks has quit [Quit: Leaving]
<flux> drup, I haven't tried that, but you can just use type bla = < truct : string > for the same effect.. except for compiler error messages?
<Drup> I need to expose some type equality
<flux> why not plain type bla = blu then?
<Drup> because I also want to expose the inside of the type :]
<Drup> with "type bla = blu" only, it will be opaque
manud has joined #ocaml
walter has quit [Read error: Connection reset by peer]
walter has joined #ocaml
Drup has quit [Quit: Leaving.]
<pippijn> %%% [+2.413904s = 2.714214s] parsing user actions
<pippijn> this takes up about half the time my parser generator needs to do its thing
<pippijn> %%% [+1.813169s = 5.497723s] emitting ML code
<pippijn> this also takes a lot of time
<pippijn> the other thing that takes time is LR item set computation
<pippijn> any ideas on how I could optimise parsing?
<pippijn> maybe concatenate all user codes with ;; and then split them up?
<pippijn> no, that doesn't work.. then source locations are wrong
ggole has joined #ocaml
testcocoon has quit [Quit: Coyote finally caught me]
testcocoon has joined #ocaml
ben_zen has quit [Ping timeout: 240 seconds]
testcocoon has quit [Ping timeout: 245 seconds]
Arsenik has joined #ocaml
walter has quit [Read error: Connection reset by peer]
walter has joined #ocaml
zpe has joined #ocaml
testcocoon has joined #ocaml
walter has quit [Read error: Connection reset by peer]
ttamttam has joined #ocaml
zpe has quit [Ping timeout: 246 seconds]
walter has joined #ocaml
bernardofpc has quit [Ping timeout: 248 seconds]
bernardofpc has joined #ocaml
ygrek has quit [Ping timeout: 240 seconds]
cyanure__ has joined #ocaml
testcocoon has quit [Ping timeout: 245 seconds]
bernardofpc has quit [Ping timeout: 264 seconds]
thomasga has joined #ocaml
zpe has joined #ocaml
ygrek has joined #ocaml
zpe has quit [Ping timeout: 260 seconds]
bernardofpc has joined #ocaml
cyanure__ has quit [Ping timeout: 240 seconds]
mcclurmc has quit [Ping timeout: 256 seconds]
zRecursive has joined #ocaml
turnersr has quit [Ping timeout: 256 seconds]
djcoin has joined #ocaml
cago has joined #ocaml
hkBst has joined #ocaml
zpe has joined #ocaml
ski has quit [Quit: Lost terminal]
zRecursive has left #ocaml []
eikke has joined #ocaml
zpe has quit [Ping timeout: 260 seconds]
chambart has joined #ocaml
testcocoon has joined #ocaml
djcoin has quit [Quit: WeeChat 0.4.0]
<pippijn> wmeyer: treematch is broken
<pippijn> wmeyer: it produces unparseable code if you only have 1 parse tree node
carleastlund has quit [Quit: carleastlund]
<jpdeplaix> technomancy: I'm trying to compile your code, I get stuck with: Reference to undefined global `Dl'
zpe has joined #ocaml
void64 has joined #ocaml
<jpdeplaix> technomancy: oh. I got it. I used ctypes instead of ctypes.foreign
atn34 has joined #ocaml
zpe has quit [Ping timeout: 240 seconds]
skchrko has quit [Quit: Leaving]
cyanure__ has joined #ocaml
Simn has joined #ocaml
djcoin has joined #ocaml
Kakadu has joined #ocaml
<pippijn> compare : int -> int -> int is quite expensive
zpe has joined #ocaml
<pippijn> it's more expensive than: if a < b then -1 else if a > b then 1 else 0
cyanure__ has quit [Ping timeout: 260 seconds]
zpe has quit [Ping timeout: 245 seconds]
<pippijn> https://paste.xinu.at/vbaiTf/ <- this makes me sad
<pippijn> it insists on dereferencing the pointer 5 times
ousado has quit [Remote host closed the connection]
<ggole> Compare is a little interpreter that recursively inspects the structure of its arguments
<ggole> It's never gonna be fast
<pippijn> ggole: not true
<pippijn> it's specialised for int
<ggole> Hmm, just emits a call to caml_compare here
<pippijn> really?
<pippijn> I just checked.. let me check again
ousado has joined #ocaml
atn34 has quit [Ping timeout: 264 seconds]
<ggole> Ah
<ggole> If I change the form a bit I get a call to caml_int_compare
<ggole> let cmpa = (compare: int -> int -> int) doesn't trigger the specialisation.
<pippijn> hm yes
<ggole> let cmpa (a:int) b = compare a b does
<pippijn> but it does call something
<pippijn> 40256a: e8 86 55 00 00 callq 407af5 <caml_int_compare>
<ggole> let cmpb (a:int) b = if a < b then -1 else if a > b then 1 else 0
<pippijn> that's why my code became 14% slower when I used compare instead of the manual < and >
<ggole> That gives the expected cmp/jcc pairs
<ggole> Sad face.
<pippijn> very sad
<ggole> Those redundant loads are pretty sad too
<ggole> I guess the compiler is pretty naive about that stuff
<pippijn> the redundant loads (I have 4 of them in the innermost function) don't matter that much
<pippijn> less than 1%
<pippijn> 0.3%
<ggole> Wonder if that's true on Atom
<pippijn> does atom have slow loads?
<ggole> No, but it is in-order.
<pippijn> ah
<pippijn> I don't know, I measure these percentages with valgrind
<pippijn> I assume valgrind is also in-order
<pippijn> then there is this function: https://paste.xinu.at/AxB/
mort___ has joined #ocaml
<ggole> What's the problem there?
<pippijn> https://paste.xinu.at/MEqhg/ocaml <- this code accounts for 26% of the instructions
<pippijn> almost 27%
<pippijn> I tried storing the ordinals before, it didn't help
<pippijn> I'll try it again
<gasche> 10:49 < pippijn> it insists on dereferencing the pointer 5 times
<gasche> there may be some CSE in future OCaml versions
<gasche> truth is, it doesn't change performance much for most real-world code
<pippijn> yes, I found that
<pippijn> the caml_int_compare hurts 14% while the redundant loads are less than 1%
<gasche> do you observe this difference during valgrind runs, or also during direct runs?
maufred has joined #ocaml
<gasche> I'm wary of profiling overheads
<pippijn> calling an external function vs. subtracting 2 numbers?
<pippijn> (btw, storing the ordinal in the object hurts performance)
<ggole> You could, ugh, move the fast case from the comparison into the loop
<ggole> (Might not help if it isn't common.)
<pippijn> I think it's not common
<ggole> So those table lookups are what are killing you?
<ggole> Hashtable? Array?
<pippijn> array
<ggole> Hrm.
Snark has joined #ocaml
zpe has joined #ocaml
<gasche> iirc, Batteries previously used int-specialized compare for BatInt.compare, then moved to something like your cmpb above
* pippijn shuts down the VM and all other applications
<ggole> I wonder if cmovs would be better for that case
<pippijn> this is the minimum out of 5 runs: %%% parsing took 6.440039s
<ggole> Probably not worth the bother though.
<pippijn> with let ord = p2.startColumn - p1.startColumn
<ggole> Never mind, I'm an idiot. cmov doesn't take immediates.
walter has quit [Read error: Connection reset by peer]
<gasche> pippijn: is this still a fork of menhir?
<gasche> (or does your performance tweaking happen in the part that receives the added exception, and is thus non-invasive?)
walter has joined #ocaml
<pippijn> this is not menhir at all
<pippijn> it's a GLR parser
<gasche> ok
<pippijn> I need more than 5 runs
<pippijn> %%% parsing took 6.433661s
<pippijn> this is with compare
<pippijn> usually around 6.5, sometimes 6.8 or 6.9
zpe has quit [Ping timeout: 245 seconds]
<pippijn> but the minimum is interesting
<pippijn> ok, it doesn't seem to go below that 6.43
<pippijn> let me try again with - instead of compare
<pippijn> another test (the glr stress test, which I used in valgrind) takes 0.260 with compare
<pippijn> the 6.43 seconds is for an 8MB c++ source file
<pippijn> ok, the stress test does suffer from compare, it's 0.249 with -
<pippijn> 6.397381s with -
lenstr has quit [Ping timeout: 264 seconds]
<pippijn> so the stress test gains 4% and the C++ parser gains less than 1%
<pippijn> not worth it, then
LeNsTR has joined #ocaml
<pippijn> removing the first comparison gains more: 6.332797s
<pippijn> I'm not 100% sure it's still correct, then
<gasche> note that using (-) exposes you to overflow issues
<pippijn> yes, I am aware
<pippijn> but it doesn't happen, because my ints are small
<pippijn> unless you have rules with more than 2 billion elements on the right hand side
<pippijn> and then it wouldn't have compiled in the first place :)
<pippijn> removing the first test gains over 50% for the stress test
<pippijn> 0.260 vs. 0.100
<pippijn> the stress test is interesting, because it doesn't involve much lexing
<pippijn> 50 tokens
<pippijn> it's E -> E E | a
demonimin has quit [Remote host closed the connection]
skchrko has joined #ocaml
cyanure__ has joined #ocaml
<pippijn> ok, - vs. compare does not help all that much, so I'll keep compare (for clarity)
zpe has joined #ocaml
q66 has joined #ocaml
ski has joined #ocaml
djcoin has quit [Ping timeout: 245 seconds]
djcoin has joined #ocaml
mort___ has quit [Quit: Leaving.]
<pippijn> actually the first check is necessary
zpe has quit [Ping timeout: 246 seconds]
<pippijn> to establish an order on productions within the same non-terminal
adrien_oww has quit [Ping timeout: 268 seconds]
<pippijn> without semantic actions, search_pos takes 35% of the instructions (says valgrind)
adrien_oww has joined #ocaml
<ggole> pippijn: are the redundant loads you were talking about the load from glr.tables?
<ggole> If not, you could do that once at the head of the loop (since it never varies)
Kakadu has quit [Ping timeout: 250 seconds]
<pippijn> ggole: yes, but they don't matter
ollehar has joined #ocaml
<ggole> Mmm.
mort___ has joined #ocaml
adrien_oww has quit [Ping timeout: 260 seconds]
<pippijn> ggole: I did it anyway
AltGr has joined #ocaml
<pippijn> it's cleaner that way
<pippijn> the compare function and the search function both don't need the whole glr state
<pippijn> just the tables are enough
adrien_oww has joined #ocaml
<pippijn> it doesn't help performance at all
cyanure__ has quit [Ping timeout: 256 seconds]
<pippijn> I want lightweight option :)
ollehar has quit [Ping timeout: 256 seconds]
<pippijn> that's the only really ugly part now
<pippijn> let null : t = Obj.magic ()
ollehar has joined #ocaml
void64 has quit [Quit: Leaving]
ollehar has quit [Ping timeout: 240 seconds]
zpe has joined #ocaml
ollehar has joined #ocaml
zpe has quit [Ping timeout: 245 seconds]
<pippijn> ggole: I tried Array.unsafe_get for the array operations
<pippijn> 40% of the machine code is gone
<pippijn> (in that function)
<pippijn> 4% performance gain
<pippijn> CPUs are weird :\
<pippijn> I guess it's about branch prediction
<pippijn> the branch "out of bounds" is never taken and the branch prediction knows that
n06rin has joined #ocaml
demonimin has joined #ocaml
ben_zen has joined #ocaml
_andre has joined #ocaml
zpe has joined #ocaml
djcoin has quit [Ping timeout: 264 seconds]
talzeus has quit [Remote host closed the connection]
Neros has joined #ocaml
zpe has quit [Ping timeout: 245 seconds]
ollehar has quit [Ping timeout: 240 seconds]
ollehar has joined #ocaml
zpe has joined #ocaml
Kakadu has joined #ocaml
djcoin has joined #ocaml
ygrek has quit [Ping timeout: 256 seconds]
zpe has quit [Ping timeout: 246 seconds]
ollehar has quit [Ping timeout: 245 seconds]
breakds has joined #ocaml
n06rin has quit [Read error: Connection reset by peer]
n06rin has joined #ocaml
mort___ has quit [Ping timeout: 245 seconds]
ben_zen has quit [Ping timeout: 264 seconds]
mcclurmc has joined #ocaml
zpe has joined #ocaml
ben_zen has joined #ocaml
ontologiae has joined #ocaml
darkf has quit [Quit: Leaving]
eikke_ has joined #ocaml
zpe has quit [Ping timeout: 256 seconds]
eikke has quit [Ping timeout: 260 seconds]
ben_zen has quit [Quit: blarg school]
dezzy has quit [Ping timeout: 256 seconds]
yacks has joined #ocaml
dezzy has joined #ocaml
mcclurmc has quit [Quit: Leaving.]
talzeus has joined #ocaml
talzeus has quit [Remote host closed the connection]
talzeus has joined #ocaml
hkBst has quit [Quit: Konversation terminated!]
zpe has joined #ocaml
zpe has quit [Ping timeout: 264 seconds]
ollehar has joined #ocaml
ontologiae has quit [Ping timeout: 245 seconds]
Drup has joined #ocaml
zpe has joined #ocaml
ygrek has joined #ocaml
walter has quit [Read error: Connection reset by peer]
walter has joined #ocaml
zpe has quit [Ping timeout: 246 seconds]
saml has joined #ocaml
shinnya has joined #ocaml
zpe has joined #ocaml
zpe has quit [Ping timeout: 268 seconds]
legend303 has joined #ocaml
legend303 has left #ocaml []
walter has quit [Ping timeout: 260 seconds]
asmanur has quit [Ping timeout: 245 seconds]
asmanur has joined #ocaml
tane has joined #ocaml
ontologiae has joined #ocaml
walter has joined #ocaml
zpe has joined #ocaml
zpe has quit [Ping timeout: 264 seconds]
atn34 has joined #ocaml
atn34 has left #ocaml []
chambart has quit [Ping timeout: 245 seconds]
chambart has joined #ocaml
zpe has joined #ocaml
cago has left #ocaml []
zpe has quit [Ping timeout: 256 seconds]
everyonemines has joined #ocaml
turnersr has joined #ocaml
zpe has joined #ocaml
ttamttam has quit [Quit: ttamttam]
dezzy has quit [Read error: Connection reset by peer]
dezzy has joined #ocaml
zpe has quit [Remote host closed the connection]
yacks has quit [Ping timeout: 245 seconds]
walter has quit [Quit: This computer has gone to sleep]
dezzy has quit [Ping timeout: 268 seconds]
dezzy has joined #ocaml
yacks has joined #ocaml
djcoin has quit [Quit: WeeChat 0.4.0]
zpe has joined #ocaml
n06rin has quit [Quit: Leaving.]
LeNsTR has quit [Changing host]
LeNsTR has joined #ocaml
LeNsTR is now known as lenstr
AltGr has quit [Quit: Konversation terminated!]
<bernardofpc> Why is building lists with a tail-recursive function that does acc -> new::acc O(n^2) ?
zpe has quit [Ping timeout: 260 seconds]
<adrien_oww> hmm?
<ggole> It isn't
demonimin has quit [Ping timeout: 245 seconds]
<ggole> Building lists with a loop that does acc -> acc@[x] is
<ggole> The difference is ordering: to get the accumulator in the order of iteration, you have to List.rev at the end
<ggole> Some people get confused and think they should use append for that ordering
demonimin has joined #ocaml
dezzy has quit [Ping timeout: 256 seconds]
dezzy has joined #ocaml
<bernardofpc> ggole: adrien_oww : I had the same idea, but apparently the Gc is doing too much work
<ggole> That's not quadratic.
<bernardofpc> !
<ggole> The function, I mean: the runtime does seem to grow a bit non-linearly
<bernardofpc> Time quotients are [1.0, 3.0, 6.0, 10.5, 14.166666666666666, 21.5]
<ggole> You're using the native code compiler, I assume?
<bernardofpc> yes
<bernardofpc> I have tried to look into the .s, but I couldn't find where it would allocate n^2 memory
<bernardofpc> (the Gc.print_stat tells me that it has n^2 promoted_words)
<bernardofpc> which in itself is already a mistery to me
<ggole> Replace (n::acc) with (acc@[n]) to see real quadratic behaviour
<ggole> (You'll have to lower those counts.)
talzeus has quit [Read error: Connection reset by peer]
<wmeyer> hi
<ggole> Btw, bash hint: you can for i in {1..6}; do echo $((i * 1000)); done and make it much easier to change factors
<adrien_oww> o/
<adrien_oww> wmeyer: any news from the currently-pending patch? :D
* adrien_oww leaves for home :P
<bernardofpc> ggole: this is real quadratic behaviour
<bernardofpc> I'll try to find the Gc.print_stat numbers
<bernardofpc> What most confuses me is that it looks like quadratic allocation
<bernardofpc> where it should have been linear
<wmeyer> adrien_oww: apologises git svn stopped working for me, the patch is reviewed and just needs commiting
<ggole> Minor word counts scale linearly
ontologiae has quit [Ping timeout: 260 seconds]
<bernardofpc> (I used promoted and major words)
munga has joined #ocaml
<bernardofpc> I still don't understand how it allocates O(n^2)
<bernardofpc> there's no point in the code where the list gets duplicated, so it should have been O(n)
zpe has joined #ocaml
<ggole> It is O(n): look at the minor word counts
<ggole> That's the actual list storage
<bernardofpc> but where does it find O(n^2) for its major words ?
<bernardofpc> I mean, major have been minor sometime in the past, right ?
<ggole> Yeah
<ggole> And copying from the small amount in the minor heap shouldn't need to touch the existing list structure in the major heap
<ggole> Not sure what is going on there
<bernardofpc> yeah, a bit sad because already at 10k elements on a list it becomes visibly quadratic
<bernardofpc> (and before it's too small to care)
ygrek has quit [Ping timeout: 246 seconds]
zpe has quit [Ping timeout: 260 seconds]
skchrko has quit [Quit: Leaving]
<adrien> wmeyer: ah, crap, I have no excuse to postpone the other patches :D
<wmeyer> no no no, don't postpone will fix it today
<wmeyer> keep going, I will be fast, Damien is busy doing the release so there will be no commits to the build system hopefully
munga has quit [Quit: Ex-Chat]
<adrien> :D
Kakadu has quit [Quit: Page closed]
eikke_ has quit [Ping timeout: 245 seconds]
ollehar has quit [Ping timeout: 264 seconds]
zpe has joined #ocaml
ollehar has joined #ocaml
turnersr has quit [Ping timeout: 248 seconds]
turnersr has joined #ocaml
zpe has quit [Ping timeout: 248 seconds]
skchrko has joined #ocaml
everyonemines has quit [Quit: Leaving.]
Drup has quit [Ping timeout: 240 seconds]
rossberg has quit [Ping timeout: 240 seconds]
zpe has joined #ocaml
zpe has quit [Ping timeout: 256 seconds]
shinnya has quit [Ping timeout: 256 seconds]
<adrien> Alternatively, you could use the new syntax for string literals
<adrien> ({foo|....|foo}) now available in trunk.
<adrien> quoting Alain Frisch
<adrien> anyone has details about that?
zpe has joined #ocaml
<ggole> Eh? What's the rationale there?
<wmeyer> so, the whole description of the extension points branch is here: https://github.com/ocaml/ocaml/blob/trunk/experimental/frisch/extension_points.txt
<wmeyer> the other discussions that led to this design are on wg-camlp4 mailing list: http://lists.ocaml.org/pipermail/wg-camlp4/
zpe has quit [Ping timeout: 248 seconds]
ollehar has quit [Ping timeout: 264 seconds]
ollehar has joined #ocaml
mort___ has joined #ocaml
adrien_o1w has joined #ocaml
adrien_oww has quit [Ping timeout: 245 seconds]
alang has quit [Ping timeout: 245 seconds]
ggole has quit []
<adrien> 3ah, ok, thank
<adrien> s
<adrien> I was awar of extension points but not of some of the specifics
<adrien> wmeyer: also, the patch in bug 5887 needs some high-level review
<adrien> it's going to need an update before being applied but it needs at least a quick review
<adrien> (I'm too used to writing "bug 1234" because at work there's a bot which triggers on that on IRC and gives the corresponding entry in mantis along with the summary :P )
void64 has joined #ocaml
menace has joined #ocaml
<menace> will there be opam for ubuntu precise?
Snark has quit [Quit: leaving]
menace has left #ocaml []
tani has joined #ocaml
tane has quit [Disconnected by services]
tani is now known as tane
_andre has quit [Quit: leaving]
everyonemines has joined #ocaml
Simn has quit [Read error: Connection reset by peer]
Arsenik has quit [Remote host closed the connection]
void64 has quit [Ping timeout: 248 seconds]
mcclurmc has joined #ocaml
mcclurmc has quit [Read error: Connection reset by peer]
mcclurmc has joined #ocaml
mcclurmc has quit [Read error: Connection reset by peer]
mcclurmc has joined #ocaml
mcclurmc has quit [Read error: Connection reset by peer]
mcclurmc has joined #ocaml
mcclurmc has quit [Read error: Connection reset by peer]
mcclurmc has joined #ocaml
void64 has joined #ocaml
mcclurmc1 has joined #ocaml
mcclurmc has quit [Read error: Connection reset by peer]
Drup has joined #ocaml
mcclurmc1 has quit [Read error: Connection reset by peer]
rwmjones has quit [Ping timeout: 264 seconds]
mcclurmc has joined #ocaml
mcclurmc has quit [Read error: Connection reset by peer]
mcclurmc has joined #ocaml
mcclurmc1 has joined #ocaml
mcclurmc has quit [Read error: Connection reset by peer]
mcclurmc1 has quit [Remote host closed the connection]
testcocoon has quit [Quit: Coyote finally caught me]
tane has quit [Quit: Verlassend]
testcocoon has joined #ocaml
everyonemines has left #ocaml []
everyonemines has joined #ocaml
rwmjones has joined #ocaml
void64 has quit [Ping timeout: 248 seconds]
void64 has joined #ocaml
willb1 has quit [Ping timeout: 245 seconds]
chambart has quit [Ping timeout: 245 seconds]
void64 has quit [Ping timeout: 276 seconds]
willb1 has joined #ocaml
demonimin has quit [Ping timeout: 245 seconds]
Drup1 has joined #ocaml
demonimin has joined #ocaml
Drup has quit [Ping timeout: 260 seconds]
void64 has joined #ocaml
Obfuscate has quit [Ping timeout: 246 seconds]
skunkwerks has joined #ocaml
Obfuscate has joined #ocaml
void64 has quit [Quit: Leaving]
void64 has joined #ocaml
gbluma has quit [Remote host closed the connection]
void64 has quit [Ping timeout: 245 seconds]
structuralist has joined #ocaml
thomasga has quit [Quit: Leaving.]
void64 has joined #ocaml
mort___ has quit [Quit: Leaving.]
demonimin_ has joined #ocaml
demonimin has quit [Ping timeout: 260 seconds]
void64 has quit [Ping timeout: 264 seconds]
structuralist has quit []
ben_zen has joined #ocaml
void64 has joined #ocaml
ollehar has quit [Ping timeout: 248 seconds]
walter|r has joined #ocaml
everyonemines has quit [Ping timeout: 245 seconds]
tchell has quit [Read error: Operation timed out]
walter|r has quit [Read error: Connection reset by peer]
pango has quit [Ping timeout: 246 seconds]
walter|r has joined #ocaml
tchell has joined #ocaml
tchell has quit [Ping timeout: 256 seconds]