cjeris changed the topic of #ocaml to: Discussions about the OCaml programming language | http://caml.inria.fr/
postalchris has joined #ocaml
dark_light has joined #ocaml
jlouis_ has joined #ocaml
jlouis has quit [Read error: 110 (Connection timed out)]
hcarty has left #ocaml []
hcarty has joined #ocaml
hcarty has quit ["leaving"]
shawn has quit [Read error: 113 (No route to host)]
hcarty has joined #ocaml
dark_light has quit [Read error: 104 (Connection reset by peer)]
magnus_ has joined #ocaml
jkeith has joined #ocaml
<jkeith> has any one made a useful application with ocaml?
<Smerdyakov> Now what kind of question is that?
<Smerdyakov> Do you mean only people here?
<jkeith> correct
<mbishop> I made a slightly useful one for myself
<jkeith> I'm still fuzzy as to whether ocaml is useful for anything beyond learning
<mbishop> hardly, ocaml interfaces well with C, and with Unix, and can be used for numerous "useful" things
<jkeith> would it be accurate to view as a scripting language for C?
<mbishop> jkeith: see http://caml.inria.fr/about/successes.en.html as well
<tsuyoshi> I did a japanese-english dictionary in ocaml
<jkeith> how does the execution speed compare to that of other languages?
<tsuyoshi> working on a fundraising database right now
<tsuyoshi> jkeith: it's about half the speed of c
<jkeith> FWIW, I'm in no way bashing on ocaml, I'm just curious
<tsuyoshi> faster than anything else afaik
<Smerdyakov> jkeith, yes. Almost everyone who has used a language in the ML family agrees that they're the best general purpose programming languages today.
<Smerdyakov> tsuyoshi, SML has a considerable runtime performance advantage over OCaml ATM, thanks to MLton.
<jkeith> so it's slower than java, but faster than say perl?
<jkeith> (assuming good program design)
<mbishop> I doubt it's slower than java
<tsuyoshi> slower than java? I don't think so...
<Smerdyakov> jkeith, no, the native code OCaml compiler produces binaries considerably faster than any Java compiler I know of.
<tsuyoshi> definitely faster than perl
<jkeith> tsuyoshi: if it's half the speed of C, it's slower than java ;)
<mbishop> It's faster than any "scripting" language
<tsuyoshi> hah.. which java compiler gives that kind of speed?
<jkeith> tsuyoshi: sun's jvm's from 1.5 and later
<tsuyoshi> well, I am skeptical of that.. but ocaml is pretty fast
<Smerdyakov> Still, if you care about performance, you should probably choose SML over OCaml.
<mbishop> I've seen ocaml code that was faster than it's C++ counter part, but I hear they are about even in speed, typically
<jkeith> Smerdyakov: I was more concerned about something as slow as say python or ruby
<Smerdyakov> jkeith, languages don't have speeds. It happens that those languages have single popular implementations, but that's not always the case.
<mbishop> Indeed, Smerdyakov's statement is true, as shown by Scheme, and the "Stalin" compiler
<jkeith> hmmmm, well, it looks like it's worth learning
<jkeith> thank you for putting up with my questions :)
<jkeith> is caml light a scripting language, or just a subset of ocaml?
<tsuyoshi> it's a subset
<tsuyoshi> I think it's just missing the class system.. and maybe labels?
<Smerdyakov> No. It's a completely impractical predecessor frozen in time and used in French university classes only. It is missing a wide variety of important aspects of a "real" language.
<jkeith> Smerdyakov: so you would recommend I just plonk down into ocaml?
<Smerdyakov> jkeith, I recommend SML instead.
<jkeith> http://www.smlnj.org/ <---this one?
<Smerdyakov> It's a much more principled language while also having a better optimizing compiler.
<Smerdyakov> That's one SML compiler.
* Smerdyakov leaves.
<jkeith> ok, thank you for your time
<jkeith> any recommendations on an editor besides emacs?
<mbishop> emacs
<mbishop> :)
<jkeith> yeah, I'm not really a big emacs fan ;)
twobitsprite has joined #ocaml
<jkeith> ooooh, it handles gc for you
<twobitsprite> if you were writing an ocaml app, but you wanted to have a scripting inteface to it, what would you use?
<mbishop> scheme? :)
<twobitsprite> or maybe a plugin kind of system... being as ocaml can't dynamically load modules
<twobitsprite> hmm... not sure if I want to use scheme
<twobitsprite> but something functional would be nice
<mrvn> How about ocaml?
<twobitsprite> I thought ocaml couldn't dynamically load modules...?
<twobitsprite> or, would you just ship a bytecode interpreter with it and use that?
<mrvn> so?
<mrvn> If you use bytecode you get the interpreter for free
<twobitsprite> mrvn: I mean, if there's a way to do it, I would love that...
<twobitsprite> well... I'd like for my app to be natively compiled...
<mrvn> Then chek how the interactive ocaml does it.
<twobitsprite> what's the performance impact like for using bytecode vs. native?
<twobitsprite> mrvn: you mean, with ocamlmktop?
<mbishop> I think I saw something about JIT for ocaml bytecode the other day
<mrvn> Yeah, like that.
<mrvn> Except you have to start your app instead of going into interactive mode.
<twobitsprite> mrvn: I would prefer to be able to load at run time...
<mrvn> You can load scripts at runtime
<twobitsprite> hmm... would it be possble to have load a module via marshal..?
<mrvn> you can load it in as script and run it as bytecode
<twobitsprite> er... I guess you would have to know the types before hand...
<twobitsprite> from a compiled app?
<mrvn> if you make an ocamltop with the interpreter
<mrvn> Somehow it is doing exactly that already so look at it.
<twobitsprite> yeah, I'll have to check that out
<twobitsprite> according to the Makefile in the ocaml src, it looks like the toplevel is byte-code compiled... not native
Mr_Awesome has joined #ocaml
G has quit [Remote closed the connection]
G has joined #ocaml
magnus_ has left #ocaml []
hsfb has joined #ocaml
dark_light has joined #ocaml
hsfb has quit ["ERC Version 5.2 stable pre-release (IRC client for Emacs)"]
hsfb has joined #ocaml
hsfb has left #ocaml []
pango_ has quit [Remote closed the connection]
pango_ has joined #ocaml
Nutssh has joined #ocaml
skal_ has joined #ocaml
Submarine has joined #ocaml
postalchris has quit ["Leaving."]
skal has quit [Read error: 110 (Connection timed out)]
mwc has joined #ocaml
Smerdyakov has quit ["Leaving"]
Riesz has joined #ocaml
<tsuyoshi> there is a scheme implementation for ocaml
<tsuyoshi> it was functional but it didn't seem like it was actively being worked on, last time I looked
Nutssh has quit ["Client exiting"]
<mrvn> Scheme is like 5 or 6 pages specs. You can implement them in a day.
<mbishop> check reddit, pretty sure I posted a link to a few scheme's in ocaml there
mwc has quit ["Leaving"]
Nutssh has joined #ocaml
Submarine has quit [Remote closed the connection]
Morphous has joined #ocaml
benny has quit [Read error: 110 (Connection timed out)]
Morphous_ has joined #ocaml
Amorphous has quit [Nick collision from services.]
Morphous_ is now known as Amorphous
Morphous has quit [Read error: 110 (Connection timed out)]
pango_ has quit [Remote closed the connection]
pango_ has joined #ocaml
bluestorm_ has joined #ocaml
eradman has quit [zelazny.freenode.net irc.freenode.net]
eradman has joined #ocaml
ulfdoz has quit [zelazny.freenode.net irc.freenode.net]
ulfdoz has joined #ocaml
ulfdoz has quit [zelazny.freenode.net irc.freenode.net]
slipstream has quit [Dead socket]
slipstream has joined #ocaml
pedro_soc has joined #ocaml
ulfdoz has joined #ocaml
jlouis_ has quit [Remote closed the connection]
screwt8 has quit [Remote closed the connection]
_JusSx_ has joined #ocaml
Mr_Awesome has quit ["...and the Awesome level drops"]
ulfdoz has quit [zelazny.freenode.net irc.freenode.net]
screwt8 has joined #ocaml
ulfdoz has joined #ocaml
bsmith has quit ["Reconnecting"]
bsmith has joined #ocaml
kig has joined #ocaml
ulfdoz has quit [zelazny.freenode.net irc.freenode.net]
ulfdoz has joined #ocaml
ulfdoz has quit [zelazny.freenode.net irc.freenode.net]
ulfdoz has joined #ocaml
ulfdoz has quit [Read error: 54 (Connection reset by peer)]
ulfdoz has joined #ocaml
slipstream-- has joined #ocaml
ulfdoz has quit [zelazny.freenode.net irc.freenode.net]
ulfdoz has joined #ocaml
ulfdoz has quit [zelazny.freenode.net irc.freenode.net]
slipstream has quit [Read error: 110 (Connection timed out)]
TaXules has joined #ocaml
ulfdoz has joined #ocaml
slipstream-- has quit [zelazny.freenode.net irc.freenode.net]
cmvjk has quit [zelazny.freenode.net irc.freenode.net]
tsuyoshi has quit [zelazny.freenode.net irc.freenode.net]
Demitar has quit [zelazny.freenode.net irc.freenode.net]
slipstream-- has joined #ocaml
cmvjk has joined #ocaml
tsuyoshi has joined #ocaml
Demitar has joined #ocaml
ulfdoz has quit [zelazny.freenode.net irc.freenode.net]
benny has joined #ocaml
bsmith has quit [Read error: 110 (Connection timed out)]
bluestorm_ has quit ["Konversation terminated!"]
Sparkles has joined #ocaml
Sparkles has quit [Client Quit]
ulfdoz has joined #ocaml
joshcryer has quit [Client Quit]
gim has joined #ocaml
screwt8 has quit [Read error: 104 (Connection reset by peer)]
dss has joined #ocaml
screwt8 has joined #ocaml
dss has quit [Read error: 113 (No route to host)]
pstickne_ has quit [Connection timed out]
Sparkles has joined #ocaml
screwt8 has quit [Read error: 104 (Connection reset by peer)]
screwt8 has joined #ocaml
benny99 has joined #ocaml
benny99 has left #ocaml []
Sparkles has quit []
Sparkles has joined #ocaml
Sparkles has quit []
postalchris has joined #ocaml
Sparkles has joined #ocaml
cjeris has joined #ocaml
mrvn has quit [Read error: 104 (Connection reset by peer)]
mrvn has joined #ocaml
Sparkles_ has joined #ocaml
Sparkles has quit [Read error: 110 (Connection timed out)]
benny99 has joined #ocaml
<benny99> hi
<benny99> anybody got some time left and wants to write an insertion sort ?
<benny99> nah... I don't understand why anybody wants an insertion sort in ocaml anyway -- *skips exercise*
pango_ has quit [Remote closed the connection]
Sparkles_ has quit [Remote closed the connection]
Sparkles has joined #ocaml
pango_ has joined #ocaml
<benny99> how can I acess an element of a tuple ?
<benny99> (2, 'f', 3.0) <-- how could I acess 'f' here for example ?
<Sparkles> match your_value with (2, 'f', 3.0) -> 'f'
<Sparkles> match your_value with (2, ( 'f' as foo) , 3.0) -> foo
<benny99> thank you
<Sparkles> be careful anyway : make an exhaustive matching block, else you could have an exception Match_failure ...
<Sparkles> you can also write :
<Sparkles> let access_second_of_three (_, b, _) = b ;;
<benny99> thanks again :)
<benny99> hm.. but how do I use that function ?
<benny99> access_second_of_three('x', 2, 1.0) ;; would not work :(
<Sparkles> access_second_of_three (423, 'f', 32.32)
<Sparkles> (* returns 'f' *)
<benny99> I tried something compareable --> This expression has type char * bool * float but is here used with type
<benny99> bool * bool * 'a
<Sparkles> $ ocaml
<Sparkles> Objective Caml version 3.09.3
<Sparkles> # let access_second_of_three (_, b, _) = b ;;
<Sparkles> val access_second_of_three : 'a * 'b * 'c -> 'b = <fun>
<Sparkles> # access_second_of_three (423, 'f', 32.32);;
<Sparkles> - : char = 'f'
<Sparkles> # access_second_of_three (423, 'f', 32.32);;
<Sparkles> - : char = 'f'
<benny99> ah, no, wait
<Sparkles> # access_second_of_three('x', 2, 1.0) ;;
<Sparkles> - : int = 2
<benny99> I guess I go tthe error
<benny99> a function must always return the same type huh ?
<benny99> makes sense :p
bluestorm_ has joined #ocaml
<benny99> I really wonder if ocaml is worth learning :
<benny99> everything works like expected now :)
<benny99> thank you
<Sparkles> a function must always return the same type huh ? ====> a function can be polymorphic ! ...
<Sparkles> like :
<Sparkles> let id x =x ;;
<Sparkles> let id x = x ;;
<bluestorm_> some function may even return a different type from the one you give
<Sparkles> it returns its argument, but the type of its argument doesn't matter, it can be whatever you want
<bluestorm_> (but they're evil)
<benny99> hm, mine required that :<, whatever
<benny99> Sparkles: how long did it take for you to learn OCAML ?
<Sparkles> well, if a function returns a type that is not contained anywhere in the arguments type, then it means that the function raises an exception or never returns
<Sparkles> I learned ocaml in a few weeks... but now i've been practising this language for more than 3 years...
<Sparkles> actually, ocaml is very easy to learn if you want to do simple things
<benny99> Sparkles: ah, you 'learned' it in a few weeks ?
<Sparkles> if you want to know ocaml very well, it takes a lot of time... really a lot, because it's a very rich language
<benny99> Sparkles: I want to do a simple lexical tree :(
<benny99> Sparkles: whatever; hope I'll do it then try the next exercise...
<Sparkles> in a few weeks, you can learn everything about "simple functional programming"
<benny99> Sparkles: Do you think OCAML is the right language for AI ?
<benny99> Sparkles: (sorry for asking it that sudden :Z)
<Sparkles> it depends... now many AI is in java :-(
<benny99> AI in Java o_O! ?
<Sparkles> yes...
<Sparkles> and python
<benny99> Like a brain in a dish-washer :p ?
<benny99> hm.. just thought that those "Higher order functions" are maybe extremely useful
<Sparkles> ocaml allows you to do anything you want, sometimes it's really great because it's very simple and very expressive, but sometimes it is not at all... Like if you want to make an awesome UI, it's not easy in OCaml...
<benny99> Puh... I guess I never did an UI
<benny99> *a real UI
<Sparkles> well, for example, some people programming with objects need to handle closures, and so they reproduce complex scheme of classes to simulate what ocaml can do with a few lines when you handle functors...
<benny99> Sparkles: so it's worth learning it -- just needed some motivation
<benny99> Sparkles: I feel like a total idiot using ocaml :|
<benny99> Sparkles: maybe because I am :<
<Sparkles> " OCaml is really great and OCaml is really bad ", to me, is a true
<Sparkles> For my part, it's my favourite programming language.
<Sparkles> Well, OCaml is not very easy to learn when you discover it...
<mrvn> benny99: you do the first time you learn functional programming
postalchris has quit [zelazny.freenode.net irc.freenode.net]
G has quit [zelazny.freenode.net irc.freenode.net]
twobitsprite has quit [zelazny.freenode.net irc.freenode.net]
vorago has quit [zelazny.freenode.net irc.freenode.net]
zmdkrbou has quit [zelazny.freenode.net irc.freenode.net]
bebui has quit [zelazny.freenode.net irc.freenode.net]
levi_home has quit [zelazny.freenode.net irc.freenode.net]
zmdkrbou has joined #ocaml
bebui_ has joined #ocaml
twobitsprite has joined #ocaml
vorago has joined #ocaml
G has joined #ocaml
postalchris has joined #ocaml
<Sparkles> still, it depends on your motivation....
levi_home has joined #ocaml
<mrvn> But ocaml is very easy to learn and very powerfull even with the basics. At university we wrote a compiler for a subset of ocaml in ocaml and some pupils learned ocaml along the way without problems.
<benny99> Sparkles: Oh, 3 points -- I guess I should stop bothering you, thanks so far :)
<mrvn> For ASTs the variant types and recursive capabilities are truely great.
<benny99> mrvn: "easy to learn" means "easy to get started with" ?
<mrvn> benny99: easy to get started with, easy to use for complex things and easy to write a compiler for.
<mrvn> We didn't do matches or optimizing though. just a basic compiler.
<benny99> x_x if it's that easy I guess I'm an idiot
<benny99> doesn't matter, have to learn it anyway --- maybe I get a bit less idiotic by learning :p
<mrvn> You have to get used to the concepts of functional languages. that is all.
<benny99> OK, didn't want to bother that much (again and it's certainly not the last time) -- I'll try my lexical tree then :)
<mrvn> what do you mean by lexical tree?
<benny99> that dictionary thingy -- give me a sec
<Sparkles> benny99 : You can't know ocaml is easy before you have actually understood why. So it's the hardest part of it : understand why it's easy ;-)
<benny99> Sparkles: ok, I'll punch it till it tells me why :p -- ok, I hope I can get rid of that
<mrvn> And you need an insert sort for that?
<Sparkles> (have you looked at http://www.ocaml-tutorial.org/ ? ... well, I haven't yet, but it looks good)
<benny99> Sparkles: yeah, but I rather like that book
<benny99> mrvn: look at the exercise above ;)
<Sparkles> member:benny99 : ok no problem. :-)
<benny99> mrvn: but insertion sort + ocaml is nonsense...
<mrvn> Aeh, that exercise comes with answeres
<benny99> mrvn: where !?
<mrvn> as mouse_over popups.
<benny99> mrvn: -.-' stupid me
<Sparkles> why insertion sort + ocaml is nonsense ? If your structure is not bad for insertion, then it's not nonsense. Of course, if you make a insertion sort with 'a list data, it's nonsense because its cost is way prohibitive...
<benny99> Sparkles: ok, I guess I took enough shame on me today :|
<benny99> Sparkles: mrvn: thanks once again -- I'll try to "solve" that second exercise now
<Sparkles> it's no shame to start learning a good language ;-)
<mrvn> no, solve the first one before reading the solution
<benny99> mrvn: I'm not capable of doing that
<benny99> mrvn: but if you say so :|
<mrvn> Whoever wrote those answeres needs to learn about tail recursion and List.fold_left
<Sparkles> mrvn : well, no, first you learn to program without List.fold_left (nor List.fold_right), and then you learn how to use them.
jkeith_ has joined #ocaml
twobitsprite has quit ["Lost terminal"]
<mrvn> Sparkles: you can safely ignore fold_right
<Sparkles> fold_right can be faster than fold_left in some cases...
<mrvn> but only works on small lists
<Sparkles> in deed.
<mrvn> Writing a tail recursive insert for a tree is fun.
<mrvn> In case you want to store very long words in the tree.
<mrvn> When I learned ocaml at university I nearly drove my tutor insane by handing in solutions with stacked List.fold_left constructs being like half to quarter the size of the rest of the group. It was realy fun optimizing the code flow into the most higher level form and minimal length.
<benny99> that exercise #6 is really bad explained huh? my one was "let insert e l = l.mList::e ;;" before :Z
jkeith has quit [Connection timed out]
<mrvn> benny99: url?
<mrvn> "Write the function insert which adds an element to a list of this type."?
<benny99> mrvn: yep
<benny99> mine adds an element :D
<mrvn> I would solve (1) by let merge_i = merge (compare), for merge see (2). :)
<benny99> mrvn: I've done the first 5 already
<benny99> (now at 7)
<benny99> I hope I'll do that ...
<mrvn> should insert honor the boolean flag? What if the element is already in there?
<mrvn> I guess it has to honor the flag ot (7) can't reuse the code.
<benny99> mrvn: yeah, look at the solution
<benny99> mrvn: but why didn't teh author tell us ?
<mrvn> The exercise should have you write merge_sort
<benny99> mrvn: yeah -- merge sort is naturally recursive huh ?
<benny99> but I'll try insertsort now :|
<mrvn> benny99: and actualy fast
<benny99> mrvn: the fastest if it wouldn't copy the whole list huh ? (Yeah, I read something about search-algorithms once ago :Z)
<mrvn> insertion sort makes tons of copies all over the place.
<benny99> mrvn: yeah :(
<benny99> mrvn: dunno, the book says I should program that, so I (try) to do
<benny99> I give up for today
benny99 has left #ocaml []
Sparkles has quit []
bluestorm_ has quit ["Konversation terminated!"]
Smerdyakov has joined #ocaml
dark_light has quit [Read error: 110 (Connection timed out)]
benny91 has joined #ocaml
<benny91> does anybody know how List.fold_right is working ?
<postalchris> Looks all right to me.
<postalchris> let rec fold_right f l accu =
<postalchris> match l with
<postalchris> [] -> accu
<postalchris> | a::l -> f a (fold_right f l accu)
<postalchris> That's straight from the sources
<benny91> thanks
pango_ has quit [Remote closed the connection]
pango_ has joined #ocaml
<benny91> I guess it's not my day today
<benny91> At least IRC is not (yet) against me -- Have a nice evening anyway -- bye :)
benny91 has left #ocaml []
jlouis has joined #ocaml
pango_ has quit [Remote closed the connection]
pango_ has joined #ocaml
bluestorm_ has joined #ocaml
david_koontz has joined #ocaml
Madonna has joined #ocaml
cheese` has quit [Read error: 104 (Connection reset by peer)]
postalchris has quit ["Leaving."]
a-priori has quit [Remote closed the connection]
a-priori has joined #ocaml
jajs has joined #ocaml
bluestorm_ has quit ["Konversation terminated!"]
benny99 has joined #ocaml
<benny99> it's not my day ... damn, I feel so stupid :|
benny99 has left #ocaml []
jajs has quit ["Quitte"]
joelr1 has joined #ocaml
<joelr1> good evening
<joelr1> how can i create permutations of [ 1; 2; 3; 4 ] and a another list? i would like to pair each member of the 2nd list with each member of the first
<pango_> permutations ?
<pango_> what you describe aren't permutations (http://en.wikipedia.org/wiki/Permutations)
<joelr1> pango_: probably the wrong word
<joelr1> pango_: but what i really want is what i describe
<joelr1> any elegant way to achieve that? easily done with list comprehensions but i don't think ocaml has any
<pango_> List.combine ?
<joelr1> checking
<joelr1> pango_: Raise Invalid_argument if the two lists have different lengths.
<joelr1> my 1st list has just 4 items whereas the 2nd has more
<pango_> oh, I misunderstood what you want then
<joelr1> in other words, i have a list of pairs where each pair represents a function return type and a list of arguments
<joelr1> i need to produce functions called "plot1", "plot2", "plot3" and "plot4" where each of these can have the type and arguments in the previously mentioned list
romanoffi has joined #ocaml
<joelr1> pango_: so i do need to combine but the lists are of different length
<joelr1> in haskell:
<joelr1> plotFuns = [ plot n ty args | n <- [ 1 .. 4 ], (ty, args) <- defs ]
<joelr1> where plot n ty args =
<pango_> If the number of combinaisons can be large, you should better not mimic the Haskell solution
<joelr1> pango_: it's not large, just 4 x 5
<pango_> so, all pairs made of an element from a first list and an element from a second ?
<joelr1> yep
<pango_> let pairs l1 l2 =
<pango_> List.fold_left (fun acc e1 -> List.fold_left (fun acc e2 -> (e1, e2) :: acc) acc l2) [] l1
<joelr1> pango_: thanks!
<pango_> I can't think of a much shorter implementation right now...
<joelr1> pango_: i think this will do nicely, thanks!
joelr1 has left #ocaml []
joelr1 has joined #ocaml
<joelr1> pango_: it's not quite it
<joelr1> pango_: but i got the basic idea
<joelr1> no, i'm lying
<joelr1> pango_: ignore me, it works! :)
joelr1 has left #ocaml []
jkeith_ is now known as jkeith
joelr1 has joined #ocaml
<joelr1> pango_: another quick question... is there a shortcut to creating a list of integers? 1..4, say
<joelr1> or 1..10
<pango_> no
<joelr1> i thought so :(
<pango_> it's easily done, but hardly scales in an eager language
<joelr1> well, i don't need it to scale
<joelr1> i guess i can just write a quick function
<pango_> let rec seq a b =
<pango_> if a > b then [] else a :: seq (a+1) b
<joelr1> pango_: thanks
pstickne has joined #ocaml
ubuntu` has joined #ocaml
_JusSx_ has quit [Client Quit]
pango_ has quit [Remote closed the connection]
pango_ has joined #ocaml
pstickne has quit [Connection timed out]
joelr1 has quit []
ubuntu` has quit [Remote closed the connection]
jlouis_ has joined #ocaml
jlouis has quit [Read error: 110 (Connection timed out)]
pstickne has joined #ocaml
pstickne has quit [SendQ exceeded]
a-priori has quit [Read error: 104 (Connection reset by peer)]
cjeris has quit [Read error: 104 (Connection reset by peer)]
bsmith has joined #ocaml