<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Syntactic Sugar &#187; ocaml</title>
	<atom:link href="http://friggeri.net/blog/tag/ocaml/feed" rel="self" type="application/rss+xml" />
	<link>http://friggeri.net</link>
	<description>Adrien Friggeri's blog</description>
	<pubDate>Tue, 08 Jul 2008 16:05:57 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7-bleeding</generator>
	<language>en</language>
			<item>
		<title>Ciml : C in OCaml</title>
		<link>http://friggeri.net/blog/2008/02/26/ciml-c-in-ocaml</link>
		<comments>http://friggeri.net/blog/2008/02/26/ciml-c-in-ocaml#comments</comments>
		<pubDate>Tue, 26 Feb 2008 13:27:54 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[c]]></category>

		<category><![CDATA[code]]></category>

		<category><![CDATA[ocaml]]></category>

		<guid isPermaLink="false">http://www.friggeri.net/blog/2008/02/26/ciml-c-in-ocaml</guid>
		<description><![CDATA[Olivier has been busy extending my previous work on inlining C in OCaml, and it is pretty cool. You can get it from the following darcs repository.
/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbGxjYy5jaGFkb2suaW5mby8=">Olivier</a> has been busy extending my previous work on inlining C in <acronym title="Objective Caml">OCaml</acronym>, and it is pretty cool. You can get it from the following darcs repository.</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .co1 {color: #99968b;}.ch_code_container .es0 {color: #000099; font-weight: bold;}.ch_code_container .br0 {color: #66cc66;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}.ch_code_container .re0 {color: #e5786d;}.ch_code_container .re1 {color: #e5786d;}.ch_code_container .re2 {color: #cae682;}</style>
<div class="ch_code_container" style="font-family: monospace;">darcs get http://chadok.info/darcs/ciml/</p>
</div>
<p>Basically, it allows you to inline C in <acronym title="Objective Caml">OCaml</acronym> code, in a very fashionable way. Type conversion between <acronym title="Objective Caml">OCaml</acronym> and C is (almost always) automatically dealt with for base types (int, float, bool, string, etc.) and you can register and unregister custom converters. A few examples are shown in the <code>test.ml</code>.</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">letext</span> hello <span class="br0">&#40;</span>s:string<span class="br0">&#41;</span> : unit =&nbsp; &lt;&lt; <br />
&nbsp; printf<span class="br0">&#40;</span><span class="st0">&quot;Hello %s !<span class="es0">\n</span>&quot;</span>, s<span class="br0">&#41;</span>;<br />
&nbsp; Return<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&gt;&gt;<br />
<span class="kw1">letext</span> add <span class="br0">&#40;</span>a:int<span class="br0">&#41;</span> <span class="br0">&#40;</span>b:int<span class="br0">&#41;</span> : int =&nbsp; &lt;&lt; <br />
&nbsp; int c;<br />
&nbsp; c = a + b;<br />
&nbsp; Return<span class="br0">&#40;</span>c<span class="br0">&#41;</span>;<br />
&gt;&gt;</p>
<p><span class="coMULTI">(* Unregister the converters for int *)</span><br />
unregister_fromval : int<br />
unregister_toval : int</p>
<p><span class="coMULTI">(* Register converters *)</span><br />
register_fromval <span class="st0">&quot;Int_val&quot;</span> <span class="st0">&quot;int&quot;</span> : int<br />
register_toval <span class="st0">&quot;Val_int&quot;</span> : int</p>
</div>
<p>The idea behind all this syntaxic sugar for inlining C code in <acronym title="Objective Caml">OCaml</acronym> is to provide a natural way of using C and <acronym title="Objective Caml">OCaml</acronym> together to whoever wants to bind C libraries to <acronym title="Objective Caml">OCaml</acronym>. Of course, this is still under developement, and any ideas to improve it are welcome.</p> <img src="http://friggeri.net/wp-content/plugins/feed-statistics.php?view=1&post_id=97" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://friggeri.net/blog/2008/02/26/ciml-c-in-ocaml/feed</wfw:commentRss>
		</item>
		<item>
		<title>Inlining C code in OCaml, part II</title>
		<link>http://friggeri.net/blog/2008/02/13/inlining-c-code-in-ocaml-part-ii</link>
		<comments>http://friggeri.net/blog/2008/02/13/inlining-c-code-in-ocaml-part-ii#comments</comments>
		<pubDate>Tue, 12 Feb 2008 23:06:02 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[c]]></category>

		<category><![CDATA[code]]></category>

		<category><![CDATA[ocaml]]></category>

		<guid isPermaLink="false">http://www.friggeri.net/blog/2008/02/13/inline-c-la-suite</guid>
		<description><![CDATA[I finally managed to do what I was talking about this morning. There are a few awful things in the code, but it works.
Here is what one can write:
/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container [...]]]></description>
			<content:encoded><![CDATA[<p>I finally managed to do what I was talking about this morning. There are a few awful things in the code, but it works.</p>
<p>Here is what one can write:</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;">&lt;:c&lt;<br />
#include &lt;stdio.<span class="me1">h</span>&gt;<br />
&gt;&gt;</p>
<p>ext add <span class="br0">&#40;</span>a:int<span class="br0">&#41;</span> <span class="br0">&#40;</span>b:int<span class="br0">&#41;</span> : int =&nbsp; &lt;:cfun&lt; <br />
&nbsp; int c;<br />
&nbsp; c = Int_val<span class="br0">&#40;</span>a<span class="br0">&#41;</span> + Int_val<span class="br0">&#40;</span>b<span class="br0">&#41;</span>;<br />
&nbsp; CAMLreturn<span class="br0">&#40;</span>Val_int<span class="br0">&#40;</span>c<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&gt;&gt;</p>
<p>ext hello <span class="br0">&#40;</span>s:string<span class="br0">&#41;</span> : unit =&nbsp; &lt;:cfun&lt; <br />
&nbsp; printf<span class="br0">&#40;</span><span class="st0">&quot;Hello %s !<span class="es0">\n</span>&quot;</span>, String_val<span class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; CAMLreturn<span class="br0">&#40;</span>Val_unit<span class="br0">&#41;</span>;<br />
&gt;&gt;</p>
<p>ext ping_pong <span class="br0">&#40;</span>n:int<span class="br0">&#41;</span> : int = &lt;:cfun&lt;<br />
&nbsp; int c = Int_val<span class="br0">&#40;</span>caml_callback<span class="br0">&#40;</span> *caml_named_value<span class="br0">&#40;</span><span class="st0">&quot;fact&quot;</span><span class="br0">&#41;</span>, n<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; printf<span class="br0">&#40;</span><span class="st0">&quot;C : ping. fact 4 = %d<span class="es0">\n</span>&quot;</span>, c<span class="br0">&#41;</span>;<br />
&nbsp; CAMLreturn<span class="br0">&#40;</span>Val_int<span class="br0">&#40;</span>c<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&gt;&gt;</p>
<p><span class="kw1">let</span> fact n =<br />
&nbsp; <span class="kw1">let</span> <span class="kw1">rec</span> fact acc = <span class="kw1">function</span><br />
&nbsp; &nbsp; &nbsp; <span class="nu0">0</span> -&gt; acc<br />
&nbsp; &nbsp; | n -&gt; fact <span class="br0">&#40;</span>n*acc<span class="br0">&#41;</span> <span class="br0">&#40;</span>n<span class="nu0">-1</span><span class="br0">&#41;</span><br />
&nbsp; <span class="kw1">in</span><br />
&nbsp; fact <span class="nu0">1</span> n</p>
<p><span class="kw1">let</span> _ = <br />
&nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9DYWxsYmFjay5odG1s"><span class="kw2">Callback</span></a>.<span class="me1">register</span> <span class="st0">&quot;fact&quot;</span> fact;<br />
&nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QcmludGYuaHRtbA=="><span class="kw2">Printf</span></a>.<span class="me1">printf</span> <span class="st0">&quot;%d<span class="es0">\n</span>%!&quot;</span> <span class="br0">&#40;</span>add <span class="nu0">1</span> <span class="nu0">5</span><span class="br0">&#41;</span>;<br />
&nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QcmludGYuaHRtbA=="><span class="kw2">Printf</span></a>.<span class="me1">printf</span> <span class="st0">&quot;Ocaml : pong. fact 4 = %d<span class="es0">\n</span>%!&quot;</span> <span class="br0">&#40;</span>ping_pong <span class="nu0">4</span><span class="br0">&#41;</span>;<br />
&nbsp; hello <span class="st0">&quot;World&quot;</span>;</p>
</div>
<p>The <code>ext</code> keyword is the equivalent of <code>let</code> to define <code>external</code> functions. All types must be specified (for the arguments <strong>and</strong> for the return value. Camlp4 the generates the C function, the external declaration etc.</p>
<div class="download_box box">
<div class='right'><span class="label">Downloaded : </span>  <span class="value">98 times</span></div>
<div><span class="label">File : </span>  <span class="value">inlinec-0.42.tar.gz</span></div>
<div class='right'><span class="dl">    <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZyaWdnZXJpLm5ldC9kb3dubG9hZC9pbmxpbmVjLTAuNDIudGFyLmd6">download</a>  </span></div>
<div><span class="label">Size: </span>  <span class="value">1.4 ko</span></div>
</div>
<div class="clear"></div> <img src="http://friggeri.net/wp-content/plugins/feed-statistics.php?view=1&post_id=93" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://friggeri.net/blog/2008/02/13/inlining-c-code-in-ocaml-part-ii/feed</wfw:commentRss>
		</item>
		<item>
		<title>Inlining C code in OCaml</title>
		<link>http://friggeri.net/blog/2008/02/12/inlining-c-code-in-ocaml</link>
		<comments>http://friggeri.net/blog/2008/02/12/inlining-c-code-in-ocaml#comments</comments>
		<pubDate>Tue, 12 Feb 2008 16:13:38 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[c]]></category>

		<category><![CDATA[code]]></category>

		<category><![CDATA[ocaml]]></category>

		<guid isPermaLink="false">http://www.friggeri.net/blog/2008/02/12/inliner-du-c-dans-ocaml</guid>
		<description><![CDATA[A great thing about OCaml is the possibility of creating bindings with C. The bad thing about it is that it&#039;s a pain to do. Olivier and I are currently thinking about a way to make that less painful. Here is a first draft : inlining C code in OCaml, in order to avoir multiple [...]]]></description>
			<content:encoded><![CDATA[<p>A great thing about <acronym title="Objective Caml">OCaml</acronym> is the possibility of creating bindings with C. The bad thing about it is that it&#039;s a pain to do. <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbGxjYy5jaGFkb2suaW5mby8=">Olivier</a> and I are currently thinking about a way to make that less painful. Here is a first draft : inlining C code in <acronym title="Objective Caml">OCaml</acronym>, in order to avoir multiple files.</p>
<p>Using camlp4, we extract the <em>quotations</em> containing C code and we dump that in a temporary <code>.c</code> file, and compile it. Here is an example:</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;">&lt;:c&lt;<br />
#include &lt;caml/mlvalues.<span class="me1">h</span>&gt;<br />
#include &lt;caml/memory.<span class="me1">h</span>&gt;<br />
#include &lt;caml/alloc.<span class="me1">h</span>&gt;<br />
#include &lt;caml/custom.<span class="me1">h</span>&gt;<br />
&gt;&gt;</p>
<p><span class="kw1">external</span> add: int -&gt; int -&gt; int = <span class="st0">&quot;add&quot;</span> <br />
&lt;:c&lt; <br />
value add<span class="br0">&#40;</span>value a, value b<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; int c;<br />
&nbsp; CAMLparam2<span class="br0">&#40;</span>a,b<span class="br0">&#41;</span>;<br />
&nbsp; c = Int_val<span class="br0">&#40;</span>a<span class="br0">&#41;</span> + Int_val<span class="br0">&#40;</span>b<span class="br0">&#41;</span>;<br />
&nbsp; CAMLreturn<span class="br0">&#40;</span>Val_int<span class="br0">&#40;</span>c<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
&gt;&gt;</p>
<p><span class="kw1">let</span> _ = <br />
&nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QcmludGYuaHRtbA=="><span class="kw2">Printf</span></a>.<span class="me1">printf</span> <span class="st0">&quot;La réponse est %d<span class="es0">\n</span>%!&quot;</span> <span class="br0">&#40;</span>add <span class="nu0">21</span> <span class="nu0">21</span><span class="br0">&#41;</span>;</p>
</div>
<p>The thing we would like to do is the following:</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">let</span> add a b = &lt;:cfun&lt;<br />
&nbsp; int c = Int_val<span class="br0">&#40;</span>a<span class="br0">&#41;</span> + Int_val<span class="br0">&#40;</span>b<span class="br0">&#41;</span>;<br />
&nbsp; CAMLreturn<span class="br0">&#40;</span>Val_int<span class="br0">&#40;</span>c<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&gt;&gt;</p>
</div>
<p>Which would be converted to:</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">external</span> add: int -&gt; int -&gt; int = <span class="st0">&quot;add&quot;</span></p>
</div>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .kw3 {color: #cae682;}.ch_code_container .kw4 {color: #cae682;}</style>
<div class="ch_code_container" style="font-family: monospace;">value add <span class="br0">&#40;</span>value a, value b<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; CAMLparams2<span class="br0">&#40;</span>a,b<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw4">int</span> c = Int_val<span class="br0">&#40;</span>a<span class="br0">&#41;</span> + Int_val<span class="br0">&#40;</span>b<span class="br0">&#41;</span>;<br />
&nbsp; CAMLreturn<span class="br0">&#40;</span>Val_int<span class="br0">&#40;</span>c<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
</div>
<div class="download_box box">
<div class='right'><span class="label">Downloaded : </span>  <span class="value">95 times</span></div>
<div><span class="label">File : </span>  <span class="value">inlinec.tar.gz</span></div>
<div class='right'><span class="dl">    <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZyaWdnZXJpLm5ldC9kb3dubG9hZC9pbmxpbmVjLnRhci5neg==">download</a>  </span></div>
<div><span class="label">Size: </span>  <span class="value">732 o</span></div>
</div>
<div class="clear"></div> <img src="http://friggeri.net/wp-content/plugins/feed-statistics.php?view=1&post_id=92" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://friggeri.net/blog/2008/02/12/inlining-c-code-in-ocaml/feed</wfw:commentRss>
		</item>
		<item>
		<title>Protoml + Camlp4</title>
		<link>http://friggeri.net/blog/2008/02/11/protoml-camlp4</link>
		<comments>http://friggeri.net/blog/2008/02/11/protoml-camlp4#comments</comments>
		<pubDate>Mon, 11 Feb 2008 17:28:31 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[camlp4]]></category>

		<category><![CDATA[code]]></category>

		<category><![CDATA[ocaml]]></category>

		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.friggeri.net/blog/2008/02/11/protoml-camlp4</guid>
		<description><![CDATA[A little update to this morning&#039;s article, I wrote a little camlp4 extension which makes it easier to user the prototype module (and it doesn&#039;t overwrite the records).
/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp [...]]]></description>
			<content:encoded><![CDATA[<p>A little update to <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=L2Jsb2cvMjAwOC8wMi8xMS9vY2FtbC1vcmllbnRlLXByb3RvdHlwZQ==">this morning&#039;s article</a>, I wrote a little camlp4 extension which makes it easier to user the prototype module (and it doesn&#039;t overwrite the records).</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">let</span> _ = <br />
&nbsp; <span class="kw1">let</span> p = <span class="br0">&#123;</span><span class="br0">&#125;</span> <span class="kw1">in</span><br />
&nbsp; p.<span class="me1">foo</span> &lt;- <span class="st0">&quot;p.foo&quot;</span>;<br />
&nbsp; p.<span class="me1">baz</span> &lt;- <span class="st0">&quot;p.baz&quot;</span>;</p>
<p>&nbsp; <span class="kw1">let</span> o = <span class="br0">&#123;</span><span class="br0">&#125;</span>|p| <span class="kw1">in</span><br />
&nbsp; o.<span class="me1">foo</span> &lt;- <span class="st0">&quot;o.foo&quot;</span>;<br />
&nbsp; o.<span class="me1">bar</span> &lt;- <span class="br0">&#40;</span><span class="kw1">fun</span> f -&gt; f <span class="br0">&#40;</span>o.<span class="me1">baz</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QZXJ2YXNpdmVzLmh0bWwjVkFMcHJpbnRfZW5kbGluZQ=="><span class="kw3">print_endline</span></a> <span class="br0">&#40;</span>p.<span class="me1">foo</span><span class="br0">&#41;</span>;<br />
&nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QZXJ2YXNpdmVzLmh0bWwjVkFMcHJpbnRfZW5kbGluZQ=="><span class="kw3">print_endline</span></a> <span class="br0">&#40;</span>p.<span class="me1">baz</span><span class="br0">&#41;</span>;<br />
&nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QZXJ2YXNpdmVzLmh0bWwjVkFMcHJpbnRfZW5kbGluZQ=="><span class="kw3">print_endline</span></a> <span class="br0">&#40;</span>o.<span class="me1">foo</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span>o.<span class="me1">bar</span><span class="br0">&#41;</span> : &#039;a-&gt;&#039;b<span class="br0">&#41;</span> <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QZXJ2YXNpdmVzLmh0bWwjVkFMcHJpbnRfZW5kbGluZQ=="><span class="kw3">print_endline</span></a>;</p>
</div>
<div class="download_box box">
<div class='right'><span class="label">Downloaded : </span>  <span class="value">93 times</span></div>
<div><span class="label">File : </span>  <span class="value">protoml.tar.gz</span></div>
<div class='right'><span class="dl">    <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZyaWdnZXJpLm5ldC9kb3dubG9hZC9wcm90b21sLnRhci5neg==">download</a>  </span></div>
<div><span class="label">Size: </span>  <span class="value">957 o</span></div>
</div>
<div class="clear"></div> <img src="http://friggeri.net/wp-content/plugins/feed-statistics.php?view=1&post_id=90" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://friggeri.net/blog/2008/02/11/protoml-camlp4/feed</wfw:commentRss>
		</item>
		<item>
		<title>Prototype based OCaml</title>
		<link>http://friggeri.net/blog/2008/02/11/prototype-based-ocaml</link>
		<comments>http://friggeri.net/blog/2008/02/11/prototype-based-ocaml#comments</comments>
		<pubDate>Mon, 11 Feb 2008 12:02:52 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[code]]></category>

		<category><![CDATA[ocaml]]></category>

		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.friggeri.net/blog/2008/02/11/ocaml-oriente-prototype</guid>
		<description><![CDATA[Talking about prototypes, here is a little module which allows prototype based programming in OCaml. I&#039;ll warn you right now : it&#039;s horrible, but funny.
/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: [...]]]></description>
			<content:encoded><![CDATA[<p>Talking about prototypes, here is a little module which allows prototype based programming in <acronym title="Objective Caml">OCaml</acronym>. I&#039;ll warn you right now : it&#039;s horrible, but funny.</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">type</span> obj = <br />
&nbsp; &nbsp; Empty<br />
&nbsp; | <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9PYmouaHRtbA=="><span class="kw2">Obj</span></a> <span class="kw1">of</span> <span class="br0">&#40;</span>string, string<span class="br0">&#41;</span> <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9IYXNodGJsLmh0bWw="><span class="kw2">Hashtbl</span></a>.<span class="me1">t</span> * obj</p>
<p><span class="kw1">let</span> create ?<span class="br0">&#40;</span>proto=Empty<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> = <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9PYmouaHRtbA=="><span class="kw2">Obj</span></a> <span class="br0">&#40;</span><a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9IYXNodGJsLmh0bWw="><span class="kw2">Hashtbl</span></a>.<span class="me1">create</span> <span class="nu0">111</span>, proto<span class="br0">&#41;</span></p>
<p><span class="kw1">let</span> set o k v = <br />
&nbsp; <span class="kw1">match</span> o <span class="kw1">with</span><br />
&nbsp; &nbsp; Empty -&gt; <span class="kw1">raise</span> Not_found<br />
&nbsp; | <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9PYmouaHRtbA=="><span class="kw2">Obj</span></a> <span class="br0">&#40;</span>o, p<span class="br0">&#41;</span> -&gt; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9IYXNodGJsLmh0bWw="><span class="kw2">Hashtbl</span></a>.<span class="me1">replace</span> o k <span class="br0">&#40;</span><a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9PYmouaHRtbA=="><span class="kw2">Obj</span></a>.<span class="me1">magic</span> v<span class="br0">&#41;</span></p>
<p><span class="kw1">let</span> <span class="kw1">rec</span> get o k = <br />
&nbsp; <span class="kw1">match</span> o <span class="kw1">with</span><br />
&nbsp; &nbsp; Empty -&gt; <span class="kw1">raise</span> Not_found<br />
&nbsp; | <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9PYmouaHRtbA=="><span class="kw2">Obj</span></a> <span class="br0">&#40;</span>o, p<span class="br0">&#41;</span> -&gt; <br />
&nbsp; &nbsp; &nbsp; <span class="kw1">try</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9PYmouaHRtbA=="><span class="kw2">Obj</span></a>.<span class="me1">magic</span> <span class="br0">&#40;</span><a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9IYXNodGJsLmh0bWw="><span class="kw2">Hashtbl</span></a>.<span class="me1">find</span> o k<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">with</span> Not_found -&gt; get p k</p>
</div>
<p>There is nothing difficult to understand (it was actually difficult to <strong>do</strong>). An object is just a hashtable and a parent object. Typing is bypassed using <code>Obj.magic</code></p>
<p>Let&#039;s have a little fun:</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">open</span> Proto</p>
<p><span class="kw1">let</span> _ = <br />
&nbsp; <span class="kw1">let</span> p = create <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">in</span><br />
&nbsp; set p <span class="st0">&quot;foo&quot;</span> <span class="st0">&quot;p.foo&quot;</span>;<br />
&nbsp; set p <span class="st0">&quot;baz&quot;</span> <span class="st0">&quot;p.baz&quot;</span>;</p>
<p>&nbsp; <span class="kw1">let</span> o = create ~proto:p <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">in</span><br />
&nbsp; set o <span class="st0">&quot;foo&quot;</span> <span class="st0">&quot;o.foo&quot;</span>;<br />
&nbsp; set o <span class="st0">&quot;bar&quot;</span> <span class="br0">&#40;</span><span class="kw1">fun</span> f -&gt; f <span class="br0">&#40;</span>get o <span class="st0">&quot;baz&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QZXJ2YXNpdmVzLmh0bWwjVkFMcHJpbnRfZW5kbGluZQ=="><span class="kw3">print_endline</span></a> <span class="br0">&#40;</span>get p <span class="st0">&quot;foo&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QZXJ2YXNpdmVzLmh0bWwjVkFMcHJpbnRfZW5kbGluZQ=="><span class="kw3">print_endline</span></a> <span class="br0">&#40;</span>get p <span class="st0">&quot;baz&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QZXJ2YXNpdmVzLmh0bWwjVkFMcHJpbnRfZW5kbGluZQ=="><span class="kw3">print_endline</span></a> <span class="br0">&#40;</span>get o <span class="st0">&quot;foo&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span>get o <span class="st0">&quot;bar&quot;</span><span class="br0">&#41;</span> : &#039;a-&gt;&#039;b<span class="br0">&#41;</span> <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QZXJ2YXNpdmVzLmh0bWwjVkFMcHJpbnRfZW5kbGluZQ=="><span class="kw3">print_endline</span></a>;</p>
</div>
<p>The result:</p>
<style type="text/css"></style>
<div class="ch_code_container" style="font-family: monospace;">$ ./prototest<br />
p.foo<br />
p.baz<br />
o.foo<br />
p.baz</p>
</div>
<p>Note : This is only a proof of concept, never use this in <acronym title="Objective Caml">OCaml</acronym>, it is not at all compliant with <acronym title="Objective Caml">OCaml</acronym> philosophy. It&#039;s funny, however <img src='http://friggeri.net/wp-includes/images/smilies/icon_biggrin.jpg' alt=':D' class='wp-smiley' /></p> <img src="http://friggeri.net/wp-content/plugins/feed-statistics.php?view=1&post_id=89" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://friggeri.net/blog/2008/02/11/prototype-based-ocaml/feed</wfw:commentRss>
		</item>
		<item>
		<title>Joo, JavaScript on OCaml</title>
		<link>http://friggeri.net/blog/2008/02/07/joo-javascript-on-ocaml</link>
		<comments>http://friggeri.net/blog/2008/02/07/joo-javascript-on-ocaml#comments</comments>
		<pubDate>Thu, 07 Feb 2008 16:08:12 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[javascript]]></category>

		<category><![CDATA[ocaml]]></category>

		<category><![CDATA[release]]></category>

		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.friggeri.net/blog/2008/02/07/joo-javascript-on-ocaml</guid>
		<description><![CDATA[My readers might have noticed that I really like JavaScript and OCaml. Thus, it&#039;s natural to write a webserver in OCaml which serves scripts written in JavaScript. Crazy ? Maybe a little, but as the guys from  mod_js said: others do worse.
I started by modifying Thumper which I slightly modified (in order to deal [...]]]></description>
			<content:encoded><![CDATA[<p>My readers might have noticed that I really like JavaScript and <acronym title="Objective Caml">OCaml</acronym>. Thus, it&#039;s natural to write a webserver in <acronym title="Objective Caml">OCaml</acronym> which serves scripts written in JavaScript. Crazy ? Maybe a little, but as the guys from  <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5tb2Rqcy5vcmcv">mod_js</a> said: <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL21vZGJmLnNvdXJjZWZvcmdlLm5ldC8=">others</a> do worse.</p>
<p>I started by modifying <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy52ZWN0b3Itc2V2ZW4uY29tLzIwMDcvMDcvMTcvdGh1bXBlci1teS11Z2x5LWxpdHRsZS1vY2FtbC13ZWItc2VydmVyLw==">Thumper</a> which I slightly modified (in order to deal with post queries). Then I added <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5scmkuZnIvfmZpbGxpYXRyL2Z0cC9vY2FtbC9jZ2kv"><acronym title="Objective Caml">OCaml</acronym> <acronym title="Common Gateway Interface">CGI</acronym></a> to encode and decode queries, <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2FsYWluLmZyaXNjaC5mci9zb2Z0Lmh0bWwjc3BpZGVy">SpiderCaml</a> which includes <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9qcy9zcGlkZXJtb25rZXkv">SpiderMonkey</a> in <acronym title="Objective Caml">OCaml</acronym> and  <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3JhZXZub3MucGVubm11c2gub3JnL2NvZGUvb2NhbWwtbXlzcWwv"><acronym title="Objective Caml">OCaml</acronym> Mysql</a> to use MySQL. Actually this was more like doing Lego than coding&#8230;</p>
<p>What can it do ?<br />
URIs are parsed as : <code>/module/action/arg1/arg2/arg3</code>. This will execute <code>Module.action(arg1, arg2, arg3)</code>, where <code>Module</code> is defined in the file <code>modules/module.js</code>. The default module being <em>home</em> and the default action, <em>index</em>.</p>
<p>This being said, their is a <code>Joo</code> object in the global namespace which contains useful stuff:</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #cae682;}.ch_code_container .co1 {color: #99968b;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}.ch_code_container .re0 {color: #95e454;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="co1">// headers</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span>e <span class="kw1">in</span> Joo.<span class="me1">Headers</span><span class="br0">&#41;</span> <span class="kw3">print</span><span class="br0">&#40;</span>e+<span class="st0">&quot; &quot;</span>+Joo.<span class="me1">Headers</span><span class="br0">&#91;</span>e<span class="br0">&#93;</span>+<span class="st0">&quot;&lt;br/&gt;&quot;</span><span class="br0">&#41;</span>;</p>
<p><span class="co1">//&nbsp; GET</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span>e <span class="kw1">in</span> Joo.<span class="me1">Get</span><span class="br0">&#41;</span> <span class="kw3">print</span><span class="br0">&#40;</span>e+<span class="st0">&quot; &quot;</span>+Joo.<span class="me1">Headers</span><span class="br0">&#91;</span>e<span class="br0">&#93;</span>+<span class="st0">&quot;&lt;br/&gt;&quot;</span><span class="br0">&#41;</span>;</p>
<p><span class="co1">// POST</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span>e <span class="kw1">in</span> Joo.<span class="me1">Post</span><span class="br0">&#41;</span> <span class="kw3">print</span><span class="br0">&#40;</span>e+<span class="st0">&quot; &quot;</span>+Joo.<span class="me1">Headers</span><span class="br0">&#91;</span>e<span class="br0">&#93;</span>+<span class="st0">&quot;&lt;br/&gt;&quot;</span><span class="br0">&#41;</span>;</p>
<p><span class="co1">// a mysql wrapper</span><br />
Joo.<span class="me1">mysql</span>.<span class="me1">connect</span><span class="br0">&#40;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; host:<span class="st0">&quot;localhost&quot;</span>,<br />
&nbsp; &nbsp; user:<span class="st0">&quot;user&quot;</span>,<br />
&nbsp; &nbsp; <span class="kw3">name</span>:<span class="st0">&quot;database&quot;</span><br />
&nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;<br />
Joo.<span class="me1">mysql</span>.<span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&#039;select * from foo&#039;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">while</span><span class="br0">&#40;</span>r = Joo.<span class="me1">mysql</span>.<span class="me1">fetch</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw3">print</span><span class="br0">&#40;</span>r.<span class="me1">id</span> + <span class="st0">&quot;&lt;br/&gt;&quot;</span><span class="br0">&#41;</span>;</p>
<p><span class="co1">// an include function</span><br />
Joo.<span class="me1">include</span><span class="br0">&#40;</span><span class="st0">&#039;foo/bar.js&#039;</span><span class="br0">&#41;</span>;</p>
</div>
<p>Note : the <code>print</code> function just adds text to the output buffer, their is no control on the flushing, sorry. Everything is sent at the end.<br />
Moreover, I have added the <acronym title="Multipurpose Internet Mail Extension">MIME</acronym> types only for html and jpeg files, you may want to add other <acronym title="Multipurpose Internet Mail Extension">MIME</acronym> types in <code>main.ml</code></p>
<div class="download_box box">
<div class='right'><span class="label">Downloaded : </span>  <span class="value">92 times</span></div>
<div><span class="label">File : </span>  <span class="value">joo.tar.gz</span></div>
<div class='right'><span class="dl">    <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZyaWdnZXJpLm5ldC9kb3dubG9hZC9qb28udGFyLmd6">download</a>  </span></div>
<div><span class="label">Size: </span>  <span class="value">47.1 ko</span></div>
</div>
<div class="clear"></div> <img src="http://friggeri.net/wp-content/plugins/feed-statistics.php?view=1&post_id=88" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://friggeri.net/blog/2008/02/07/joo-javascript-on-ocaml/feed</wfw:commentRss>
		</item>
		<item>
		<title>Sandclick</title>
		<link>http://friggeri.net/blog/2007/12/17/sandclick</link>
		<comments>http://friggeri.net/blog/2007/12/17/sandclick#comments</comments>
		<pubDate>Mon, 17 Dec 2007 15:35:53 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[randomness]]></category>

		<category><![CDATA[game]]></category>

		<category><![CDATA[ocaml]]></category>

		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/12/17/sandclick</guid>
		<description><![CDATA[Often when I feel depressed I have this imperious need to create something, anything. And those days, I&#039;m not so well, so I code quite a lot. Let me introduce you to Sandclick, a stupid little game written in less than an hour in OCaml. The code is awful, but nevermind&#8230;
First, what does it look [...]]]></description>
			<content:encoded><![CDATA[<p>Often when I feel depressed I have this imperious need to create something, anything. And those days, I&#039;m not so well, so I code quite a lot. Let me introduce you to Sandclick, a stupid little game written in less than an hour in <acronym title="Objective Caml">OCaml</acronym>. The code is awful, but nevermind&#8230;</p>
<p>First, what does it look like ?</p>
<div style="text-align:center;"><img src="/wp-content/sandclick.png"/></div>
<p>I bet most of you have already played to those games where you have to click on colored boxes on a grid to make them disappear. Sandclick is exactly this king of game, the only difference is in the way it deals with falling boxes.</p>
<p>Usually, in those games, when a colored block is above and empty space, it falls into it. In Sandclick, blocks fall like sand : grains can fall on the side, here is what happens when there is an empty space:</p>
<ul>
<li>if there is something above, this something falls down</li>
<li>if not, then the content of what is on the top left or top right falls</li>
</ul>
<p>And it goes on and on until it stabilizes.</p>
<div class="download_box box">
<div class='right'><span class="label">Downloaded : </span>  <span class="value">125 times</span></div>
<div><span class="label">File : </span>  <span class="value">sandclick.tar.gz</span></div>
<div class='right'><span class="dl">    <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZyaWdnZXJpLm5ldC9kb3dubG9hZC9zYW5kY2xpY2sudGFyLmd6">download</a>  </span></div>
<div><span class="label">Size: </span>  <span class="value">9.5 ko</span></div>
</div>
<div class="clear"></div> <img src="http://friggeri.net/wp-content/plugins/feed-statistics.php?view=1&post_id=78" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://friggeri.net/blog/2007/12/17/sandclick/feed</wfw:commentRss>
		</item>
		<item>
		<title>OCaml zipper and holidays</title>
		<link>http://friggeri.net/blog/2007/08/03/ocaml-zipper-and-holidays</link>
		<comments>http://friggeri.net/blog/2007/08/03/ocaml-zipper-and-holidays#comments</comments>
		<pubDate>Fri, 03 Aug 2007 13:52:22 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[randomness]]></category>

		<category><![CDATA[ocaml]]></category>

		<category><![CDATA[zipper]]></category>

		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/08/03/zipper-ocaml-et-vacances</guid>
		<description><![CDATA[This blog will be in holidays until the 15th of August. This is a little something to keep you busy while waiting for my holiday pictures : a light and nifty implementation of list zippers.
Basically a zipper is a list which has a cursor, thus reading and moving through is non destructive.
/* GeSHi (c) Nigel [...]]]></description>
			<content:encoded><![CDATA[<p>This blog will be in holidays until the 15th of August. This is a little something to keep you busy while waiting for my holiday pictures : a light and nifty implementation of list zippers.</p>
<p>Basically a zipper is a list which has a cursor, thus reading and moving through is non destructive.</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">sig</span><br />
&nbsp; <span class="kw1">type</span> &#039;a t = &#039;a list * &#039;a list<br />
&nbsp; <span class="kw1">exception</span> Out_of_bound<br />
&nbsp; <span class="kw1">exception</span> End_of_zip<br />
&nbsp; <span class="kw1">val</span> empty : &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> next : &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> previous : &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> first : &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> last : &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> get : &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a<br />
&nbsp; <span class="kw1">val</span> insert : &#039;a -&gt; &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> delete : &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> replace : &#039;a -&gt; &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> rev : &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> append : &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> iter : <span class="br0">&#40;</span>&#039;a -&gt; unit<span class="br0">&#41;</span> -&gt; &#039;a Zip.<span class="me1">t</span> -&gt; unit<br />
&nbsp; <span class="kw1">val</span> chop : &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> from_list : &#039;a list -&gt; &#039;a Zip.<span class="me1">t</span><br />
&nbsp; <span class="kw1">val</span> to_list : &#039;a Zip.<span class="me1">t</span> -&gt; &#039;a list<br />
<span class="kw1">end</span></p>
</div>
<p>A simple example : </p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">open</span> <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QcmludGYuaHRtbA=="><span class="kw2">Printf</span></a></p>
<p><span class="kw1">let</span> _ = <br />
&nbsp; <span class="kw1">let</span> print = <span class="kw1">function</span><br />
&nbsp; &nbsp; &nbsp; b, <span class="br0">&#91;</span><span class="br0">&#93;</span> -&gt; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9MaXN0Lmh0bWw="><span class="kw2">List</span></a>.<span class="me1">iter</span> <span class="br0">&#40;</span>printf <span class="st0">&quot; %d&quot;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9MaXN0Lmh0bWw="><span class="kw2">List</span></a>.<span class="me1">rev</span> b<span class="br0">&#41;</span>; printf <span class="st0">&quot;.<span class="es0">\n</span>&quot;</span><br />
&nbsp; &nbsp; | b, c::a -&gt; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9MaXN0Lmh0bWw="><span class="kw2">List</span></a>.<span class="me1">iter</span> <span class="br0">&#40;</span>printf <span class="st0">&quot; %d&quot;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9MaXN0Lmh0bWw="><span class="kw2">List</span></a>.<span class="me1">rev</span> b<span class="br0">&#41;</span>; printf <span class="st0">&quot;.%d&quot;</span> c; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9MaXN0Lmh0bWw="><span class="kw2">List</span></a>.<span class="me1">iter</span> <span class="br0">&#40;</span>printf <span class="st0">&quot; %d&quot;</span><span class="br0">&#41;</span> a; printf <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><br />
&nbsp; <span class="kw1">in</span><br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">empty</span> <span class="kw1">in</span> <br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">insert</span> <span class="nu0">5</span> z <span class="kw1">in</span> <br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z2 = Zip.<span class="me1">from_list</span> <span class="br0">&#91;</span><span class="nu0">1</span>;<span class="nu0">2</span>;<span class="nu0">3</span>;<span class="nu0">4</span><span class="br0">&#93;</span> <span class="kw1">in</span><br />
&nbsp; &nbsp; print z2;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">append</span> z2 z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">next</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">next</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">next</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">previous</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">last</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">previous</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">previous</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">previous</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">insert</span> <span class="nu0">7</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">replace</span> <span class="nu0">9</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z;<br />
&nbsp; <span class="kw1">let</span> z = Zip.<span class="me1">delete</span> z <span class="kw1">in</span><br />
&nbsp; &nbsp; print z</p>
</div>
<p>Its result :</p>
<style type="text/css"></style>
<div class="ch_code_container" style="font-family: monospace;">.5<br />
.1 2 3 4<br />
.1 2 3 4 5<br />
&nbsp;1.2 3 4 5<br />
&nbsp;1 2.3 4 5<br />
&nbsp;1 2 3.4 5<br />
&nbsp;1 2.3 4 5<br />
&nbsp;1 2 3 4 5.<br />
&nbsp;1 2 3 4.5<br />
&nbsp;1 2 3.4 5<br />
&nbsp;1 2.3 4 5<br />
&nbsp;1 2.7 3 4 5<br />
&nbsp;1 2.9 3 4 5<br />
&nbsp;1 2.3 4 5</p>
</div>
<div class="download_box box">
<div class='right'><span class="label">Downloaded : </span>  <span class="value">104 times</span></div>
<div><span class="label">File : </span>  <span class="value">ml_zipper.tar.gz</span></div>
<div class='right'><span class="dl">    <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZyaWdnZXJpLm5ldC9kb3dubG9hZC9tbF96aXBwZXIudGFyLmd6">download</a>  </span></div>
<div><span class="label">Size: </span>  <span class="value">1 ko</span></div>
</div>
<div class="clear"></div> <img src="http://friggeri.net/wp-content/plugins/feed-statistics.php?view=1&post_id=66" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://friggeri.net/blog/2007/08/03/ocaml-zipper-and-holidays/feed</wfw:commentRss>
		</item>
		<item>
		<title>List comprehension in OCaml</title>
		<link>http://friggeri.net/blog/2007/07/24/list-comprehension-in-ocaml</link>
		<comments>http://friggeri.net/blog/2007/07/24/list-comprehension-in-ocaml#comments</comments>
		<pubDate>Tue, 24 Jul 2007 09:32:52 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[code]]></category>

		<category><![CDATA[list comprehension]]></category>

		<category><![CDATA[ocaml]]></category>

		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/24/comprehension-de-listes-en-ocaml/</guid>
		<description><![CDATA[A nifty thing when working with list is to use list comprehension. This is something natural for a python programmer :
/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container [...]]]></description>
			<content:encoded><![CDATA[<p>A nifty thing when working with list is to use <em>list comprehension</em>. This is something natural for a python programmer :</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #cae682;}.ch_code_container .kw3 {color: #e5786d;}.ch_code_container .kw4 {color: #e5786d;}.ch_code_container .co1 {color: #99968b;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #000099; font-weight: bold;}.ch_code_container .br0 {color: #66cc66;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}.ch_code_container .me1 {color: black;}</style>
<div class="ch_code_container" style="font-family: monospace;">l1 = <span class="br0">&#91;</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">2</span><span class="br0">&#41;</span>,<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">3</span><span class="br0">&#41;</span>,<span class="br0">&#40;</span><span class="nu0">3</span>,<span class="nu0">4</span><span class="br0">&#41;</span>,<span class="br0">&#40;</span><span class="nu0">4</span>,<span class="nu0">5</span><span class="br0">&#41;</span>,<span class="br0">&#40;</span><span class="nu0">5</span>,<span class="nu0">6</span><span class="br0">&#41;</span>,<span class="br0">&#40;</span><span class="nu0">6</span>,<span class="nu0">7</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
<span class="co1"># [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7)]</span><br />
l2 = <span class="br0">&#91;</span><span class="nu0">2</span>*x+y <span class="kw1">for</span> <span class="br0">&#40;</span>x,y<span class="br0">&#41;</span> <span class="kw1">in</span> l1<span class="br0">&#93;</span><br />
<span class="co1"># [4, 7, 10, 13, 16, 19]</span><br />
l3 = <span class="br0">&#91;</span>x <span class="kw1">for</span> x <span class="kw1">in</span> l2 <span class="kw1">if</span> x &gt; <span class="nu0">12</span><span class="br0">&#93;</span><br />
<span class="co1"># [13, 16, 19]</span></p>
</div>
<p>It is however absent from <acronym title="Objective Caml">OCaml</acronym>&#8230; Of course, it can be emulated:</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">let</span> l1 = <span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">2</span>;<span class="nu0">2</span>,<span class="nu0">3</span>;<span class="nu0">3</span>,<span class="nu0">4</span>;<span class="nu0">4</span>,<span class="nu0">5</span>;<span class="nu0">5</span>,<span class="nu0">6</span>;<span class="nu0">6</span>,<span class="nu0">7</span><span class="br0">&#93;</span>&nbsp; <span class="kw1">in</span><br />
<span class="kw1">let</span> l2 = <span class="br0">&#40;</span><span class="kw1">fun</span> fmap l -&gt; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9MaXN0Lmh0bWw="><span class="kw2">List</span></a>.<span class="me1">rev_map</span> fmap <span class="br0">&#40;</span><a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9MaXN0Lmh0bWw="><span class="kw2">List</span></a>.<span class="me1">rev</span> l<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">fun</span> <span class="br0">&#40;</span>x,y<span class="br0">&#41;</span> -&gt; <span class="nu0">2</span>*x+y<span class="br0">&#41;</span> l1 <span class="kw1">in</span><br />
<span class="kw1">let</span> l3 = <span class="br0">&#40;</span><span class="kw1">fun</span> ffilt fmap l -&gt; <br />
&nbsp; &nbsp; <span class="kw1">let</span> rev_filter f l = <br />
&nbsp; &nbsp; &nbsp; <span class="kw1">let</span> <span class="kw1">rec</span> aux d = <span class="kw1">fun</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>&nbsp; <span class="br0">&#91;</span><span class="br0">&#93;</span> -&gt; d<br />
&nbsp; &nbsp; &nbsp; | <span class="br0">&#91;</span>t::q<span class="br0">&#93;</span> -&gt; aux <span class="br0">&#40;</span><span class="kw1">if</span> f t <span class="kw1">then</span> <span class="br0">&#91;</span>t::d<span class="br0">&#93;</span> <span class="kw1">else</span> d<span class="br0">&#41;</span> q<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">in</span><br />
&nbsp; &nbsp; &nbsp; aux <span class="br0">&#91;</span><span class="br0">&#93;</span> l<br />
&nbsp; &nbsp; <span class="kw1">in</span><br />
&nbsp; &nbsp; <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9MaXN0Lmh0bWw="><span class="kw2">List</span></a>.<span class="me1">rev_map</span> fmap <span class="br0">&#40;</span>rev_filter ffilt l<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">fun</span> x -&gt; x &gt; <span class="nu0">12</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">fun</span> x -&gt; x<span class="br0">&#41;</span> l2 <br />
<span class="kw1">in</span> <span class="br0">&#40;</span><span class="br0">&#41;</span></p>
</div>
<p>But this is really too much&#8230; Wouldn&#039;t it be nice to write something like that : </p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">let</span> l1 = <span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">2</span>;<span class="nu0">2</span>,<span class="nu0">3</span>;<span class="nu0">3</span>,<span class="nu0">4</span>;<span class="nu0">4</span>,<span class="nu0">5</span>;<span class="nu0">5</span>,<span class="nu0">6</span>;<span class="nu0">6</span>,<span class="nu0">7</span><span class="br0">&#93;</span>&nbsp; <span class="kw1">in</span><br />
<span class="kw1">let</span> l2 = <span class="br0">&#91;</span>+ <span class="nu0">2</span>*x+y | <span class="br0">&#40;</span>x,y<span class="br0">&#41;</span> &lt;- l1<span class="br0">&#93;</span> <span class="kw1">in</span><br />
<span class="kw1">let</span> l3 = <span class="br0">&#91;</span>+ x | x &lt;- l2 <span class="kw1">when</span> x &gt; <span class="nu0">12</span><span class="br0">&#93;</span> <span class="kw1">in</span><br />
<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
</div>
<p>The <code>[+ (* ... *)]</code> indicates that this is a list comprehension. This actually is possible using camlp4 <img src='http://friggeri.net/wp-includes/images/smilies/icon_wink.jpg' alt=';)' class='wp-smiley' /> </p>
<div class="download_box box">
<div class='right'><span class="label">Downloaded : </span>  <span class="value">99 times</span></div>
<div><span class="label">File : </span>  <span class="value">listcomp.tar.gz</span></div>
<div class='right'><span class="dl">    <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZyaWdnZXJpLm5ldC9kb3dubG9hZC9saXN0Y29tcC50YXIuZ3o=">download</a>  </span></div>
<div><span class="label">Size: </span>  <span class="value">841 o</span></div>
</div>
<div class="clear"></div> <img src="http://friggeri.net/wp-content/plugins/feed-statistics.php?view=1&post_id=59" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://friggeri.net/blog/2007/07/24/list-comprehension-in-ocaml/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ocaml et hexadécimal</title>
		<link>http://friggeri.net/blog/2007/07/23/ocaml-et-hexadecimal</link>
		<comments>http://friggeri.net/blog/2007/07/23/ocaml-et-hexadecimal#comments</comments>
		<pubDate>Mon, 23 Jul 2007 14:12:38 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[hexadecimal]]></category>

		<category><![CDATA[ocaml]]></category>

		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/23/ocaml-et-hexadecimal/</guid>
		<description><![CDATA[Je vois qu&#039;il y a beaucoup de gens qui tombent sur mon blog en cherchant &#034;ocaml hexadecimal&#034;. Et ils doivent être décus de ne rien trouver&#8230; C&#039;est pourquoi j&#039;ai décidé d&#039;écrire rapidement un petit quelque chose à ce sujet là.
Tout d&#039;abord, il faut savoir qu&#039;en caml, les choses suivantes sont équivalentes :
# 0xf;;
- : int [...]]]></description>
			<content:encoded><![CDATA[<p>Je vois qu&#039;il y a beaucoup de gens qui tombent sur mon blog en cherchant &#034;ocaml hexadecimal&#034;. Et ils doivent être décus de ne rien trouver&#8230; C&#039;est pourquoi j&#039;ai décidé d&#039;écrire rapidement un petit quelque chose à ce sujet là.</p>
<p>Tout d&#039;abord, il faut savoir qu&#039;en caml, les choses suivantes sont équivalentes :<br />
<code># 0xf;;<br />
- : int = 15<br />
# 0o17;;<br />
- : int = 15<br />
# 0b1111;;<br />
- : int = 15<br />
# 15;;<br />
- : int = 15</code><br />
Le premier est écrit en hexadécimal, le second en ocal, le troisième en binaire, et le dernier en décimal. Donc la gestion de l&#039;hexadécimal en <acronym title="Objective Caml">OCaml</acronym> est native.</p>
<p>Une des utilisations courantes de l&#039;hexadécimal est pour représenter les couleurs en 65536 couleurs. Pour convertir un entier en tuple r,g,b on peut utiliser la fonction suivante : </p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">let</span> hex_to_rgb n =&nbsp; <span class="br0">&#40;</span>n / 0&#215;10000, <span class="br0">&#40;</span>n/0&#215;100<span class="br0">&#41;</span> <span class="kw1">mod</span> 0&#215;100, n <span class="kw1">mod</span> 0&#215;100<span class="br0">&#41;</span></p>
</div>
<p>Dans l&#039;autre sens, c&#039;est un peu plus compliqué : en effet, en mémoire tous les entiers sont stockés de la même manière (int31 à la caml), et on s&#039;en fiche de savoir sous quelle forme ils sont entrés. Mais ce n&#039;est pas un drame ; effectivement, on a besoin d&#039;avoir un entier sous forme hexadécimale principalement pour l&#039;affichage, donc on utilise les fonctions du module Printf :</p>
<style type="text/css">/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */.ch_code_container  {font-family: monospace;}.ch_code_container .head {color: #808080; width:99%; font-weight: bold; font-size:1.2em; color:rgb(234,234,218); background-color:#968148; border-bottom: 1px solid #968148; padding: 2px; }.ch_code_container .imp {font-weight: bold; color: red;}.ch_code_container .kw1 {color: #8ac6f2;}.ch_code_container .kw2 {color: #e5786d;}.ch_code_container .coMULTI {color: #99968b;}.ch_code_container .es0 {color: #e7f6da;}.ch_code_container .br0 {color: #8ac6f2;}.ch_code_container .st0 {color: #95e454;}.ch_code_container .nu0 {color: #e5786d;}</style>
<div class="ch_code_container" style="font-family: monospace;"><span class="kw1">let</span> print_hexa = printf <span class="st0">&quot;0x%x&quot;</span></p>
</div>
<p>Je vous renvoie à la documentation du module <a href="http://friggeri.net/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9QcmludGYuaHRtbA==">Pervasives</a> pour plus de détails.</p>
<p>Espérons que maintenant ceux qui passeront ici en cherchant <em>ocaml hexadécimal</em> repartirons heureux <img src='http://friggeri.net/wp-includes/images/smilies/icon_wink.jpg' alt=';)' class='wp-smiley' /></p> <img src="http://friggeri.net/wp-content/plugins/feed-statistics.php?view=1&post_id=58" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://friggeri.net/blog/2007/07/23/ocaml-et-hexadecimal/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
