adrien changed the topic of #ocaml to: Discussions about the OCaml programming language | http://www.ocaml.org | Upcoming OCaml MOOC: https://huit.re/ocamlmooc | OCaml 4.03.0 release notes: http://ocaml.org/releases/4.03.html | Try OCaml in your browser: http://try.ocamlpro.com | Public channel logs at http://irclog.whitequark.org/ocaml
eemax has quit [Quit: Page closed]
<mengu> let's say i have predefined data in lists, like let extensions = [...] and let files = [...]. i want to keep them in a seperate file and call them in another. what is the best practice for that? should i define them in a module? or just leave it in the file?
minn has quit [Ping timeout: 240 seconds]
Heasummn has joined #ocaml
minn has joined #ocaml
eemax has joined #ocaml
<eemax> Is there a nice way to auto-generate documentation (or just browse interfaces) for installed opam packages? What I have in mind is something like what's at mirage.github.io (but that's pretty out of date, and only includes packages that are part of mirage)
zv has joined #ocaml
<eemax> I googled around a bit, but it looks like codoc / opamdoc (which is what the mirage site was generated with) appear not to be maintained any more and I couldn't get them to build. And I couldn't get ocamldoc to generate anything for installed packages without getting unbound module errors.
mekaj has quit [Quit: Connection closed for inactivity]
glennsl has quit [Quit: My MacBook Pro has gone to sleep. ZZZzzz…]
francisco has joined #ocaml
francisco is now known as Guest25147
Guest25147 has quit [Ping timeout: 265 seconds]
<mengu> is there a way to know where a binding or a function is coming from?
<mengu> in python we can do str.__module__ and find out where it is defined at
<Heasummn> Merlin has tha tfeautre
<Heasummn> feature*
Reshi has joined #ocaml
<Heasummn> you mean builtin?
<Heasummn> I doubt it
<Heasummn> Python is a self aware language. And C/C++ attempts to add some self awareness using it's preprocessor
<mengu> alright
pierpa has quit [Ping timeout: 276 seconds]
Reshi has quit [Quit: WeeChat 1.5]
bruce_r has joined #ocaml
rgrinberg has joined #ocaml
d0nn1e has quit [Ping timeout: 276 seconds]
<rgrinberg> is there a way to disable oasis from using this setup.data files?
d0nn1e has joined #ocaml
<Heasummn> why do you want to?
<Heasummn> rgrinberg,
mengu has quit [Remote host closed the connection]
<rgrinberg> Heasummn: because it's rather intrusive when changing opam switches
<Heasummn> you can just run a clean and then switch
<Heasummn> but I believe you can remove the setup.data files
<Heasummn> let me google around a bit
<rgrinberg> the clean target from oasis doesn't delete that file unfortunately
<Heasummn> nope. No way to get rid of them
<Heasummn> just rm them and go on your way
<Heasummn> you shouldn't need to run switches all the time.
<rgrinberg> Heasummn: thank you for the tip -_-
<Heasummn> yeah sorry I couldn't help
sh0t has quit [Remote host closed the connection]
francisco has joined #ocaml
francisco is now known as Guest25147
Guest25147 has quit [Ping timeout: 260 seconds]
tmtwd has joined #ocaml
minn2 has joined #ocaml
minn2 has quit [Ping timeout: 265 seconds]
rgrinberg has quit [Ping timeout: 250 seconds]
sdothum has quit [Quit: ZNC - 1.6.0 - http://znc.in]
rgrinberg has joined #ocaml
copy` has quit [Quit: Connection closed for inactivity]
rgrinberg has quit [Quit: WeeChat 1.5]
rgrinberg has joined #ocaml
<Heasummn> How can I rewrite List.map2 so that it just returns the empty list on values when the lists don't match up?
<Heasummn> nvm that. That's an XY problem that I solved
FreeBirdLjj has joined #ocaml
tmtwd has quit [Ping timeout: 264 seconds]
FreeBirdLjj has quit [Remote host closed the connection]
Heasummn has quit [Quit: Leaving]
francisco has joined #ocaml
francisco is now known as Guest25147
Guest25147 has quit [Ping timeout: 264 seconds]
FreeBirdLjj has joined #ocaml
snhmib has joined #ocaml
slash^ has joined #ocaml
snhmib has quit [Ping timeout: 250 seconds]
rgrinberg has quit [Ping timeout: 276 seconds]
ggole has joined #ocaml
orbifx has joined #ocaml
mcc has quit [Quit: Connection closed for inactivity]
AlexDenisov has joined #ocaml
Simn has joined #ocaml
ygrek has joined #ocaml
bruce_r has quit [Ping timeout: 265 seconds]
FreeBird_ has joined #ocaml
sepp2k has joined #ocaml
FreeBirdLjj has quit [Ping timeout: 244 seconds]
<companion_cube> distclean, maybe?
orbifx has quit [Ping timeout: 250 seconds]
francisco has joined #ocaml
francisco is now known as Guest25147
sepp2k has quit [Ping timeout: 244 seconds]
ygrek has quit [Ping timeout: 240 seconds]
Guest25147 has quit [Ping timeout: 265 seconds]
FreeBirdLjj has joined #ocaml
FreeBird_ has quit [Ping timeout: 252 seconds]
_whitelogger has joined #ocaml
sepp2k has joined #ocaml
mengu has joined #ocaml
mengu has joined #ocaml
mengu has quit [Changing host]
wu_ng has joined #ocaml
_whitelogger has joined #ocaml
shinnya has joined #ocaml
<orbitz> Is tehre any standard library way to convert an int32 to an inet_addr? Looks like there are string conversions...
mengu has quit [Remote host closed the connection]
<ggole> Printf into a A.B.C.D string, I suppose
<ggole> (And make sure you have the endianness right.)
theblatte has quit [Ping timeout: 244 seconds]
theblatte has joined #ocaml
octachron has joined #ocaml
FreeBirdLjj has quit [Remote host closed the connection]
FreeBirdLjj has joined #ocaml
FreeBirdLjj has quit [Remote host closed the connection]
<companion_cube> maybe in Ipaddr
<companion_cube> (the library ipaddr)
Algebr` has joined #ocaml
francisco has joined #ocaml
francisco is now known as Guest25147
zpe has joined #ocaml
octachron has quit [Read error: Connection reset by peer]
octachron has joined #ocaml
ygrek has joined #ocaml
Xizor has joined #ocaml
Guest25147 has quit [Ping timeout: 244 seconds]
Xizor has quit [Ping timeout: 244 seconds]
<Algebr`> why did the stdlib call string.blit blit, blit comes from computer graphics apparenrly
<ggole> It doesn't really, it's just very common there
<ggole> The orginal term is 'block transfer'
<Algebr`> so its just efficient copying to bits then?
<ggole> Yeah
Simn has quit [Ping timeout: 265 seconds]
<companion_cube> memcpy, indeed
ousado_ has quit [Remote host closed the connection]
ousado_ has joined #ocaml
francisco has joined #ocaml
francisco is now known as Guest25147
Guest25147 has quit [Client Quit]
tane has joined #ocaml
AlexDenisov has quit [Quit: My Mac has gone to sleep. ZZZzzz…]
ygrek has quit [Quit: ygrek]
octachron has quit [Quit: Leaving]
fraggle_ has joined #ocaml
gautv has quit [Ping timeout: 255 seconds]
dario9 has joined #ocaml
zpe has quit [Remote host closed the connection]
gautv has joined #ocaml
Jaxan has quit [Remote host closed the connection]
glennsl has joined #ocaml
orbifx has joined #ocaml
Algebr` has quit [Ping timeout: 265 seconds]
orbifx has quit [Ping timeout: 260 seconds]
pierpa has joined #ocaml
MercurialAlchemi has quit [Ping timeout: 244 seconds]
sdothum has joined #ocaml
Thooms has joined #ocaml
Algebr` has joined #ocaml
agarwal1975 has quit [Quit: agarwal1975]
agarwal1975 has joined #ocaml
rgrinberg has joined #ocaml
rgrinberg has quit [Ping timeout: 240 seconds]
sh0t has joined #ocaml
Jaxan has joined #ocaml
agarwal1975 has quit [Quit: agarwal1975]
TheLemonMan has joined #ocaml
freusque has joined #ocaml
NingaLeaf has joined #ocaml
octachron has joined #ocaml
hyper__ has joined #ocaml
freusque has quit [Read error: No route to host]
<hyper__> I just switched to using the Jane street core libs, and I'm very confused about the argument ordering
<hyper__> All the jane street type functions like list.map or array.slice or the like always take their own type first instead of last
freusque has joined #ocaml
<hyper__> this means you can't really use partial application, composition, or other niceties of the language since you need to put the argument thats changing first
<hyper__> and things like |> become useless
minn has quit [Quit: Leaving]
<hyper__> so I end up having to write every line like a "let step_a = function list some args in"
<hyper__> Am I missing something or is this normal for ocaml?
MercurialAlchemi has joined #ocaml
<Algebr`> you just said you switched to jane stree libs
<Algebr`> so not really a connection with ocaml the langauge right?
<Algebr`> plus they usually use labeled args, so partial app is still doable
<Algebr`> I think its an argument about if the type should come first or last to a function
<ggole> They're labelled, so partial application, |> etc work fine (if you use the label).
<hyper__> cool, I didn't know that, thanks!
<hyper__> Its still more verbose that way but at least its usable
<hyper__> Also I asked here because I was under the impression that most people used the jane street core. It has much more than the stdlib and does nice things like using options by default
<ggole> Labels are actually quite nice, particularly when more than one argument has the same type
<Algebr`> hyper__: most open source doesn't use jane street. Labels are a big feature of the langauge
<Algebr`> labels are like self documenting code
<octachron> They also help a lot to clarify small asymmetric function, e.g. "let copy ~origin ~target = ... "
octachron has quit [Read error: Connection reset by peer]
<hyper__> what do most projects use then? batteries in?
<gasche> there is no strong consensus
<gasche> there are some Batteries user, Containers ( https://github.com/c-cube/ocaml-containers ) is also popular around early-adopters (it's more recent and moving faster)
<gasche> and a lot of big projects have their own extensions to the base libraries (Coq, Frama-C, etc.)
<hannes> hyper__: since opam is there now, some people started shipping smaller libraries to replace one module at a time (see e.g. Astring for String, ...) it really depends what you need. I myself try to have as few external dependencies as possible (since I read through all dependencies)
freusque has quit [Ping timeout: 250 seconds]
freusque has joined #ocaml
pyon has quit [Quit: brb guise]
<hyper__> oh, speaking of opam I can't seem to load libs with it
<hyper__> I did opam init and then opam install core_kernel
<hyper__> but doing open Core_kernel.Std doesn't work
<hyper__> even though opam list shows it as installed
<hyper__> Did I miss a step?
pyon has joined #ocaml
Thooms has quit [Remote host closed the connection]
octachron has joined #ocaml
<Algebr`> its not really enough information, do you mean in utop? compiling?
<hannes> hyper__: did you do eval `opam config env` in your shell?
tane has quit [Read error: Connection reset by peer]
<hyper__> just ran it, nothing changed
<hyper__> Algebr`: both when compiling and when trying to run in the "ocaml" repl
<ggole> In the toplevel, use #require
<Algebr`> try utop, opam install utop
<ggole> When compiling, indicate the package you are using (with -pkg or whatever)
<dario9> Hello everyone! I'm having trouble getting a Cohttp server thread to stop...
<dario9> I've created a "stop" thread and a "stopper" wakener with Lwt.wait...
<dario9> And fed the "stop" thread to Cohttp_lwt_unix.Server.create...
<dario9> Later on, a concurrent thread calls Lwt.wakeup on the "stopper"...
pyon has quit [Quit: reboot]
<dario9> But the Cohttp thread still won't stop...
<hyper__> Algebr`: utop gives the same error, Error: unbound module Core_kernel
<dario9> Is there anything I'm missing?
shinnya has quit [Ping timeout: 240 seconds]
<Algebr`> hyper__: you need to do the #require "core_kernel";;
<Algebr`> (assuming that core_kernel is the name of the package)
mcc has joined #ocaml
<hyper__> that does work!
<hyper__> Any ideas on how to get things to compile though?
<hyper__> oh the package argument
<hyper__> Thanks for the help!
<Algebr`> ocamlfind ocamlopt -package core_kernel -linkpkg foo.ml -o program
<Algebr`> something like that
<hyper__> thanks!
<hyper__> I couldn't even find the documentation for that
<hyper__> nothing on the opam site mentioned ocamlfind
<Algebr`> indeed, a failing
AlexRussia has quit [Ping timeout: 244 seconds]
<notdan> If I have a bunch of .cmo and .cmx files lying around, can I load a module in a REPL, such that all the modules are loaded recursively?
pyon has joined #ocaml
jnavila has joined #ocaml
<octachron> notdan, have you tried #load_rec ?
jnavila has quit [Ping timeout: 260 seconds]
<notdan> yes, but it doesn't want to load `Str' for some reason
<companion_cube> #require "str";;?
<notdan> oh, I have to add 'str.cma' to the `ocaml' as an argument
freusque has quit [Ping timeout: 240 seconds]
MercurialAlchemi has quit [Ping timeout: 244 seconds]
copy` has joined #ocaml
TheLemonMan has quit [Quit: "It's now safe to turn off your computer."]
Simn has joined #ocaml
fluter has quit [Ping timeout: 250 seconds]
wu_ng has quit [Ping timeout: 265 seconds]
fluter has joined #ocaml
tmtwd has joined #ocaml
FreeBirdLjj has joined #ocaml
MercurialAlchemi has joined #ocaml
john51_ has quit [Ping timeout: 244 seconds]
john51 has joined #ocaml
tane has joined #ocaml
al-damiri has joined #ocaml
dario9 has quit [Quit: Konversation terminated!]
dario9 has joined #ocaml
dario9 has quit [Client Quit]
MercurialAlchemi has quit [Ping timeout: 265 seconds]
AlexRussia has joined #ocaml
dario9 has joined #ocaml
freusque has joined #ocaml
freusque has quit [Read error: Connection reset by peer]
freusque has joined #ocaml
FreeBirdLjj has quit [Remote host closed the connection]
MercurialAlchemi has joined #ocaml
flux has joined #ocaml
jnavila has joined #ocaml
stux|RC has joined #ocaml
freusque has quit [Ping timeout: 252 seconds]
stux|RC-only has quit [Quit: Aloha!]
bruce_r has joined #ocaml
tmtwd has quit [Ping timeout: 250 seconds]
stux|RC-only has joined #ocaml
octachron has quit [Quit: Leaving]
stux|RC has quit [Quit: Aloha!]
valexey has quit [Quit: Leaving]
d0nn1e has quit [Ping timeout: 265 seconds]
d0nn1e has joined #ocaml
jnavila has quit [Ping timeout: 276 seconds]
<dario9> Any Cohttp gurus out there? I'm having trouble getting a Cohttp server thread to stop...
<dario9> I've created a "stop" thread and a "stopper" wakener with Lwt.wait...
<dario9> And fed the "stop" thread to Cohttp_lwt_unix.Server.create...
<dario9> Later on, a concurrent thread calls Lwt.wakeup on the "stopper"...
<dario9> But the Cohttp thread still won't stop...
<dario9> Is there anything I'm missing? (Thanks!)
<Algebr`> dario9: past open a github issue
<Algebr`> maybe* post
<dario9> Algebr`: Are you saying it might be a bug?
mengu has joined #ocaml
<Algebr`> dario9: I don't know cotthp well enough, but they'll probably be able to solve your issue and it will be de facto documentation for future comers.
<dario9> Algebr`: Okay. I'll wait a bit longer. Someone from the Cohttp cabal may yet pop up...
gautv has quit [Ping timeout: 240 seconds]
<Algebr`> right...or if there's a github issue they'll get an email and be able to reply...
<mengu> how can i unbox a value in an Lwt type?
<mengu> i have a function that needs to return unit but instead it returns unit Lwt.t
<mengu> another question is how can i make it return unit?
<mengu> here's a sample code:
<Algebr`> you don't really, you pass "get" the value using >>= or >|=
<mengu> how can i make it so write_ignore_file returns a unit instead of unit Lwt.t
<Algebr`> You could use Lwt.ignore_result
devol has quit [Read error: Connection reset by peer]
<Algebr`> do you could make write_to_gitignore take a trailing argument of ()
AlexDenisov has joined #ocaml
<Algebr`> and then >|= would be more "elegant" (opinion)
<mengu> huh. |> Lwt.ignore_result just worked fine. thanks Algebr`.
<mengu> Algebr`: http://codepad.org/YugzrBea this is my write_to_gitignore function
<mengu> do you mean it should be like write_to_gitignore content () = ... ?
<Algebr`> yea, an extra trailing argument of unit
<Algebr`> or even better, Lwt_io.with_file
<Algebr`> !lwt_io
<cube_bot> OK.
<Algebr`> !lwt_io
<mengu> thanks Algebr`
<mengu> i'll take a look
TheLemonMan has joined #ocaml
<dario9> Hey Algebr`, I followed your advice and simply opened a ticket: https://github.com/mirage/ocaml-cohttp/issues/505
<Algebr`> dario9: thank you, I'm also interested in seeing resulting code
valexey has joined #ocaml
natimic has joined #ocaml
larhat1 has joined #ocaml
dario9 has quit [Quit: Konversation terminated!]
larhat1 has quit [Quit: Leaving.]
yomimono has joined #ocaml
devol has joined #ocaml
CuriousErnestBro has joined #ocaml
<CuriousErnestBro> hello
<CuriousErnestBro> I've heard "OCaml makes you smarter", is this true?
<companion_cube> hard to tell :p
<Algebr`> CuriousErnestBro: it will help you see new ways of programming
phase_ has joined #ocaml
<valexey> Haskell is better for this :-)
<valexey> *for it
Heasummn has joined #ocaml
<companion_cube> who let you in? :p
rand__ has joined #ocaml
<pierpa> CuriousErnestBro: for me it hasn't worked!
<yomimono> CuriousErnestBro: since starting to work in OCaml I'm around too many smart people; I'm pretty sure I'm dumber than I used to be
_2can has quit [Ping timeout: 244 seconds]
<CuriousErnestBro> yomimono, I have the same experience but with R
<companion_cube> learn this one weird language, CS doctors hate it!
_2can has joined #ocaml
<Algebr`> R is a really cool lang, I think it forces you to learn some stats
<companion_cube> I think it's only useful if you need some stats anyway?
<valexey> learn ML in ML!
<CuriousErnestBro> I need stats (for school) so..
jbrown has quit [Ping timeout: 265 seconds]
<CuriousErnestBro> valexey, what do you mean by ML (didn't know there was a language called ML..)
slash^ has quit [Read error: Connection reset by peer]
<Algebr`> I think he meant Machine Learning
<valexey> Machine Learning in *ML language (ocaml for example)
<valexey> ;-)
<CuriousErnestBro> I'll be machine learning in python sometime later o.o
<Algebr`> they*
<Algebr`> CuriousErnestBro: python will give you many, many awesome libs for free.
<valexey> And many pain with dynamic typing... For free too :-)
<pierpa> and a lot of time for doing other things while the python programs run
bruce_r has quit [Ping timeout: 250 seconds]
_2can has quit [Ping timeout: 244 seconds]
<valexey> :-)
_2can has joined #ocaml
* CuriousErnestBro is learning C++ but doesn't know what it's good for except math and Qt
<Algebr`> if you're a student, then focusing on grades is maybe/probably the best thing...
<CuriousErnestBro> oh yeah, it was for fun. I learned python a while ago (am probably bad in it again) and for my school I need to know R and I'll have a C++ course in 2 months
yomimono has quit [Ping timeout: 240 seconds]
jbrown has joined #ocaml
yomimono has joined #ocaml
<tane> CuriousErnestBro, you can use C++ to write R extensions :P
<CuriousErnestBro> tane, I know that :p but I'm not nearly good enough with either to try to do that
<Algebr`> free practice =P
bruce_r has joined #ocaml
kakadu has joined #ocaml
pseudo-sue has joined #ocaml
AlexDenisov has quit [Quit: My Mac has gone to sleep. ZZZzzz…]
<Heasummn> How do I debug C/C++ bindings in Ocaml?
<Heasummn> LLVM is throwing a segfault
<pseudo-sue> hey, i'm completely new to ocaml, & have a very basic question: how do i figure out which modules are in which packages? i mean, if i'm missing a module, how do i know which package to install in order to get it?
<flux> that's a good question, and I'm afraid the solution isn't pretty. I would do something like find $(ocamlfind printconf destdir) -name module.cmi
<pseudo-sue> thanks! I'll try that out.
<flux> that finds only the top-level modules, so the module Batteries.IO would be found with batteries.cmi, but not io.cmi
<flux> btw, better use -iname to avoid case sensitivty issues
<flux> actually really I wouldn't use that, I would cd $(ocamlfind query somepackage); cd ..; find | grep -i module ;), but that find-based one seems elegant.. enough to make a shell script or an alias perhaps.
<pseudo-sue> nice. I'm tinkering around with some variations of that in my .bashrc now
<ggole> I think usually people guess based on the name
ggole has quit []
<kakadu> Heasummn: gdb
<Heasummn> kakadu, I figured it out by reading the docs, but it would be good to learn how one uses gdb with OCaml
<kakadu> It seems rather straightforward. Compiler mangles names and you can guess OCaml functions by gdb backtrace
<kakadu> And -g option, of course
<Heasummn> k
bruce_r has quit [Ping timeout: 255 seconds]
<Heasummn> Is there any "OOP Interface" in OCaml?
<Heasummn> I want to create an interface that the user can fill in.
<Heasummn> it's not nessecary, but it will make writing stuff a lot nicer
<kakadu> you can try with module types
rand__ has quit [Quit: leaving]
yomimono has quit [Ping timeout: 265 seconds]
<mengu> hi again. http://codepad.org/P5mKhJZ5 this utility does 3 things: if you pass an argument, it fetches that one. if you leave it empty, it tries to guess a lang name from your parent dir. if it cannot guess from the parent dir, it checks the file extensions and then presents you options. depending on the option you select it fetches it. after fetching it writes that to your .gitignore file. problem is: it is working perfect with utop however it
<mengu> does not write to file when i call it from the commandline
<mengu> what am i doing wrong?
eemax has quit [Quit: Page closed]
TheLemonMan has quit [Quit: "It's now safe to turn off your computer."]
<mengu> because they are not in the same thread?
CuriousErnestBro has quit [Quit: Leaving]
tane has quit [Quit: Leaving]
sdothum has quit [Quit: ZNC - 1.6.0 - http://znc.in]
sdothum has joined #ocaml
<mengu> indeed that's why
<def`> you should lift most of your code in lwt
<def`> and end with Lwt_main.run
<def`> (a bit handwavy explanation: the ignore result defers the computation, but your program finishes before...)
<mengu> def`: that is exactly what i did
<mengu> thanks.
<mengu> wanna do a code review for a n00b?
<def`> why not, but quickly, I don't have much time :)
<mengu> def`: thanks. if you have a github username, i can add you to the repo or share everything on codepad.org
<def`> let-def on github
<mengu> def`: just sent you an invitation
MercurialAlchemi has quit [Ping timeout: 255 seconds]
bruce_r has joined #ocaml
<copy`> I took ygrek's rich man's profiler, fixed it and added output for chromium's profiling format: http://i.imgur.com/Lls1bPh.png
<copy`> The result is quite nice, no instrumentation needed and works on native binaries
Simn has quit [Quit: Leaving]
sepp2k has quit [Quit: Leaving.]
minn2 has joined #ocaml
shinnya has joined #ocaml
minn has joined #ocaml
minn2 has quit [Ping timeout: 265 seconds]
<def`> mengu: I pushed a review branch, with remarks in code comments & patch messages
<mengu> thanks a lot def`
<def`> overall the code is good, no big mistake. A bit strange to me to mix Core & Lwt (Async is designed to be used with core), but that's fine.
<mengu> reading them right away
<mengu> def`: well, ocaml-cohttp was using lwt
<mengu> let me check if async allows me to perform http requests
<def`> check Cohttp_async on https://github.com/mirage/ocaml-cohttp
<mengu> hmm so use them both
<mengu> s/use/they use/
<def`> cohttp itself is independant of the concurrency lib
<def`> and provide implementation for lwt & async, then you choose
<mengu> awesome, did not get that
<mengu> before
devol has quit [Remote host closed the connection]
<mengu> def`: one question
<mengu> the reason i made it like module Github = struct ... end
<mengu> is that i could not get them work in utop
<def`> ah
<def`> with #use ?
<mengu> yes
<mengu> #use was including them just fine
<def`> use #mod_use
<def`> (which does what you did by hand)
<mengu> but when i do #use "add_gitignore" then it was failing to find Github in there
<mengu> i searched for some way of aliasing tho
<mengu> let me try mod_use
<mengu> def`: indeed
<mengu> #mod_use worked perfect
<mengu> thanks def`.
<def`> np
<def`> afk
<mengu> now let's learn how can i make this distributable
kakadu has quit [Remote host closed the connection]
hyper__ has quit [Ping timeout: 264 seconds]