<hcarty>
ocamlbrew is almost ready to be Legitimately Useful
pilki has quit [Quit: This computer has gone to sleep]
bobzhang has joined #ocaml
<bobzhang>
does anyone know how to use ocamlyacc to do context-senstive parsing? I
<bobzhang>
mean before the component of symbols to be parsed do some
<bobzhang>
actions. Thanks :)
mcclurmc has quit [Excess Flood]
mcclurmc has joined #ocaml
<thelema>
bobzhang: before the component of symbols? I don't understand.
<bobzhang>
thelema: yes, I found a way to walk around it. I mean my actions should be done before the production be parsed
spearalot has joined #ocaml
<thelema>
bobzhang: that seems like an odd request to me, but I'm happy you've found a way to do what you want.
<bobzhang>
thelema: yes, my grammar is context-sensitive
<bobzhang>
I split the grammar into small pieces, and do some actions in each small pice
<thelema>
bobzhang: the normal way to do context sensitive grammars in yacc is to overmatch and throw exceptions in the actions when the match was wrong
<bobzhang>
thelema: thanks :p
spearalot has quit [Quit: Computer has gone to sleep]
joewilliams has quit [Remote host closed the connection]
bobry has quit [Remote host closed the connection]
lopex has quit [Read error: Connection reset by peer]
spearalot has joined #ocaml
mcclurmc has quit [Excess Flood]
mcclurmc has joined #ocaml
joewilliams has joined #ocaml
lopex has joined #ocaml
bobry has joined #ocaml
emmanuelux has joined #ocaml
mcclurmc has quit [Excess Flood]
mcclurmc has joined #ocaml
bobzhang has quit [Ping timeout: 252 seconds]
mcclurmc has quit [Excess Flood]
mcclurmc has joined #ocaml
fantasticsid has joined #ocaml
spearalot has quit [Quit: Computer has gone to sleep]
raichoo has quit [Read error: Connection reset by peer]
fantasti` has quit [Client Quit]
fantasticsid has quit [Ping timeout: 240 seconds]
fantasti` has joined #ocaml
pango__ has joined #ocaml
fantasti` has quit [Client Quit]
pango_ has quit [Ping timeout: 240 seconds]
sebz has joined #ocaml
ftrvxmtrx has quit [Quit: Leaving]
sebz has quit [Client Quit]
NihilistDandy is now known as NihilistDandy|aw
sebz has joined #ocaml
raichoo has joined #ocaml
bitbckt has quit [Quit: out]
bitbckt has joined #ocaml
fantasticsid has joined #ocaml
joewilliams has quit [Excess Flood]
lopex has quit [Max SendQ exceeded]
ttamttam has joined #ocaml
edwin has joined #ocaml
ftrvxmtrx has joined #ocaml
joewilliams has joined #ocaml
spearalot has joined #ocaml
sebz has quit [Quit: Computer has gone to sleep.]
lopex has joined #ocaml
milosn has quit [Ping timeout: 240 seconds]
milosn has joined #ocaml
sebz has joined #ocaml
ulfdoz_ has joined #ocaml
sebz has quit [Quit: Computer has gone to sleep.]
ulfdoz has quit [Ping timeout: 252 seconds]
ulfdoz_ is now known as ulfdoz
snarkyboojum has quit [Ping timeout: 252 seconds]
snarkyboojum has joined #ocaml
sebz has joined #ocaml
raichoo has quit [Quit: leaving]
_andre has joined #ocaml
destrius has quit [Quit: Leaving.]
larhat has joined #ocaml
<adrien>
when building, the "inconsistent assumptions" stuff is only impacted by .mli files, right?
<adrien>
and if I have A.mli, B.mli and a module C, if B.mli depends on A.mli and C depends on B; if I modify A.mli and recompile the module B, do I also have to recompile C?
<adrien>
(actually I'm pretty sure I'll have to do that; bah)
kmc has quit [Quit: Leaving]
larhat has quit [Quit: Leaving.]
fantasticsid has quit [Ping timeout: 240 seconds]
sebz has quit [Quit: Computer has gone to sleep.]
sebz has joined #ocaml
sebz has quit [Ping timeout: 244 seconds]
<hcarty>
And let.foo is back out again...
<adrien>
I don't understand: "no consensu on proposal"? which proposal?
<hcarty>
adrien: I would guess some combination of the syntax and functionality
<adrien>
but has there been any public discussion?
<hcarty>
Probably among the core development team
<hcarty>
I haven't seen anything public
<hcarty>
Aside from the commits :-)
<adrien>
ok, a bit frustrating
waterfowl has quit [Ping timeout: 244 seconds]
waterfowl has joined #ocaml
fanasticsid has joined #ocaml
fanastic` has joined #ocaml
fanasticsid has quit [Ping timeout: 240 seconds]
fanastic` has quit [Remote host closed the connection]
oc13 has joined #ocaml
ttamttam has left #ocaml []
fantasticsid has joined #ocaml
fridim_ has joined #ocaml
zorun has quit [Read error: Connection reset by peer]
fridim_ has quit [Ping timeout: 268 seconds]
zorun has joined #ocaml
spearalot has quit [Quit: Computer has gone to sleep]
Kakadu has joined #ocaml
spearalot has joined #ocaml
fantasticsid has quit [Quit: ERC Version 5.3 (IRC client for Emacs)]
raichoo has joined #ocaml
bitbckt has quit [Quit: out]
bitbckt has joined #ocaml
raichoo has quit [Ping timeout: 248 seconds]
raichoo has joined #ocaml
mcclurmc has quit [Excess Flood]
mcclurmc has joined #ocaml
NihilistDandy|aw has quit [Quit: Leaving...]
acidrain has joined #ocaml
mcclurmc has quit [Excess Flood]
letrec has quit [Ping timeout: 252 seconds]
mcclurmc has joined #ocaml
acidrain has quit [Remote host closed the connection]
letrec has joined #ocaml
<edwin>
adrien: I think you have to recompile everything that depends on A (indirectly) if you build cmx files
<edwin>
because cmx contains inline info, and compiling B might've inlined something from A
<edwin>
which in turn could get inlined in C
<edwin>
or at least thats what ocamldep tells me, the .cmo files depend on the .cmi-s only, but the .cmx depend on the other .cmx
<adrien>
it's tempting me to not install cmx files then :P
<edwin>
don't know if ocaml can detect inconsistencies with .cmx though, I think its only limited to .cmi
<adrien>
at worst, it could be a missed opportunity for inlining, no?
<adrien>
and linking will be "fresh" each time
raichoo has quit [Remote host closed the connection]
raichoo has joined #ocaml
pilki has joined #ocaml
raichoo has quit [Ping timeout: 240 seconds]
raichoo has joined #ocaml
iago has joined #ocaml
<edwin>
I think at worst you'll have and old copy of an inlined function
<edwin>
but currently ocamlopt doesn't inline too much
<edwin>
anyway, aren't you using ocamldep output to determine what to rebuild?
<edwin>
that should be accurate
<adrien>
I have a set of folder which have packed modules inside (one folder = one pack); I build a pack then I install it locally with ocamlfind and compile against that installed copy
<adrien>
ocamlbuild handles deps and rebuilding inside each folder
<adrien>
my issue is only between the folders
<adrien>
well, "only"
<adrien>
also, the order is quite simple but I don't want to start making awful makefiles
<edwin>
can't ocamlbuild be used to compile everything? i.e. don't restrict to a folder
<edwin>
won't an ocamlbuild plugin like that work?
<edwin>
but if all the files belonging to pack X are in directory X then the .mlpack approach should work, no?
<edwin>
are those split into further directories too?
<adrien>
it doesn't really restrict the interface as much as packs do since you can access Foo directly instead of having to go through Pack.Foo
<adrien>
and the issue with plugins is that I've never written any and it's probably not a good intro, and I'm using oasis and mixing everything can get quite confusing
<adrien>
it's the patch which is on the forge but in a sane format (git) and with a few things fixed
<adrien>
edwin: currently the .mlpack files are in subdirs; I have to test something
<edwin>
try moving to root, and adding explicit subdir/ before each file you reference
<edwin>
then it might "just work" to build from root
<adrien>
yeah, I'm going to try 1- without oasis, 2- with oasis added and 3- in my project
smondet has joined #ocaml
BiDOrD_ has joined #ocaml
BiDOrD has quit [Ping timeout: 240 seconds]
Boscop has joined #ocaml
pilki has quit [Quit: This computer has gone to sleep]
<adrien>
I often feel stupid when I'm using ocamlbuild
<vivanov>
in batteries, is 'f x |> g ' equivalent of 'let a = f x in g a' ?
<thelema>
vivanov: yes
<vivanov>
i use 'RMutex.synchronize ~lock f x |> g ' a lot and dont want the locking happen in g
<vivanov>
thelema: ok thx a lot
<thelema>
the associativity of that should be (sync ~lock f x) |> g
<vivanov>
thelema: '(sync ~lock f x) |> g' is equivalent of 'sync ~lock f x |> g' right?
<adrien>
I think I'm giving up with ocamlbuild for today
<edwin>
yeah, the wiki helps with ocamlbuild, but its incomplete
<adrien>
well, in my case, I've tried: mkdir a && touch a/x.ml && echo "a/X" > foo.mlpack && ocamlbuild foo.cmo
<adrien>
not working
<edwin>
adrien: <a/x.cmx>: for-pack(Foo)
<edwin>
in _tags
<edwin>
or in fact just 'touch _tags'
<edwin>
and it'll work for .cmo
<adrien>
doh!
<adrien>
touching the file solved it, thanks
<edwin>
weird that a missing _tags file makes such a difference
<edwin>
maybe it doesn't use some built-in rules when _tags is missing
<edwin>
but for building .cmx you'll need the _tags rule
<edwin>
unless oasis already adds it?
<adrien>
oasis currently needs a patch to handle packing; but the patch handles -forp-ack
<adrien>
s/p-/-p/
<adrien>
edwin: adding -r to ocamlbuild solves the issue without requiring a _tags file
pilki has joined #ocaml
<adrien>
even though --help says: -r Traverse directories by default (true: traverse)
letrec has quit [Ping timeout: 240 seconds]
<edwin>
it probably means that -r is equivalent to true: traverse in _tags, and not that recursion is by default on
<edwin>
confusing way to write a help message
<adrien>
hahaha, could be that indeed :P
<edwin>
tahts why we need all of this supported in oasis, then people don't have to deal with ocamlbuild details themselves
<adrien>
there's something I have really managed with oasis: defining libraries that are used for an application
<edwin>
maybe I should contribute some patches to oasis when I have some time
<adrien>
meaning: I want to build foo.cmxa using these options and bar.cmxa using these; and I want to build baz.native which links against foo and bar
<edwin>
there are some things that I'm missing, like better handling of C library dependencies
<adrien>
edwin: oh? how so?
<edwin>
well lets say I write a binding to library X
<edwin>
and people who compile my lib don't have X installed
<edwin>
and they get an error saying that something.h is missing
<edwin>
or something.so is missing
<edwin>
it'd be good if you get a message during configure
<edwin>
saying what library you require (and maybe what version? but thats harder)
<adrien>
ah, agreed
<edwin>
thats something thats easy to do with autoconf (for some definition of easy)
<adrien>
well, oasis needs support for pkg-config
<edwin>
more than pkg-config, not every lib has pkg-config (well it does on Linux, but apparently not on the Mac)
<edwin>
just checking for .h and doing a link-test like autoconf would be the way I think
<edwin>
and you can get defaults via pkg-config (if it knows about the package)
<edwin>
or via cmdline flags
<adrien>
pkg-config defines more things
pilki has quit [Quit: This computer has gone to sleep]
<edwin>
yeah linker flags, preprocessor flags, etc.
<thelema>
vivanov: yes, |> has very low precedence
<adrien>
so in case you could use pkg-config, you'd rather use both
<edwin>
sure
<edwin>
just saying there should be a way to override from cmdline, like --with-libfoo=/path/to/libfoo
<adrien>
but it would be great if you contributed pkg-config support =)
<edwin>
yeah, I should manage my free time better (to have more of it). Right now I'm hacking on the ocaml compiler
<edwin>
playing with inlining
<edwin>
hopefully I can write something useful, and then move on to something else
<edwin>
(like making oasis support the stuff I'm missing)
<vivanov>
thelema: great thx a lot :)
Kakadu has quit [Quit: Konversation terminated!]
<adrien>
bah:
<adrien>
findlib: [WARNING] Interface x.cmi occurs in several directories: b, a
<adrien>
Error: Unbound value B.X.id
<adrien>
one of the .cmi shadows the other one
<edwin>
why is it using x.cmi, shouldn't it be using the pack?
<thelema>
adrien: use prefixes instead of directories to disambiguate ocaml modules.
ftrvxmtrx has quit [Quit: Leaving]
<thelema>
clearly, the ocaml compiler doesn't handle identically named modules
<adrien>
edwin: good point!
<adrien>
thelema: properly packed it should be good
<thelema>
IMNSHO, packing is a poor hack
<adrien>
I think I'd prefer namespaces but they're not there (yet)
<hcarty>
thelema: It's a poor hack with no good alternative at this point
<thelema>
hcarty: prefixing.
<adrien>
the issue is really that I have two groups of modules which are going to have the same names
<hcarty>
thelema: IMNSHO that's a roughly equally poor hack :-)
<thelema>
hcarty: ok, fair enough.
<hcarty>
Prefixing is an easier hack to reason about though. So perhaps the hackishness is not truly equal.
<adrien>
and I want a clear separation between the modules: I want the guarantee I won't use the "wrong" module and that's what I'm getting with packing because it's quite rigid
<edwin>
-pack Build an object file (.cmx and .o/.obj files) and its associated compiled interface (.cmi)
<edwin>
so you should have a .cmi file for the packed module
<hcarty>
It is a royal pain needing to have Array, BatArray, MyArray, etc. floating around.
<adrien>
edwin: hmm, I see I made something completely useless (and bad actually)
<adrien>
hah: the actual (and first) issue was that I had written "let y =" while I meant "let id =" =)
Submarine has joined #ocaml
<adrien>
\o/
* adrien
hugs edwin
<edwin>
does it work now?
<adrien>
yeah =)
<edwin>
:)
* adrien
kicks edwin for not "forcing" him to do it that way earlier on :P
<adrien>
going to try on the actual project now: caravel
iago has quit [Quit: Leaving]
smondet has left #ocaml []
ikaros has joined #ocaml
<vivanov>
my program starts lots of threads by Thread.create but 'top' command shows that the program uses only one core. why doesnt the program use all the cores?
<thelema>
vivanov: ocaml threads can only use one core
<thelema>
short reason: the GC only can run in a single core
<vivanov>
any way around thius ? using other thread packages ?
<adrien>
vivanov: along with the usual answer: "starting several processes is often a good solution too"
jamii has joined #ocaml
<jamii>
would kill for shift_left_logical
<jamii>
:(
<hcarty>
vivanov: There are a number of other multi-process options, including Functory and preludeml which has some parallel map, iter and fold operations
<hcarty>
jamii: lsl I think
<jamii>
hcarty: sorry, Int32.shift_left_logical is what I need
<adrien>
parmap too
<vivanov>
ok ill explore the options. im simply looking for alternative of Thread.create.
<jamii>
actually....
<jamii>
ocaml doesnt have circular shift at all
<thelema>
jamii: nope. neither does C. But things work out.
<adrien>
it sounds pretty high-level
<jamii>
thelema: according to wikipedia, most c compilers will recognize the standard idiom and turn into the right instruction
<jamii>
oh well
<thelema>
jamii: granted. benchmark then tell us how much performance you lose from not having this optimization
<jamii>
thelema: :)
<thelema>
jamii: are you doing crypto?
<jamii>
thelema: 10 minutes of coding/testing :-P
<jamii>
thelema: no, compressed bitmaps
<thelema>
really? with rotates... hmmm
<adrien>
I didn't expect a dedicated instruction to be available but I guess that it's rule 34 of x86: if you can think of it, it exists
<edwin>
would make more sense to add a new primitive op for it, rather than trying to infer back from sources
<jamii>
I'm sure I can figure out how to do without
<edwin>
well you can implement it yourself, and you'll loose a tiny bit of speed
<jamii>
edwin: I think the idea is to optimize code that was written before the new instructions showed up
<adrien>
edwin: actually I'm not there yet with oasis + packs in subfolders because oasis' BuildDepends is effectless
<adrien>
ok: tagging with "pkg_lablgtk2" did it but now I'm wondering how to do it "cleanly"
<adrien>
gildor: about oasis, when making module packs for a folder named, I create "A.mlpack" in "." and write "a/X" in it; I then define the corresponding library with "Path: ." and "Modules: A"; I also add "BuildDepends: lablgtk2" but it has no effect; adding "<a/*.ml{,i}>: pkg_lablgtk2" to _tags solves the issue; do you think it's the right approach here?
<adrien>
(hope this was clear enough)
<adrien>
I'll also get in touch with whoever submitted the original patch
Boscop has quit [Ping timeout: 240 seconds]
<adrien>
right, it looks like the current patch doesn't handle packs with folder at all; hopefully it should be quite easy to od
_andre has quit [Quit: leaving]
dsheets has joined #ocaml
sepp2k has joined #ocaml
smerz has joined #ocaml
tautologico has joined #ocaml
<adrien>
edwin: ocamlobjinfo on a .cmx file shows it has a CRC for the implementation
<edwin>
adrien: for imported modules?
<edwin>
ah Implementations imported
<edwin>
ok, so I guess it _could_ find mismatches there
<adrien>
File _build/lib/misc.cmx
<adrien>
Name: Misc
<adrien>
CRC of implementation: 1181172b0fd496de106180c6ae5ffb7a
<adrien>
and implementations imported too, yes
<edwin>
yeah, got it
<edwin>
and found this code: raise(Error(Inconsistent_implementation(name, user, auth)))
<edwin>
so loosk all good
<adrien>
now I'm wondering what "Approximation", "Currying functions" and "Apply functions" are
<edwin>
Approximation is used for inlining (if there is inlining info)
<thelema>
currying functions help for partial application
<thelema>
and apply functions apply a fixed number of parameters to a curried function
<thelema>
edwin: I didn't know that about approximation
<adrien>
ah, makes sense: approximation gives the code size of the function body?
<adrien>
thelema: thanks; the output format is still a bit surprising however (only the number of occurences of such functions)
<edwin>
I don't know what approximations without inline info do, but approximations with inline info actually contain the ulambda representation (not printed by ocamlobjinfo)
<edwin>
8: function camlString__index_1113 arity 2 (closed) (inline) -> _;
<adrien>
(0: function camlLib__Misc__fun_1038 arity 1 -> _)
<edwin>
so where it says inline, it actually has the implementation of the index function in ulambda (or clambda) form
velov has joined #ocaml
<adrien>
hmmm, my fun 1038 function isn't terribly small however
<edwin>
thats why it has no (inline) annotation
<edwin>
adrien: have a look at asmcomp/clambda.mli
<edwin>
type value_approximation
<edwin>
it tells you if the function is a closure, a tuple, integer, constant pointer, or unknown
<edwin>
I think the integer is useful if a function is known to always return a constant value (but has some other side-effect)
<edwin>
and knowing that its a closure is probably needed by the native compiler
<adrien>
oh: "E: File _tags need a backup, but all filenames for the backup already exist"; oasis has created 10 backups so far =)
<edwin>
so about your fun_1038 I think it only knows that it takes 1 paramter, and thats it
<adrien>
(I think it creates backups even when not needed)
<edwin>
lol, didn't know about backups
<adrien>
(but I don't have a rule for "needed")
<adrien>
edwin: it's because I have stuff outside of the oasis-generated code
<adrien>
edwin: oh, thanks; I'll try to look a bit inside the compiler when I have some time
<adrien>
ah, got my project to build using packs
<adrien>
and oasis and ocamlbuild, in a single pass
<adrien>
it required that I have all the .mlpack files at the root of the project however
<adrien>
for each library, Path has to be "." and then, I put module paths relative to _oasis in Modules
ftrvxmtrx has joined #ocaml
oc13 has quit [Ping timeout: 268 seconds]
<hcarty>
adrien: Can you post the _oasis somewhere as an example?
<adrien>
hcarty: it will be on git quite soon
<hcarty>
adrien: I look forward to it :-)
pango__ has quit [Ping timeout: 240 seconds]
pango__ has joined #ocaml
Anarchos has joined #ocaml
<thelema>
adrien: odb can now install from git trees (doesn't handle dependencies, though)
<hcarty>
thelema: Do you have a plan for how you will implement dependency support? Maybe something manual, like a CSV list of findlib dependencies at the end of the definition
<adrien>
thelema: great! :-)
<thelema>
hcarty: two plans: 1) dirty parse _oasis file, 2) change packages format to allow "deps=foo,bar,baz" inline
<adrien>
(s/CSV/JSON/)
<thelema>
adrien: sorry, no json
<hcarty>
adrien: JSON is a bit more difficult to parse without library support :-)
<thelema>
adrien: only the most extremely simple parsing, usually revolving around Str.split (Str.regexp " +") ...
<adrien>
I have s-expressions in yypkg and decided to move to json because the "web" stuff would be better with it and could be used by a server directly
* thelema
doesn't care about the web
<adrien>
but I guess you can more easily create JSON from a CSV
<thelema>
and does care about staying under 500 LOC
<adrien>
:-)
<thelema>
and it's not a CSV file, it's just comma-separated values
<thelema>
the list of deps is like "oUnit(>=1.0),batteries,pcre"
velov has quit [Quit: Computer has gone to sleep]
ankit9 has quit [Quit: Leaving]
<hcarty>
An odb-installable odb-heavy version could always be made which depends on oasis, yojson, and loads of other goodies.
<adrien>
would odb really need special support in order to make distribution packages? wouldn't exporting OCAMLFIND_DESTDIR be enough?
<thelema>
ick. why?
<hcarty>
But someone would have to need it enough to write the code
<thelema>
adrien: I don't know.
<hcarty>
thelema: oasis - for proper parsing of _oasis files
<hcarty>
thelema: Anything else - if there's a use for it, it could be used
<thelema>
hcarty: bah, I already have dirty-parsing of _oasis files for deps in 11 LOC
<adrien>
at least for slackware, we only need some kind of DESTDIR support when installing
<thelema>
adrien: then I think odb would do everything you need
<thelema>
adrien: I imagine this wouldn't suffice for a .deb or .rpm
<adrien>
thelema: it's definitely worth a try
<hcarty>
adrien: Why odb over oasis for this task?
<adrien>
thelema: well, slackbuilds do some extra work but the "middle" of the script is always the same: configure, make, make install DESTDIR=$PKG
<hcarty>
adrien: Just cuious... I think one of gildor's goals with oasis was automated package generation
<adrien>
hcarty: actually it depends whether automatic downloading of archives is wanted or not ;-)
<adrien>
hcarty: it's true the additional layer is not a requirement
<adrien>
I need to finish my build system stuff and go to bed I think
NihilistDandy has joined #ocaml
jamii has quit [Read error: Connection reset by peer]
spearalot has quit [Quit: Computer has gone to sleep]
<adrien>
hcarty: oh, and this: sed -e '/include/ d' _tags > tags_0 && mv tags_0 _tags
<adrien>
otherwise ocamlbuild gets paths to _inside_ the packs
<adrien>
(it removes the lines which mention "include" in _tags)
<pango__>
with sed -i you don't need tags_0
<adrien>
but it's a gnu-ism iirc
<adrien>
and a very hand one
<pango__>
maybe
<adrien>
very handy*
<adrien>
I think I got yelled at by someone running openbsd once
raichoo has joined #ocaml
<edwin>
hmm, can I restrict the type of a Map's values?
<edwin>
or should I just use a Hashtbl in that cas?
<pango__>
Haven't used OCaml much lately, but iirc both Hashtbl and Map are parametric vs. the type of the values they contain, won't make any difference
ftrvxmtrx has quit [Read error: Connection reset by peer]
ftrvxmtrx has joined #ocaml
BiDOrD has joined #ocaml
BiDOrD_ has quit [Ping timeout: 255 seconds]
<adrien>
better: pmake 1.57s user 0.54s system 89% cpu 2.355 total
edwin has quit [Remote host closed the connection]
ftrvxmtrx has quit [Quit: Leaving]
waterfowl has quit [Quit: waterfowl]
jamii has joined #ocaml
letrec has joined #ocaml
Anarchos has quit [Quit: Vision[0.9.7-H-090423]: i've been blurred!]
Morphous_ has quit [Ping timeout: 240 seconds]
mcclurmc has quit [Excess Flood]
emmanuelux has quit [Remote host closed the connection]
mcclurmc has joined #ocaml
Morphous_ has joined #ocaml
raichoo has quit [Quit: leaving]
lusory has joined #ocaml
mcclurmc has quit [Excess Flood]
mcclurmc has joined #ocaml
letrec has quit [Remote host closed the connection]
letrec has joined #ocaml
ikaros has quit [Quit: Ex-Chat]
waterfowl has joined #ocaml
mcclurmc has quit [Excess Flood]
mcclurmc has joined #ocaml
ztfw has joined #ocaml
bobzhang has joined #ocaml
<ztfw>
Is there a natural way to remove the warning that comes with declaring values through pattern matching such as let [foo; bar] = …?
<bobzhang>
-w a?
<thelema>
ztfw: if you can, return a tuple instead of a list