lapinou changed the topic of #ocaml to: Discussions about the OCaml programming language | http://caml.inria.fr/ | http://www.ocaml.org | OCaml 4.01.0 announce at http://bit.ly/1851A3R | Public logs at http://tunes.org/~nef/logs/ocaml/
arjunguha has joined #ocaml
kyrylo has quit [Ping timeout: 272 seconds]
watermind has joined #ocaml
Anarchos has quit [Quit: Vision[0.9.7-H-20131020]: i've been blurred!]
arjunguha has quit [Quit: Textual IRC Client: www.textualapp.com]
ollehar has joined #ocaml
jwatzman|work has quit [Quit: jwatzman|work]
yellowfish has joined #ocaml
ggherdov has quit [Ping timeout: 265 seconds]
BiDOrD_ has quit [Read error: Connection reset by peer]
BiDOrD has joined #ocaml
NaCl has quit [Ping timeout: 265 seconds]
NaCl has joined #ocaml
NaCl has quit [Changing host]
NaCl has joined #ocaml
dsheets has joined #ocaml
ggherdov has joined #ocaml
ygrek has joined #ocaml
zpe has quit [Remote host closed the connection]
zpe has joined #ocaml
zpe_ has joined #ocaml
zpe has quit [Read error: Connection reset by peer]
mreca has quit [Quit: My MacBook has gone to sleep. ZZZzzz…]
zpe_ has quit [Remote host closed the connection]
zpe has joined #ocaml
dsheets has quit [Quit: Leaving]
dsheets has joined #ocaml
dsheets has quit [Read error: Connection reset by peer]
dsheets_ has joined #ocaml
zpe has quit [Ping timeout: 248 seconds]
watermind has quit [Quit: Konversation terminated!]
ontologiae has quit [Ping timeout: 260 seconds]
<bernardofpc> humpf list.combine is giving me stack overflow
<bernardofpc> (or so it seems)
shinnya has quit [Ping timeout: 245 seconds]
sagotch has quit [Ping timeout: 246 seconds]
thomasga has quit [Quit: Leaving.]
zpe has joined #ocaml
yellowfish has quit [Ping timeout: 248 seconds]
zpe has quit [Ping timeout: 272 seconds]
wolfnn has quit [Ping timeout: 248 seconds]
ollehar has quit [Ping timeout: 246 seconds]
sheijk has quit [Quit: .]
yacks has joined #ocaml
zpe has joined #ocaml
zpe has quit [Ping timeout: 265 seconds]
philtor has quit [Ping timeout: 245 seconds]
zpe has joined #ocaml
zpe has quit [Ping timeout: 260 seconds]
yacks has quit [Ping timeout: 245 seconds]
ygrek has quit [Ping timeout: 265 seconds]
struktured has joined #ocaml
Dongyancai has quit [Quit: leaving]
mreca has joined #ocaml
zpe has joined #ocaml
zpe has quit [Remote host closed the connection]
zpe has joined #ocaml
struktured has quit [Ping timeout: 250 seconds]
zpe has quit [Ping timeout: 246 seconds]
ggole has joined #ocaml
shinnya has joined #ocaml
ggole has quit [Read error: Connection timed out]
ggole has joined #ocaml
yacks has joined #ocaml
ygrek has joined #ocaml
codygman has joined #ocaml
<codygman> Hi! I plan on learning ocaml in the future and just had a very shallow syntax question. Why so many "let" bindings for variables? Are they required? Is this annoying for you personally? For instance in this code: http://www.ffconsultancy.com/languages/ray_tracer/comparison.html
axiles has joined #ocaml
<ggole> let is how bindings are established in ocaml
<ggole> It's a little wordy, but I don't personally mind it.
<pippijn> "However, note that the C++ implementation has been optimised by using pass by reference for structs. In contrast, the OCaml implementation is unoptimised."
<pippijn> yes, and ocaml passes everything "by reference"
<pippijn> because there are no value types besides some small word-sized types
<pippijn> I don't like this page
<ggole> It's Harrop, just ignore it.
<pippijn> ah
yellowfish has joined #ocaml
<ggole> Neither implementation is much good anyway
<ggole> (In terms of speed.)
<pippijn> yeah
Kakadu has joined #ocaml
<r0bgleeson> that code is freaky
pango_ has quit [Remote host closed the connection]
mreca has quit [Quit: Textual IRC Client: www.textualapp.com]
<codygman> ggole, pippijn, r0bgleeso thank you.
FreeArtMan has joined #ocaml
Simn has joined #ocaml
FreeArtMan has quit [Read error: Operation timed out]
caseyjames has quit [Quit: Page closed]
yacks has quit [Read error: Operation timed out]
FreeArtMan has joined #ocaml
FreeArtMon has joined #ocaml
FreeArtMan has quit [Ping timeout: 272 seconds]
FreeArtMon has quit [Read error: Operation timed out]
lostcuaz has joined #ocaml
yellowfish has quit [Ping timeout: 245 seconds]
Anarchos has joined #ocaml
angerman has joined #ocaml
talzeus has joined #ocaml
FreeArtMon has joined #ocaml
talzeus_ has joined #ocaml
talzeus has quit [Read error: Connection reset by peer]
pango has joined #ocaml
talzeus has joined #ocaml
talzeus_ has quit [Ping timeout: 265 seconds]
ulfdoz has joined #ocaml
talzeus has quit [Ping timeout: 245 seconds]
ollehar has joined #ocaml
sagotch has joined #ocaml
<bernardofpc> is there any way to write (in OCaml) Array.combine that gives a zero-length vector of the right type ?
<flux> bernardofpc, what gives you the problem?
<flux> just let combine xs ys = Array.mapi (fun i x -> (x, ys.(i))) xs;;
<flux> (barring the case with different sizes)
<flux> combine [||] [||] will return type ('_a * '_b) array, which is ok, '_a will and '_b will be found later
ollehar has quit [Ping timeout: 246 seconds]
olasd has quit [Ping timeout: 252 seconds]
olasd has joined #ocaml
pminten has joined #ocaml
kyrylo has joined #ocaml
sagotch has quit [Remote host closed the connection]
Thooms has joined #ocaml
Yoric has joined #ocaml
avsm has joined #ocaml
Yoric has quit [Ping timeout: 265 seconds]
avsm has quit [Quit: Leaving.]
kyrylo has quit [Changing host]
kyrylo has joined #ocaml
Anarchos has quit [Quit: Vision[0.9.7-H-20131020]: i've been blurred!]
kyrylo has quit [Quit: Viva la revolucion!]
kyrylo has joined #ocaml
ulfdoz has quit [Ping timeout: 248 seconds]
<companion_cube> codygman: let bindings aren't annoying at all to me
yacks has joined #ocaml
ulfdoz has joined #ocaml
avsm has joined #ocaml
sagotch has joined #ocaml
NoNNaN has quit [Remote host closed the connection]
sagotch has quit [Ping timeout: 245 seconds]
avsm has quit [Quit: Leaving.]
sagotch has joined #ocaml
sagotch has quit [Remote host closed the connection]
ygrek has quit [Ping timeout: 248 seconds]
angerman has quit [Quit: Bye]
ontologiae has joined #ocaml
<bernardofpc> flux: that's an asymetric use of mapi that escaped me ;-)
* ggole wonders, again, why there isn't an Array.map2
<companion_cube> the stdlib doesn't contain much, remember
<ggole> I remember that each time I look at the stdlib :/
<companion_cube> batteries contains Array.map2 ;)
gustav has quit [Ping timeout: 252 seconds]
<ggole> Yeah, batteries has lots of the stuff I bitch about the stdlib lacking...
<ggole> I should probably use it.
gustav has joined #ocaml
<bernardofpc> oh dear
<bernardofpc> I have to do Array.to_list (combine (map f ax) (map f ay))
<bernardofpc> depending on the length of ax, it is better to do just so (if length big enough, I guesS)
<bernardofpc> however, if the length is small (like <= 30k) I'm better off using a handwritten fold with accumulator for the list + List.rev
<bernardofpc> even point seem s to be around 100k
ia0 has quit [Quit: leaving]
<companion_cube> benchmark first? :)
<ggole> Seems hard to believe that creating a temp array and converting it to a list could be better than just creating the list.
<bernardofpc> companion_cube: benchmark result
<ggole> Also, it's an array: unless f has side effects, you can create the list in proper order directly.
<bernardofpc> maybe my benchmark sucks
<bernardofpc> run with ./array_combine.native 100000 50, then 300000 10 then 3000 1000
<bernardofpc> (then 300 10000 for fun...)
<ggole> Something like let map_2arrays_to_list f a1 a2 = let rec loop bound i acc = if i = bound then acc else loop bound (i + 1) (f a1.(i) a2.(i)::acc) in loop (Array.length a1) 0 []
<ggole> Er, wrong way around.
<companion_cube> you really should use a benchmarking lib ;)
<ggole> let map_2arrays_to_list f a1 a2 = let rec loop i acc = if i < 0 then acc else loop (i - 1) (f a1.(i) a2.(i)::acc) in loop (Array.length a1 - 1) []
<bernardofpc> mhn, I do have a list.rev too much in my code
<bernardofpc> (that's the problem of having a commutative function eat the result of my lxy)
<bernardofpc> ggole: that was it
kyrylo has quit [Ping timeout: 272 seconds]
jao has joined #ocaml
<bernardofpc> companion_cube: what do you mean by "a benchmarking lib" ?
jao has quit [Changing host]
jao has joined #ocaml
bnwr has joined #ocaml
kyrylo has joined #ocaml
pminten has quit [Quit: Leaving]
NoNNaN has joined #ocaml
ollehar has joined #ocaml
struktured has joined #ocaml
ia0 has joined #ocaml
arj has joined #ocaml
jao has quit [Ping timeout: 245 seconds]
kamatara has joined #ocaml
kamatara has quit [Client Quit]
kamatara has joined #ocaml
darkf has quit [Quit: Leaving]
gargaml has joined #ocaml
ygrek has joined #ocaml
wolfnn has joined #ocaml
struktured has quit [Ping timeout: 246 seconds]
yacks has quit [Quit: Leaving]
kyrylo has quit [Ping timeout: 248 seconds]
sagotch has joined #ocaml
kyrylo has joined #ocaml
ulfdoz has quit [Ping timeout: 250 seconds]
FreeArtMon has quit [Quit: main.lv]
tvn__ has quit [Quit: Leaving]
ulfdoz has joined #ocaml
Eyyub has joined #ocaml
kyrylo has quit [Ping timeout: 245 seconds]
pango has quit [Remote host closed the connection]
kyrylo has joined #ocaml
pango has joined #ocaml
Thooms has quit [Remote host closed the connection]
Thooms has joined #ocaml
kyrylo has quit [Ping timeout: 245 seconds]
kyrylo has joined #ocaml
gargaml has quit [Ping timeout: 245 seconds]
tnguyen1 has joined #ocaml
tnguyen1 has quit [Client Quit]
tnguyen_ has joined #ocaml
philtor has joined #ocaml
r0bgleeson is now known as livewire
livewire is now known as livewire1
livewire1 has quit [Quit: WeeChat 0.4.2]
livewire1 has joined #ocaml
struktured has joined #ocaml
FreeArtMan has joined #ocaml
watermind has joined #ocaml
kamatara has quit [Remote host closed the connection]
zpe has joined #ocaml
kamatara has joined #ocaml
zpe has quit [Remote host closed the connection]
zpe has joined #ocaml
zpe has quit [Ping timeout: 245 seconds]
<struktured> hi, any body know of a way to pass a tuple to a type constructor without having to destructure it? eg. type TUPLE = TUPLE of int * string; let val = (5,"hi") in TUPLE val gets a compiler error. I must do let (a,b) = (5,"hi") in TUPLE (a, b) instead
<struktured> sorry, the type itself should be called "tuple"
<companion_cube> I don't think you can, sadly :/
<struktured> companion_cube: I suppose records are an alternative paproach for this
<companion_cube> records are nice, indeed
<struktured> companion_cube: type TUPLE of some_record_type should work
<struktured> companion_cube: guess I'll just switch to a record for my representation here, not really a problem
<companion_cube> if you only have one case, why not use the record directly?
<struktured> companion_cube: I have more than one, this isn't my actual code which is more more complex
<Drup> struktured: type tuple of Tuple of (int * string)
<companion_cube> ah, ok
<Drup> add the paranthesis
<struktured> what is the distinction from the type system level?
<Drup> I think it's for efficiency reasons
<struktured> interesting, thanks
<kamatara> struktured, you can create a method which take a tuple and apply the constructor to the destroyed value
<Drup> one used boxed element, the other is not
<Drup> do not*
<struktured> kamatara: I don't understand your approach but it also sounds interesting.
<Drup> struktured: if you write your constructor in GADT style, this weird behavior disappear
<struktured> ok, will look int that too. thanks for all the tips guys. very helpful
<Drup> struktured: "type tuple = Tuple int * string" = "type tuple = Tuple : int -> string -> tuple"
<kamatara> struktured, you have one function which do that, and everywhere you call it, like that if you change your type to have only one argument (a tuple) and not two, you just change that function
<Drup> struktured: "type tuple = Tuple (int * string)" = "type tuple = Tuple : (int * string) -> tuple"
<struktured> kamatara: got it
<Drup> hum, actually, you can't really write the first version, my bad
<Drup> the syntax for constructor is not very good :/
NoNNaN has quit [Ping timeout: 240 seconds]
kamatara has quit [Quit: Leaving]
kamatara has joined #ocaml
kamatara has quit [Remote host closed the connection]
kamatara has joined #ocaml
sgnb has quit [Ping timeout: 256 seconds]
kamatara has quit [Client Quit]
kamatara has joined #ocaml
<ggole> Is it a syntax problem? I thought that was the usual optimisation hack.
NoNNaN has joined #ocaml
<Drup> ggole: I find it weird that tuples are currified, that's all
struktured has quit [Ping timeout: 246 seconds]
<ggole> I'm not sure what you mean.
<Drup> and yes, it's the usual optimisation hack, but it's not very nice to have an optimisation hack by adding paranthesis, which are usually a neutral element
<ggole> Oh yeah, that's ugly.
<Drup> s/tuples/constructors/
<Drup> it would be less ugly if constructors types looked like a function
<kamatara> Drup, haskell is your friend :)
kamatara has quit [Quit: Leaving]
<arj> anyone knows of a ocaml-gnupg binding?
kamatara has joined #ocaml
<Drup> kamatara: I know, haskell did that part right
<kamatara> yes, and the function for each field member <3
<companion_cube> you'd actually need a lense for each record field
<kamatara> a lense?
<Drup> arj: not that I know of
<companion_cube> lens*
<kamatara> what can we do with a lens?
<kamatara> except replace glass?
<arj> kamatara: lens as in "accessor" of a field in a structure
<arj> sort of.
<kamatara> i could write a function, it never took time
<arj> Drup: thx.
<ggole> The idea is to abstract over them.
<companion_cube> and compose them
<ggole> So you can express, say, "add one to a field and subtract another field and put that into this other field" without reference to any particular concrete record.
<companion_cube> kamatara: since you like haskell, try taking a look at #haskell, they'll explain lenses to you ;)
<kamatara> is it a code generator?
<ggole> No, it's just abstraction.
<kamatara> because I know how to extend law over functions
<kamatara> there is always an hidden (co?)monad
ontologiae has quit [Ping timeout: 245 seconds]
<ggole> Right, although I 'm not sure it's particularly hidden in Haskell
<kamatara> ggole, there are hidden monads everywhere (and especially in Haskell)
<companion_cube> I'm not sure lens is especially monadic, but it's quite powerful apparently
<Drup> and quite filled of weird operators
Thooms has quit [Quit: WeeChat 0.3.8]
<flux> when I'm making an OCaml library (.cma), the final step would be ocamkmklib, right?
<flux> (I want to have both OCaml and C code in it)
Thooms has joined #ocaml
<adrien> iirc, yes
<flux> I wonder how I suggest ocamlbuild to do that then :)
<flux> I guess I need to look at the only example about this, cryptolib, and reverse it from there..
<flux> wish there was a -minimal- example, not a maximal one :)
<adrien> it doesn't do it?
<adrien> or
<adrien> flux: just use oasis for that task
<adrien> ocamlbuild can handle it but you're better with a more complete myocamlbuild.ml
<flux> I guess I could, given I don't want to use the ocamlbuild's include-feature here
<adrien> I've found many issues, bugs and shortcomings in ocamlbuild for C bindings
<adrien> that's the reason cowboy uses OCamlMakefile and not ocamlbuild actually
kyrylo has quit [Read error: Operation timed out]
<flux> done, my first oasis library with c bindings and took 8 minutes from zero to finish apparently
<flux> (my first own oasis project altogether as well)
<flux> so oasis has some promise :)
<companion_cube> nice!
ygrek has quit [Ping timeout: 246 seconds]
<adrien> :)
<flux> I just used old bindings I had embedded in a project of mine, because I need to use them in another project
<flux> a particular feature it has is that it is able to decode the almost-jpeg-files from webcams
zpe has joined #ocaml
Eyyub has quit [Ping timeout: 272 seconds]
<flux> it doesn't work the way I like when I'm _tags including it below another project though :(
<adrien> hmm, what do you mean?
ontologiae has joined #ocaml
<flux> well, it tries to compile the v4l2.cmo directly I see
<flux> it doesn't use the v4l2.cma which brings in the C code and -ljpeg
<adrien> doesn't sound like a very good idea with ocamlbuild
<adrien> maybe you can exclude the other directories?
<flux> if I do ocamlbuild -use-ocamlfind OCamlV4l2/v4l2.cma it does produce that file properly
<flux> yes, there is probably a way.. there always is with ocamlbuild ;-)
zpe has quit [Ping timeout: 272 seconds]
<companion_cube> if you need to use it in other projects, I suggest using ocamlfind
<companion_cube> packaging/installing with oasis is ridiculously easy
<adrien> :)
<flux> I don't want people or me needing to git clone this, then install a few packages to the system, then build the program
<flux> I just want it to work in one go
<adrien> you can install locally
<flux> and it worked fine with another library, without C code though :)
<flux> I also want to modify the library while I'm develing this piece
<adrien> ah :)
<adrien> installing (not by hand, in a Makefile) should work fine for a couple libs
<flux> it can also be I have another project which uses an older version of the library
<flux> seems quite inelegant to always install different versions of a library, depending on what I'm going to compile next..
<flux> maybe I can compile it in as a more traditional submodule
<adrien> no, I meant, installing locally
<flux> ok, so under projectname/ocamlfind?
<adrien> mkdir -p /tmp/ocaml-fileutils-install
<adrien> OCAMLFIND_DESTDIR=/tmp/ocaml-fileutils-install make install
<adrien> whereever you want
<adrien> (whenever, wherever)
<adrien> (I need some reste)
<adrien> rest*
<flux> integrating that into ocamlbuild.. well, I have build.sh already in place..
<flux> it'll probably end up reinstalling the submodule always, not only when it is changed
ggole has quit []
<adrien> it's common to have a "Makefile" which simply calls "ocamlbuild longlistofarguments" or similar commands
<adrien> because "make" is so much shorter to type :P
<flux> hmm, I think it used to be that if I did ocamlbuild main.native then main.byte symbolic link would disappear and vice versa
<flux> but now it seems to stay in place
<flux> that was my reason for not using make, as it doesn't really integrate well with make's targets
<flux> (or 'didn't')
<adrien> the symlink doesn't get removed nowadays? \o/
<flux> :)
<flux> just tried it out, it doesn't get removed
Eyyub has joined #ocaml
<flux> probably too much trouble to make ocamlbuild do the sub-installation
sagotch has quit [Remote host closed the connection]
ontologiae has quit [Ping timeout: 252 seconds]
rks has quit [Killed (hubbard.freenode.net (Nickname regained by services))]
rks_ has joined #ocaml
Don_Pellegrino has joined #ocaml
Arsenik has joined #ocaml
<flux> well, I think this is hardly optimal. to make it as smooth as with plain ocamlbuild I now oasis setup, configure, build, install
<flux> which of course produces a ton of diagnostics
<flux> so more scripting..
<adrien> =/
Yoric has joined #ocaml
Yoric has quit [Ping timeout: 265 seconds]
mreca has joined #ocaml
kamatara has quit [Quit: Leaving]
Yoric has joined #ocaml
axiles has quit [Remote host closed the connection]
sorethroat has joined #ocaml
kyrylo has joined #ocaml
Arsenik has quit [Remote host closed the connection]
tobiasBora has joined #ocaml
arjunguha has joined #ocaml
arjunguha has quit [Client Quit]
<flux> hmm, so opam says "ocaml setup.ml -configure --prefix /home/flux/ocaml/.opam/system --enable-lablgtk2" and it works fine, yet if I enter the same command myself after extracting the same archive, I get an error that "sh: 1: cannot open lablgtk2: No such file" and "ERROR: Install the development files for lablgtk2 (e.g. the liblablgtk2-ocaml-dev package for Debian)."
kyrylo has quit [Ping timeout: 250 seconds]
<flux> some sort of glitch or fixed bug, worked with a more recent extracted archive..
kyrylo has joined #ocaml
<adrien> what?
<adrien> setup.ml in lablgtk sources?
sorethroat has quit [Ping timeout: 250 seconds]
<flux> yeah
<flux> but I couldn't quite understand how opam was able to run it. maybe it uses /bin/sh whereas my $SHELL is zsh..
<adrien> there is no setup.ml in lablgtk sources
<livewire1> is gtk and ocaml popular?
<Drup> Sure. :D
<flux> oh sorry, not in lablgtk but cairo
<adrien> flux: or it's something which depends on lablgtk?
<adrien> ah, right, ok
<adrien> (cairo2 actually I guess)
<livewire1> cool, it seems people use them together in this channel often but that could be a coincidence.
<adrien> flux: well, do you have the script named "lablgtk2"?
<flux> adrien, the script named lablgtk2?
<flux> ah, I do
<adrien> hmm
<adrien> then
<Drup> livewire1: well, it also happens that the gtk binding is the more solid among gui bindings in ocaml
<adrien> strace -tt -f -o log "ocaml setup.ml -configure --prefix /home/flux/ocaml/.opam/system --enable-lablgtk2
<adrien> :D
<adrien> you have ocaml-efl too now ;-)
<adrien> (axiles has done an incredible job)
<livewire1> yeah, just never wrote any GUI applications myself
<Drup> adrien : the documentation is ... sparse
<adrien> it's enlightenment
<adrien> they're "light" even for the doc :P
<adrien> but, yeah, you need to know EFL already I guess
<Drup> be enlighted, god will give you ghe documentation
<Drup> the*
<adrien> even god doesn't have that one :P
<flux> adrien, I resolved the issue (of installing hacked cairo2) by doing the same steps after a new opam install so it's probably gone now :)
<adrien> heh, ok
ousado has joined #ocaml
<flux> in any case, it seems the cairo bindings miss a binding to a critical function, meh.
ousado_ has quit [Ping timeout: 272 seconds]
mcclurmc has joined #ocaml
mreca has quit [Quit: My MacBook has gone to sleep. ZZZzzz…]
<flux> it even implements it, but doesn't export it
<adrien> open a bug about it; cairo2's upstream is very very reactive
ulfdoz has quit [Ping timeout: 248 seconds]
<flux> finally got it working though. I should file a bug report yes, otherwise it'll be annoying for people to compile this :) (well, for me as well in the future)
<flux> maybe "active" is an overstatement, last release is from Oct12 and 3 bugs in the tracker ever?
Yoric has quit [Ping timeout: 265 seconds]
<flux> apparently requires making an account before a bug can be filed.. it can wait a moment.
Thooms has quit [Ping timeout: 246 seconds]
FreeArtMan has quit [Ping timeout: 272 seconds]
<Drup> last time I had a bug, I just send a mail to christophe troestler, he answered and released a new version reasonably quickly
<Drup> flux: since then, the code moved to github : https://github.com/Chris00/ocaml-cairo
<flux> argh
<flux> I just sent the issue ;-)
<flux> but so it says in the front page
<flux> apparently google is not yet of the same opinion
<flux> but, sleepy time
Kakadu has quit [Quit: Konversation terminated!]
sorethroat has joined #ocaml
keithflower has joined #ocaml
arj has quit [Quit: Leaving.]
mreca has joined #ocaml
darkf has joined #ocaml
rgrinberg1 is now known as rgrinberg
lostcuaz has quit [Quit: My MacBook has gone to sleep. ZZZzzz…]
mcclurmc has quit [Remote host closed the connection]
Eyyub has quit [Ping timeout: 246 seconds]
mcclurmc has joined #ocaml
mcclurmc has quit [Remote host closed the connection]
WraithM has quit [Ping timeout: 265 seconds]
madroach has quit [Ping timeout: 252 seconds]
madroach has joined #ocaml
livewire1 has quit [Quit: brb]
livewire1 has joined #ocaml
teiresias has quit [Quit: leaving]
teiresias has joined #ocaml
WraithM has joined #ocaml
sorethroat has quit [Ping timeout: 260 seconds]