<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="/rss-styles.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>mmhelloworld</title>
        <link>https://mmhelloworld.github.io/</link>
        <description>The Joy of Programming!</description>
        <lastBuildDate>Mon, 15 Jul 2024 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>Astro</generator>
        <language>en</language>
        <copyright>© 2024 Marimuthu Madasamy</copyright>
        <atom:link href="https://mmhelloworld.github.io/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Idris JVM 0.7.0 Release]]></title>
            <link>https://mmhelloworld.github.io/post/idris-jvm-0-7-0-release</link>
            <guid isPermaLink="false">https://mmhelloworld.github.io/post/idris-jvm-0-7-0-release</guid>
            <pubDate>Mon, 15 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Happy to announce Idris JVM 0.7.0 release! In addition to enabling Idris 0.7.0 features for the JVM backend, this release also includes:]]></description>
            <content:encoded><![CDATA[<p>Happy to announce <a href="https://github.com/mmhelloworld/idris-jvm/releases/tag/latest">Idris JVM 0.7.0 release</a>!
In addition to enabling Idris 0.7.0 features for the JVM backend, this release also includes:</p>
<ul>
<li>Exporting Idris functions to Java static methods, instance methods and constructors.</li>
<li>Exporting Java classes from Idris that can extend other classes and implement Java interfaces.</li>
<li>Exporting functions and classes with Java annotations including function parameter annotations.</li>
<li>Exporting type class instances and functions that make use of them to be able to be called from Java.</li>
</ul>
<p>Documentation with examples that explain calling Idris functions from Java is available here: <a href="https://idris-jvm.readthedocs.io/en/latest/ffi/calling-idris-from-java.html">link</a>.</p>
<p>Here is a complete example in Idris and Java for demonstration:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"></span>
<span class="line"><span style="color:#F97583">  module</span><span style="color:#E1E4E8"> Main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  import</span><span style="color:#79B8FF"> Data.String</span></span>
<span class="line"><span style="color:#F97583">  import</span><span style="color:#79B8FF"> Data.List</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">  -- Define some import aliases to avoid repeating fully qualified name</span></span>
<span class="line"><span style="color:#F97583">  %export</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:import</span></span>
<span class="line"><span style="color:#9ECBFF">      idris/String IdrisString</span></span>
<span class="line"><span style="color:#9ECBFF">      idris/data/List IdrisList</span></span>
<span class="line"><span style="color:#9ECBFF">      idris/data/Maybe IdrisMaybe</span></span>
<span class="line"><span style="color:#9ECBFF">      idris/prelude/Show</span></span>
<span class="line"><span style="color:#9ECBFF">      helloworld/Color</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  jvmImports</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> List</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">  jvmImports </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> []</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">  -- Export Idris types to Java</span></span>
<span class="line"><span style="color:#F97583">  %export</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:export</span></span>
<span class="line"><span style="color:#9ECBFF">      IdrisList</span></span>
<span class="line"><span style="color:#9ECBFF">      IdrisMaybe</span></span>
<span class="line"><span style="color:#9ECBFF">      Show</span></span>
<span class="line"><span style="color:#9ECBFF">      Color</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  typeExports</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> List</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">  typeExports </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> []</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">  -- Exports Idris List's nil constructor as a static method into generated Java class aliased by `IdrisList`</span></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static nil</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisList</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisList</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  idrisNil</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> List</span><span style="color:#E1E4E8"> a</span></span>
<span class="line"><span style="color:#E1E4E8">  idrisNil </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> []</span></span>
<span class="line"><span style="color:#E1E4E8">  </span></span>
<span class="line"><span style="color:#6A737D">  -- Exports Idris List's cons constructor as a static method into generated Java class aliased by `IdrisList`</span></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static cons</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisList</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">arguments</span><span style="color:#9ECBFF">": [{"</span><span style="color:#E1E4E8">type</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Object</span><span style="color:#9ECBFF">"}, {"</span><span style="color:#E1E4E8">type</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisList</span><span style="color:#9ECBFF">"}],</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisList</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  idrisCons</span><span style="color:#F97583"> :</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">-></span><span style="color:#B392F0"> List</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">-></span><span style="color:#B392F0"> List</span><span style="color:#E1E4E8"> a</span></span>
<span class="line"><span style="color:#E1E4E8">  idrisCons </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">::</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"> -- Exports the Show typeclass instance for Idris Int type to Java</span></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static show</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#E1E4E8">idris</span><span style="color:#F97583">/</span><span style="color:#79B8FF">Int</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Show</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  showInt</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Show</span><span style="color:#79B8FF"> Int</span></span>
<span class="line"><span style="color:#E1E4E8">  showInt </span><span style="color:#F97583">=</span><span style="color:#F97583"> %</span><span style="color:#E1E4E8">search</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  -</span><span style="color:#B392F0"> Exports</span><span style="color:#E1E4E8"> the </span><span style="color:#B392F0">Show</span><span style="color:#E1E4E8"> typeclass </span><span style="color:#F97583">instance</span><span style="color:#E1E4E8"> for </span><span style="color:#B392F0">Idris</span><span style="color:#79B8FF"> String</span><span style="color:#E1E4E8"> type to </span><span style="color:#B392F0">Java</span></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static show</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisString</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Show</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  showString</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Show</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">  showString </span><span style="color:#F97583">=</span><span style="color:#F97583"> %</span><span style="color:#E1E4E8">search</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  data</span><span style="color:#B392F0"> Color</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> Red</span><span style="color:#F97583"> |</span><span style="color:#B392F0"> Green</span><span style="color:#F97583"> |</span><span style="color:#B392F0"> Blue</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">  Show</span><span style="color:#B392F0"> Color</span><span style="color:#F97583"> where</span></span>
<span class="line"><span style="color:#E1E4E8">      show </span><span style="color:#B392F0">Red</span><span style="color:#F97583"> =</span><span style="color:#9ECBFF"> "Red"</span></span>
<span class="line"><span style="color:#E1E4E8">      show </span><span style="color:#B392F0">Green</span><span style="color:#F97583"> =</span><span style="color:#9ECBFF"> "Green"</span></span>
<span class="line"><span style="color:#E1E4E8">      show </span><span style="color:#B392F0">Blue</span><span style="color:#F97583"> =</span><span style="color:#9ECBFF"> "Blue"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">  -- Exports Color constructors as static methods to Java under class Color.</span></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static red</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Color</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Color</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  red</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Color</span></span>
<span class="line"><span style="color:#E1E4E8">  red </span><span style="color:#F97583">=</span><span style="color:#B392F0"> Red</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static green</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Color</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Color</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  green</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Color</span></span>
<span class="line"><span style="color:#E1E4E8">  green </span><span style="color:#F97583">=</span><span style="color:#B392F0"> Green</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static blue</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Color</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Color</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  blue</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Color</span></span>
<span class="line"><span style="color:#E1E4E8">  blue </span><span style="color:#F97583">=</span><span style="color:#B392F0"> Blue</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static show</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Color</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Show</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  exportShowColor</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Show</span><span style="color:#B392F0"> Color</span></span>
<span class="line"><span style="color:#E1E4E8">  exportShowColor </span><span style="color:#F97583">=</span><span style="color:#F97583"> %</span><span style="color:#E1E4E8">search</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static show</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Color</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">arguments</span><span style="color:#9ECBFF">": [{"</span><span style="color:#E1E4E8">type</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Color</span><span style="color:#9ECBFF">"}],</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#79B8FF">String</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  showColor</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Color</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">  showColor </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> show</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">  -- Exports Show typeclass instance to Java for Idris List given its element's Show typeclass instance</span></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static show</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisList</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">arguments</span><span style="color:#9ECBFF">": [{"</span><span style="color:#E1E4E8">type</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Show</span><span style="color:#9ECBFF">"}],</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Show</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  exportShowList</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Show</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">=></span><span style="color:#B392F0"> Show</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">List</span><span style="color:#E1E4E8"> a)</span></span>
<span class="line"><span style="color:#E1E4E8">  exportShowList </span><span style="color:#F97583">=</span><span style="color:#F97583"> %</span><span style="color:#E1E4E8">search</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static just</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisMaybe</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">arguments</span><span style="color:#9ECBFF">": [{"</span><span style="color:#E1E4E8">type</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Object</span><span style="color:#9ECBFF">"}],</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisMaybe</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  exportJust</span><span style="color:#F97583"> :</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">-></span><span style="color:#B392F0"> Maybe</span><span style="color:#E1E4E8"> a</span></span>
<span class="line"><span style="color:#E1E4E8">  exportJust </span><span style="color:#F97583">=</span><span style="color:#B392F0"> Just</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static nothing</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisMaybe</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisMaybe</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  exportNothing</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Maybe</span><span style="color:#E1E4E8"> a</span></span>
<span class="line"><span style="color:#E1E4E8">  exportNothing </span><span style="color:#F97583">=</span><span style="color:#B392F0"> Nothing</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static show</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisMaybe</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">arguments</span><span style="color:#9ECBFF">": [{"</span><span style="color:#E1E4E8">type</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Show</span><span style="color:#9ECBFF">"}],</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Show</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  exportShowMaybe</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Show</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">=></span><span style="color:#B392F0"> Show</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">Maybe</span><span style="color:#E1E4E8"> a)</span></span>
<span class="line"><span style="color:#E1E4E8">  exportShowMaybe </span><span style="color:#F97583">=</span><span style="color:#F97583"> %</span><span style="color:#E1E4E8">search</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static show</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Show</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">arguments</span><span style="color:#9ECBFF">": [{"</span><span style="color:#E1E4E8">type</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Show</span><span style="color:#9ECBFF">"}, {"</span><span style="color:#E1E4E8">type</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">Object</span><span style="color:#9ECBFF">"}],</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#79B8FF">String</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  exportShow</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Show</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">=></span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">-></span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">  exportShow </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> show</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  %export</span><span style="color:#9ECBFF"> """</span></span>
<span class="line"><span style="color:#9ECBFF">      jvm:public static replicate</span></span>
<span class="line"><span style="color:#9ECBFF">      {</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">enclosingType</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">IdrisString</span><span style="color:#9ECBFF">",</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">arguments</span><span style="color:#9ECBFF">": [{"</span><span style="color:#E1E4E8">type</span><span style="color:#9ECBFF">": "</span><span style="color:#B392F0">BigInteger</span><span style="color:#9ECBFF">"}, {"</span><span style="color:#E1E4E8">type</span><span style="color:#9ECBFF">": "</span><span style="color:#E1E4E8">char</span><span style="color:#9ECBFF">"}],</span></span>
<span class="line"><span style="color:#9ECBFF">          "</span><span style="color:#E1E4E8">returnType</span><span style="color:#9ECBFF">": "</span><span style="color:#79B8FF">String</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF">      }</span></span>
<span class="line"><span style="color:#9ECBFF">      """</span></span>
<span class="line"><span style="color:#B392F0">  exportStringReplicate</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Nat</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> Char</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">  exportStringReplicate </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> String</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">replicate</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">  main</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">  main </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> pure </span><span style="color:#79B8FF">()</span></span></code></pre>
<p>Java calling the Idris functions:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="java"><code><span class="line"></span>
<span class="line"><span style="color:#F97583">    package</span><span style="color:#E1E4E8"> hello;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#E1E4E8"> helloworld.Color;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#E1E4E8"> idris.Int;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#E1E4E8"> idris.data.List;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#E1E4E8"> idris.data.Maybe;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#E1E4E8"> idris.prelude.Show;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> helloworld.Color.blue;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> helloworld.Color.green;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> helloworld.Color.red;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> idris.data.List.cons;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> idris.data.List.nil;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> idris.data.Maybe.just;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> idris.data.Maybe.nothing;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> idris.prelude.Show.show;</span></span>
<span class="line"><span style="color:#F97583">    import</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> java.math.BigInteger.TEN;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">    public</span><span style="color:#F97583"> class</span><span style="color:#B392F0"> Main</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">        public</span><span style="color:#F97583"> static</span><span style="color:#F97583"> void</span><span style="color:#B392F0"> main</span><span style="color:#E1E4E8">(</span><span style="color:#F97583">String</span><span style="color:#E1E4E8">[] </span><span style="color:#FFAB70">args</span><span style="color:#E1E4E8">) {</span></span>
<span class="line"><span style="color:#E1E4E8">            List idrisIntList </span><span style="color:#F97583">=</span><span style="color:#B392F0"> cons</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">23</span><span style="color:#E1E4E8">, </span><span style="color:#B392F0">cons</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">45</span><span style="color:#E1E4E8">, </span><span style="color:#B392F0">nil</span><span style="color:#E1E4E8">())); </span><span style="color:#6A737D">// Create an Idris list of integers</span></span>
<span class="line"><span style="color:#E1E4E8">            List idrisStringList </span><span style="color:#F97583">=</span><span style="color:#B392F0"> cons</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"foo"</span><span style="color:#E1E4E8">, </span><span style="color:#B392F0">cons</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"bar"</span><span style="color:#E1E4E8">, </span><span style="color:#B392F0">nil</span><span style="color:#E1E4E8">()));</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">            // Create an Idris list of Colors defined as data Color = Red | Green | Blue</span></span>
<span class="line"><span style="color:#E1E4E8">            List idrisColorList </span><span style="color:#F97583">=</span><span style="color:#B392F0"> cons</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">red</span><span style="color:#E1E4E8">().</span><span style="color:#B392F0">toIdris</span><span style="color:#E1E4E8">(), </span><span style="color:#B392F0">cons</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">blue</span><span style="color:#E1E4E8">().</span><span style="color:#B392F0">toIdris</span><span style="color:#E1E4E8">(), </span><span style="color:#B392F0">nil</span><span style="color:#E1E4E8">()));</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">            // Get Show instance for Idris List given a show Instance of Int</span></span>
<span class="line"><span style="color:#E1E4E8">            Show intListShow </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> List.</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(Int.</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">());</span></span>
<span class="line"><span style="color:#E1E4E8">            Show stringListShow </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> List.</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(idris.String.</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">());</span></span>
<span class="line"><span style="color:#E1E4E8">            Show colorShow </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> Color.</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">();</span></span>
<span class="line"><span style="color:#E1E4E8">            Show colorListShow </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> List.</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(colorShow);</span></span>
<span class="line"><span style="color:#E1E4E8">            Show colorMaybeShow </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> Maybe.</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(colorShow);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">            // Use exported Idris Show instances to print Idris List for differnt element types</span></span>
<span class="line"><span style="color:#E1E4E8">            System.out.</span><span style="color:#B392F0">println</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(intListShow, idrisIntList.</span><span style="color:#B392F0">toIdris</span><span style="color:#E1E4E8">()));</span></span>
<span class="line"><span style="color:#E1E4E8">            System.out.</span><span style="color:#B392F0">println</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(stringListShow, idrisStringList.</span><span style="color:#B392F0">toIdris</span><span style="color:#E1E4E8">()));</span></span>
<span class="line"><span style="color:#E1E4E8">            System.out.</span><span style="color:#B392F0">println</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(colorListShow, idrisColorList.</span><span style="color:#B392F0">toIdris</span><span style="color:#E1E4E8">()));</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">            System.out.</span><span style="color:#B392F0">println</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(colorShow, </span><span style="color:#B392F0">green</span><span style="color:#E1E4E8">().</span><span style="color:#B392F0">toIdris</span><span style="color:#E1E4E8">()));</span></span>
<span class="line"><span style="color:#E1E4E8">            System.out.</span><span style="color:#B392F0">println</span><span style="color:#E1E4E8">(Color.</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">blue</span><span style="color:#E1E4E8">()));</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">            System.out.</span><span style="color:#B392F0">println</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(colorMaybeShow, </span><span style="color:#B392F0">just</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">green</span><span style="color:#E1E4E8">().</span><span style="color:#B392F0">toIdris</span><span style="color:#E1E4E8">()).</span><span style="color:#B392F0">toIdris</span><span style="color:#E1E4E8">()));</span></span>
<span class="line"><span style="color:#E1E4E8">            System.out.</span><span style="color:#B392F0">println</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">show</span><span style="color:#E1E4E8">(colorMaybeShow, </span><span style="color:#B392F0">nothing</span><span style="color:#E1E4E8">().</span><span style="color:#B392F0">toIdris</span><span style="color:#E1E4E8">()));</span></span>
<span class="line"><span style="color:#E1E4E8">            System.out.</span><span style="color:#B392F0">println</span><span style="color:#E1E4E8">(idris.String.</span><span style="color:#B392F0">replicate</span><span style="color:#E1E4E8">(TEN, </span><span style="color:#9ECBFF">'A'</span><span style="color:#E1E4E8">));</span></span>
<span class="line"><span style="color:#E1E4E8">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">    }</span></span></code></pre>
<p>Here is the output:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="text"><code><span class="line"><span>    [23, 45]</span></span>
<span class="line"><span>    ["foo", "bar"]</span></span>
<span class="line"><span>    [Red, Blue]</span></span>
<span class="line"><span>    Green</span></span>
<span class="line"><span>    Blue</span></span>
<span class="line"><span>    Just Green</span></span>
<span class="line"><span>    Nothing</span></span>
<span class="line"><span>    AAAAAAAAAA</span></span>
<span class="line"><span></span></span></code></pre>
<p>With all of these things, we can now write a complete Spring Boot application as well in Idris! <a href="https://github.com/mmhelloworld/idris-spring-boot-example/blob/main/src/main/idris/Mmhelloworld/IdrisSpringBootExample/Main.idr">Example here</a>.</p>
<p><a href="https://idris-jvm.readthedocs.io/en/latest/ffi/calling-idris-from-java.html">Exporting</a> Idris functions and types along with <a href="https://idris-jvm.readthedocs.io/en/latest/ffi/calling-java-from-idris.html">foreign function interface</a> thus allows us to integrate Idris much easily into existing Java ecosystem.</p>]]></content:encoded>
            <author>Marimuthu Madasamy</author>
            <category>Idris</category>
            <category>JVM</category>
            <category>Java</category>
        </item>
        <item>
            <title><![CDATA[Idris 2 Initial Release 0.2.1 for the JVM]]></title>
            <link>https://mmhelloworld.github.io/post/idris-2-initial-release-0-dot-2-1-for-the-jvm</link>
            <guid isPermaLink="false">https://mmhelloworld.github.io/post/idris-2-initial-release-0-dot-2-1-for-the-jvm</guid>
            <pubDate>Sat, 24 Jul 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[There is now an initial version for Idris 2 - 0.2.1 for the JVM. This is compiled from Idris 2 JVM bootstrap version.]]></description>
            <content:encoded><![CDATA[<p>There is now an initial version for Idris 2 - 0.2.1 for the JVM. This is compiled from Idris 2 JVM bootstrap version.</p>
<h2 id="changes">Changes:</h2>
<ul>
<li>Compile initial Idris 2 compiler (0.2.1) with Idris 2 JVM bootstrap version targeting Java 8 bytecode</li>
<li>Add JVM backend</li>
<li>Support primitives such as system, IO, network, clock, buffer etc. for JVM backend</li>
<li>Eliminate tail recursion</li>
<li>Add debug information such as variable name, file name and line number in bytecode from Idris source</li>
<li>Compile Idris modules to Java classes at the bytecode level, Idris top level functions to static Java methods and Idris lambdas into Java lambdas with <code>invokedynamic</code> implementing Java <code>Function</code> interface.</li>
<li>Generate bytecode concurrently for modules</li>
<li>Generate classes with <code>toString</code> and property getters for Idris constructors</li>
<li>Infer types to avoid boxing and casting</li>
<li>Compile Idris list into a Java list</li>
<li>JVM foreign descriptors supporting static, instance, interface methods and constructor calls</li>
</ul>
<h2 id="to-try-it-out">To try it out:</h2>
<ul>
<li>Unzip <code>idris2-jvm-0.2.1-SNAPSHOT-20210720.zip</code> from here <a href="https://github.com/mmhelloworld/Idris2/releases/tag/v0.2.1-SNAPSHOT-20210720">https://github.com/mmhelloworld/Idris2/releases/tag/v0.2.1-SNAPSHOT-20210720</a></li>
<li>Add <code>bin</code> directory to <code>PATH</code> variable</li>
<li>Copy <code>.idris2</code> directory containing Idris 0.2.1 packages into your home directory.</li>
</ul>
<h2 id="to-compile-and-run">To compile and run:</h2>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">module</span><span style="color:#E1E4E8"> Main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">data</span><span style="color:#B392F0"> Tree</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">=</span><span style="color:#B392F0"> Leaf</span></span>
<span class="line"><span style="color:#F97583">            |</span><span style="color:#B392F0"> Node</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">Tree</span><span style="color:#E1E4E8"> a) a (</span><span style="color:#B392F0">Tree</span><span style="color:#E1E4E8"> a)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">inorder</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Tree</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">-></span><span style="color:#B392F0"> List</span><span style="color:#E1E4E8"> a</span></span>
<span class="line"><span style="color:#E1E4E8">inorder </span><span style="color:#B392F0">Leaf</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> []</span></span>
<span class="line"><span style="color:#E1E4E8">inorder (</span><span style="color:#B392F0">Node</span><span style="color:#E1E4E8"> left a right) </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> inorder left </span><span style="color:#F97583">++</span><span style="color:#E1E4E8"> [a] </span><span style="color:#F97583">++</span><span style="color:#E1E4E8"> inorder right</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">tree</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Tree</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">tree </span><span style="color:#F97583">=</span><span style="color:#B392F0"> Node</span></span>
<span class="line"><span style="color:#E1E4E8">        (</span><span style="color:#B392F0">Node</span></span>
<span class="line"><span style="color:#E1E4E8">          (</span><span style="color:#B392F0">Node</span><span style="color:#B392F0"> Leaf</span><span style="color:#9ECBFF"> "3"</span><span style="color:#B392F0"> Leaf</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#9ECBFF">          "+"</span></span>
<span class="line"><span style="color:#E1E4E8">          (</span><span style="color:#B392F0">Node</span><span style="color:#B392F0"> Leaf</span><span style="color:#9ECBFF"> "7"</span><span style="color:#B392F0"> Leaf</span><span style="color:#E1E4E8">))</span></span>
<span class="line"><span style="color:#9ECBFF">        "/"</span></span>
<span class="line"><span style="color:#E1E4E8">        (</span><span style="color:#B392F0">Node</span><span style="color:#B392F0"> Leaf</span><span style="color:#9ECBFF"> "2"</span><span style="color:#B392F0"> Leaf</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">main</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> printLn </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> inorder tree</span></span></code></pre>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">$</span><span style="color:#9ECBFF"> idris2</span><span style="color:#9ECBFF"> Main.idr</span><span style="color:#79B8FF"> -o</span><span style="color:#9ECBFF"> main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">$</span><span style="color:#9ECBFF"> java</span><span style="color:#79B8FF"> -jar</span><span style="color:#9ECBFF"> build/exec/main_app/main.jar</span></span>
<span class="line"><span style="color:#E1E4E8">[</span><span style="color:#9ECBFF">"3"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"+"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"7"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"/"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"2"</span><span style="color:#E1E4E8">]</span></span></code></pre>]]></content:encoded>
            <author>Marimuthu Madasamy</author>
            <category>Idris</category>
            <category>JVM</category>
        </item>
        <item>
            <title><![CDATA[Idris 2 Bootstrap Compiler on the JVM with a JVM backend]]></title>
            <link>https://mmhelloworld.github.io/post/idris-2-bootstrap-compiler-on-the-jvm-with-a-jvm-backend</link>
            <guid isPermaLink="false">https://mmhelloworld.github.io/post/idris-2-bootstrap-compiler-on-the-jvm-with-a-jvm-backend</guid>
            <pubDate>Wed, 30 Dec 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[I am excited to announce that Idris 2 bootstrap compiler can now run on the JVM along with a JVM backend. Here is a REPL session:]]></description>
            <content:encoded><![CDATA[<p>I am excited to announce that Idris 2 bootstrap compiler can now run on the JVM along with a JVM backend. Here is a REPL session:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">$</span><span style="color:#E1E4E8"> idris2</span></span>
<span class="line"><span style="color:#E1E4E8">     ____    __     </span><span style="color:#79B8FF">_</span><span style="color:#E1E4E8">         ___                                           </span></span>
<span class="line"><span style="color:#F97583">    /</span><span style="color:#79B8FF">  _</span><span style="color:#F97583">/</span><span style="color:#E1E4E8">___</span><span style="color:#F97583">/</span><span style="color:#F97583"> /</span><span style="color:#E1E4E8">____(</span><span style="color:#79B8FF">_</span><span style="color:#E1E4E8">)____   </span><span style="color:#F97583">|</span><span style="color:#E1E4E8">__ </span><span style="color:#F97583">\</span><span style="color:#E1E4E8">                                          </span></span>
<span class="line"><span style="color:#F97583">    /</span><span style="color:#F97583"> //</span><span style="color:#E1E4E8"> __  </span><span style="color:#F97583">/</span><span style="color:#E1E4E8"> ___</span><span style="color:#F97583">/</span><span style="color:#F97583"> /</span><span style="color:#E1E4E8"> ___</span><span style="color:#F97583">/</span><span style="color:#E1E4E8">   __</span><span style="color:#F97583">/</span><span style="color:#F97583"> /</span><span style="color:#B392F0">     Version</span><span style="color:#79B8FF"> 0</span><span style="color:#F97583">.</span><span style="color:#79B8FF">1</span><span style="color:#F97583">.</span><span style="color:#79B8FF">1</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">786152de1</span></span>
<span class="line"><span style="color:#79B8FF">  _</span><span style="color:#F97583">/</span><span style="color:#F97583"> //</span><span style="color:#F97583"> /</span><span style="color:#79B8FF">_</span><span style="color:#F97583">/</span><span style="color:#F97583"> /</span><span style="color:#F97583"> /</span><span style="color:#F97583">  /</span><span style="color:#E1E4E8"> (__  )   </span><span style="color:#F97583">/</span><span style="color:#E1E4E8"> __</span><span style="color:#F97583">/</span><span style="color:#B392F0">      https</span><span style="color:#F97583">://</span><span style="color:#E1E4E8">www</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">idris</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">lang</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">org           </span></span>
<span class="line"><span style="color:#F97583"> /</span><span style="color:#E1E4E8">___</span><span style="color:#F97583">/\</span><span style="color:#E1E4E8">__,</span><span style="color:#79B8FF">_</span><span style="color:#F97583">/</span><span style="color:#79B8FF">_</span><span style="color:#F97583">/</span><span style="color:#F97583">  /</span><span style="color:#79B8FF">_</span><span style="color:#F97583">/</span><span style="color:#E1E4E8">____</span><span style="color:#F97583">/</span><span style="color:#F97583">   /</span><span style="color:#E1E4E8">____</span><span style="color:#F97583">/</span><span style="color:#B392F0">      Type</span><span style="color:#F97583"> :?</span><span style="color:#E1E4E8"> for help                     </span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">[</span><span style="color:#B392F0">BOOTSTRAP</span><span style="color:#B392F0"> VERSION</span><span style="color:#F97583">:</span><span style="color:#B392F0"> No</span><span style="color:#E1E4E8"> longer developed, except as a bootstrapping step</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">]</span></span>
<span class="line"><span style="color:#B392F0">Welcome</span><span style="color:#E1E4E8"> to </span><span style="color:#B392F0">Idris</span><span style="color:#79B8FF"> 2</span><span style="color:#E1E4E8"> on the </span><span style="color:#B392F0">JVM</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">Private</span><span style="color:#B392F0"> Build</span><span style="color:#B392F0"> OpenJDK</span><span style="color:#79B8FF"> 64</span><span style="color:#F97583">-</span><span style="color:#B392F0">Bit</span><span style="color:#B392F0"> Server</span><span style="color:#B392F0"> VM</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">1</span><span style="color:#F97583">.</span><span style="color:#79B8FF">8</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">0_275)</span><span style="color:#F97583">.</span><span style="color:#B392F0">  Enjoy</span><span style="color:#E1E4E8"> yourself</span><span style="color:#F97583">!</span></span>
<span class="line"><span style="color:#B392F0">Main</span><span style="color:#F97583">></span><span style="color:#9ECBFF"> "hello world"</span></span>
<span class="line"><span style="color:#9ECBFF">"hello world"</span></span>
<span class="line"><span style="color:#B392F0">Main</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> take </span><span style="color:#79B8FF">10</span><span style="color:#E1E4E8"> [</span><span style="color:#79B8FF">25</span><span style="color:#F97583">..</span><span style="color:#E1E4E8">]</span></span>
<span class="line"><span style="color:#E1E4E8">[</span><span style="color:#79B8FF">25</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">26</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">27</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">28</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">29</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">30</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">31</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">32</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">33</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">34</span><span style="color:#E1E4E8">]</span></span>
<span class="line"><span style="color:#B392F0">Main</span><span style="color:#F97583">></span><span style="color:#F97583"> :</span><span style="color:#E1E4E8">t map</span></span>
<span class="line"><span style="color:#B392F0">Prelude</span><span style="color:#F97583">.</span><span style="color:#B392F0">map</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Functor</span><span style="color:#E1E4E8"> f </span><span style="color:#F97583">=></span><span style="color:#E1E4E8"> (a </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> b) </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> f a </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> f b</span></span>
<span class="line"><span style="color:#B392F0">Main</span><span style="color:#F97583">></span><span style="color:#F97583"> :</span><span style="color:#E1E4E8">exec printLn </span><span style="color:#9ECBFF">"Hello Idris 2 on the JVM - this is printed from executing JVM bytecode from memory"</span></span>
<span class="line"><span style="color:#9ECBFF">"Hello Idris 2 on the JVM - this is printed from executing JVM bytecode from memory"</span></span>
<span class="line"><span style="color:#B392F0">Main</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> </span></span></code></pre>
<p>You may notice that the banner includes the JVM version that the Idris compiler is running on. Idris 2 for JVM can run on Java 8 or above. Since the compiler itself runs on the JVM, the last <code>:exec</code> command at line 16 above can directly interpret the generated bytecode on the compiler JVM, and the generated bytecode is loaded from memory without any file system footprint.</p>
<h3 id="to-try-it-out">To try it out</h3>
<p>Prerequisite: Java 8 or above</p>
<ul>
<li>Extract the zip from <a href="https://github.com/mmhelloworld/Idris2-boot/releases/tag/v0.2.0">here</a></li>
<li>Add <code>idris2-boot-jvm/bin</code> from extracted directory to <code>PATH</code></li>
<li>Run <code>idris2</code>. That’s all!</li>
</ul>
<h3 id="features">Features</h3>
<ul>
<li>Eliminate tail recursion using JVM’s GOTO</li>
<li>Trampoline non-self tail calls</li>
<li>Support file, directory, array, IORef and buffer primitives.</li>
<li>Analyse function dependencies to generate bytecode for only used functions from <code>main</code></li>
<li>Limited type inference on Idris IR to avoid boxing and typecasting in the generated bytecode</li>
<li>Static and instance Java FFI method calls.</li>
<li>Debug information (Idris source file and line numbers) in the bytecode from Idris IR</li>
</ul>
<p>Currently, the goal for this bootstrap compiler is to be able to compile current <a href="https://github.com/idris-lang/Idris2">Idris 2</a> so the items here could definitely be improved a lot and other features may be added to support the absolute minimum for building Idris 2.</p>
<h3 id="example">Example</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">module</span><span style="color:#E1E4E8"> Main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#79B8FF"> System.FFI</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- Tail call is eliminated with GOTO</span></span>
<span class="line"><span style="color:#B392F0">sum</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Int</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> Int</span></span>
<span class="line"><span style="color:#E1E4E8">sum n </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> go </span><span style="color:#79B8FF">0</span><span style="color:#E1E4E8"> n </span><span style="color:#F97583">where</span></span>
<span class="line"><span style="color:#B392F0">  go</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Int</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> Int</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> Int</span></span>
<span class="line"><span style="color:#E1E4E8">  go acc </span><span style="color:#79B8FF">0</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> acc</span></span>
<span class="line"><span style="color:#E1E4E8">  go acc n </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> go (acc </span><span style="color:#F97583">+</span><span style="color:#E1E4E8"> n) (n </span><span style="color:#F97583">-</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">mutual</span></span>
<span class="line"><span style="color:#6A737D">  -- Mutually recursive functions are trampolined</span></span>
<span class="line"><span style="color:#6A737D">  -- keeping it simple with int instead of Nat which is compiled to Java BigInteger</span></span>
<span class="line"><span style="color:#B392F0">  isOdd</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Int</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> Bool</span></span>
<span class="line"><span style="color:#E1E4E8">  isOdd </span><span style="color:#79B8FF">0</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> False</span></span>
<span class="line"><span style="color:#E1E4E8">  isOdd n </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> isEven (n </span><span style="color:#F97583">-</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">  isEven</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Int</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> Bool</span></span>
<span class="line"><span style="color:#E1E4E8">  isEven </span><span style="color:#79B8FF">0</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> True</span></span>
<span class="line"><span style="color:#E1E4E8">  isEven n </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> isOdd (n </span><span style="color:#F97583">-</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- Java instance method calls</span></span>
<span class="line"><span style="color:#F97583">%</span><span style="color:#E1E4E8">foreign jvm </span><span style="color:#9ECBFF">"java/lang/String"</span><span style="color:#9ECBFF"> ".length"</span></span>
<span class="line"><span style="color:#B392F0">jvmStringLength</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> String</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> Int</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- Java static method calls</span></span>
<span class="line"><span style="color:#F97583">%</span><span style="color:#E1E4E8">foreign jvm </span><span style="color:#9ECBFF">"java/lang/Integer"</span><span style="color:#9ECBFF"> "toBinaryString"</span></span>
<span class="line"><span style="color:#B392F0">intToBinaryString</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Int</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> String</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">main</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">  printLn </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> sum </span><span style="color:#79B8FF">5000</span></span>
<span class="line"><span style="color:#E1E4E8">  printLn </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> isEven </span><span style="color:#79B8FF">100000</span></span>
<span class="line"><span style="color:#E1E4E8">  printLn </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> intToBinaryString </span><span style="color:#79B8FF">512</span></span>
<span class="line"><span style="color:#E1E4E8">  printLn </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> jvmStringLength </span><span style="color:#9ECBFF">"hello"</span></span></code></pre>
<h4 id="compile">Compile</h4>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="plaintext"><code><span class="line"><span>idris2 Main.idr -o main</span></span></code></pre>
<p>The classes will be compiled into <code>build/exec/main_app</code>.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="text"><code><span class="line"><span>$ tree build/exec/main_app/</span></span>
<span class="line"><span>build/exec/main_app/</span></span>
<span class="line"><span>├── Main.class</span></span>
<span class="line"><span>├── Prelude</span></span>
<span class="line"><span>│   ├── $col$col.class</span></span>
<span class="line"><span>│   ├── Just.class</span></span>
<span class="line"><span>│   ├── Nil.class</span></span>
<span class="line"><span>│   ├── Nothing.class</span></span>
<span class="line"><span>│   ├── Open.class</span></span>
<span class="line"><span>│   ├── PrefixMinus.class</span></span>
<span class="line"><span>│   └── Show$spcat$spcPrelude$dotidr$col1260$col1--1284$col1__mkShow.class</span></span>
<span class="line"><span>├── Prelude.class</span></span>
<span class="line"><span>└── PrimIO.class</span></span>
<span class="line"><span></span></span></code></pre>
<p>It compiles down to three main modules <code>Main</code>, <code>Prelude</code> and <code>PrimIO</code>. Rest of the classes are data classes for Idris constructors like <code>Just</code>, <code>Nothing</code>, <code>Nil</code>, <code>::</code> etc.</p>
<h4 id="run">Run</h4>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="plaintext"><code><span class="line"><span>$ java -cp /path/to/idris2-boot-jvm/lib/runtime-1.0-SNAPSHOT.jar:build/exec/main_app Main</span></span>
<span class="line"><span>12502500</span></span>
<span class="line"><span>True</span></span>
<span class="line"><span>"1000000000"</span></span>
<span class="line"><span>5</span></span></code></pre>
<p>The above example demonstrates tail recursion, mutual recursion, Java FFI instance and static method calls.</p>
<p><code>sum</code> a tail recursive function, would be compiled into a loop.  Here is the decompiled code for the nested <code>go</code> function inside <code>sum</code>:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="java"><code><span class="line"><span style="color:#F97583">    public</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> Object </span><span style="color:#B392F0">$nested1201$307$go</span><span style="color:#E1E4E8">(Object arg$0, </span><span style="color:#F97583">int</span><span style="color:#E1E4E8"> arg$1, </span><span style="color:#F97583">int</span><span style="color:#E1E4E8"> arg$2) {</span></span>
<span class="line"><span style="color:#F97583">        while</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">true</span><span style="color:#E1E4E8">) {</span></span>
<span class="line"><span style="color:#F97583">            switch</span><span style="color:#E1E4E8">(arg$2) {</span></span>
<span class="line"><span style="color:#F97583">            case</span><span style="color:#79B8FF"> 0</span><span style="color:#F97583">:</span></span>
<span class="line"><span style="color:#F97583">                return</span><span style="color:#E1E4E8"> arg$1;</span></span>
<span class="line"><span style="color:#F97583">            default:</span></span>
<span class="line"><span style="color:#E1E4E8">                arg$1 </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> Prelude.</span><span style="color:#F97583">++</span><span style="color:#B392F0">_Num__Int</span><span style="color:#E1E4E8">(arg$1, arg$2);</span></span>
<span class="line"><span style="color:#E1E4E8">                arg$2 </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> Prelude.</span><span style="color:#F97583">--</span><span style="color:#B392F0">_Neg__Int</span><span style="color:#E1E4E8">(arg$2, </span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#E1E4E8">            }</span></span>
<span class="line"><span style="color:#E1E4E8">        }</span></span>
<span class="line"><span style="color:#E1E4E8">    }</span></span></code></pre>
<p>As we can see here, the tail recursive function call is removed in the <code>default</code> block instead the arguments are updated for next iteration. The loop would continue to run until the base case is reached where the result is returned.</p>
<p>For <code>isEven</code> and <code>isOdd</code>, the tail calls would be trampolined using JVM’s <code>invokedynamic</code>. Here is the decompiled bytecode.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="java"><code><span class="line"><span style="color:#F97583">    public</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> Object </span><span style="color:#B392F0">isOdd</span><span style="color:#E1E4E8">(</span><span style="color:#F97583">int</span><span style="color:#E1E4E8"> arg$0) {</span></span>
<span class="line"><span style="color:#F97583">        switch</span><span style="color:#E1E4E8">(arg$0) {</span></span>
<span class="line"><span style="color:#F97583">        case</span><span style="color:#79B8FF"> 0</span><span style="color:#F97583">:</span></span>
<span class="line"><span style="color:#F97583">            return</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#F97583">        default:</span></span>
<span class="line"><span style="color:#F97583">            return</span><span style="color:#E1E4E8"> () </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#F97583">                return</span><span style="color:#E1E4E8"> Runtime.</span><span style="color:#B392F0">createThunk</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">isEven</span><span style="color:#E1E4E8">(Prelude.</span><span style="color:#F97583">--</span><span style="color:#B392F0">_Neg__Int</span><span style="color:#E1E4E8">(arg$0, </span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">)));</span></span>
<span class="line"><span style="color:#E1E4E8">            };</span></span>
<span class="line"><span style="color:#E1E4E8">        }</span></span>
<span class="line"><span style="color:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">    public</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> Object </span><span style="color:#B392F0">isEven</span><span style="color:#E1E4E8">(</span><span style="color:#F97583">int</span><span style="color:#E1E4E8"> arg$0) {</span></span>
<span class="line"><span style="color:#F97583">        switch</span><span style="color:#E1E4E8">(arg$0) {</span></span>
<span class="line"><span style="color:#F97583">        case</span><span style="color:#79B8FF"> 0</span><span style="color:#F97583">:</span></span>
<span class="line"><span style="color:#F97583">            return</span><span style="color:#79B8FF"> 0</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#F97583">        default:</span></span>
<span class="line"><span style="color:#F97583">            return</span><span style="color:#E1E4E8"> () </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#F97583">                return</span><span style="color:#E1E4E8"> Runtime.</span><span style="color:#B392F0">createThunk</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">isOdd</span><span style="color:#E1E4E8">(Prelude.</span><span style="color:#F97583">--</span><span style="color:#B392F0">_Neg__Int</span><span style="color:#E1E4E8">(arg$0, </span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">)));</span></span>
<span class="line"><span style="color:#E1E4E8">            };</span></span>
<span class="line"><span style="color:#E1E4E8">        }</span></span>
<span class="line"><span style="color:#E1E4E8">    }</span></span></code></pre>
<p>Here since the tail call is not to itself, function call is turned into a thunk which would be eventually unwrapped in a loop.</p>
<p>Now let’s look at FFI calls in the above example. <code>jvmStringLength</code> function is an example for Java FFI instance method call. It calls <code>length</code> function on Java’s <code>java.lang.String</code> instance. Similarly <code>intToBinaryString</code> calls <code>toBinaryString</code> static function on class <code>java.lang.Integer</code>. Function name starting with a dot denotes an instance method call differentiating it from a static method call. Precise types can also be passed explicitly as in the example below with argument types and return type (full code <a href="https://github.com/mmhelloworld/Idris2-boot/blob/master/libs/base/System/File.idr#L37">here</a>).</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">%</span><span style="color:#E1E4E8">foreign jvm' fileClass </span><span style="color:#9ECBFF">"getLine"</span><span style="color:#E1E4E8"> fileClass </span><span style="color:#9ECBFF">"String"</span></span>
<span class="line"><span style="color:#B392F0">prim__readLine</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> FilePtr</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> PrimIO</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">Ptr</span><span style="color:#79B8FF"> String</span><span style="color:#E1E4E8">)</span></span></code></pre>
<h3 id="next-steps">Next steps</h3>
<p>Next step would be to use this bootstrap version to compile current <a href="https://github.com/idris-lang/Idris2">Idris 2</a> and then porting the JVM backend from here which is on Idris 1 to Idris 2 so there are some interesting things ahead to work on. Meanwhile, if anyone gets a chance to use this boostrap JVM version, please share any feedback or any issues <a href="https://github.com/mmhelloworld/idris-jvm/discussions">here</a> that can help while we try to compile mainstream Idris 2 for the JVM. Thank you for reading and happy coding!</p>]]></content:encoded>
            <author>Marimuthu Madasamy</author>
            <category>Idris</category>
            <category>JVM</category>
        </item>
        <item>
            <title><![CDATA[Idris JVM: Automated FFI with null safety and exception handling]]></title>
            <link>https://mmhelloworld.github.io/post/idris-jvm-automated-ffi-with-null-safety</link>
            <guid isPermaLink="false">https://mmhelloworld.github.io/post/idris-jvm-automated-ffi-with-null-safety</guid>
            <pubDate>Sun, 11 Feb 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[Idris JVM backend has supported foreign function calls for some time now. For example, to invoke parseInt method on java.lang.Integer class,]]></description>
            <content:encoded><![CDATA[<h2 id="background">Background</h2>
<p>Idris JVM backend has supported foreign function calls for some time now. For example, to invoke <code>parseInt</code> method on
<code>java.lang.Integer</code> class,</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#E1E4E8">invokeStatic (</span><span style="color:#B392F0">Class</span><span style="color:#9ECBFF"> "java/lang/Integer"</span><span style="color:#E1E4E8">) </span><span style="color:#9ECBFF">"parseInt"</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">String</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> Int</span><span style="color:#E1E4E8">) </span><span style="color:#9ECBFF">"234"</span><span style="color:#E1E4E8"> </span></span></code></pre>
<p>Here since the Idris compiler doesn’t know anything about Java’s <code>Integer</code> class or its <code>parseInt</code> method, we have to
explicitly provide the function signature. The function call also has the explicit <code>Class</code>
before <code>java/lang/Integer</code> and the type of invocation <code>invokeStatic</code>.</p>
<p>Since we are targeting JVM bytecode, JVM has to know whether a method call is a static method call or an interface
method call or a virtual method call. It would be nice if we don’t have to worry about any of these things and
just call a FFI function with a class name, method name and the arguments. This is the motivation behind this
new feature along with some other nice things like null safety, construtor and method overloading resolution
and exception handling.</p>
<h4 id="maybe-and-either-in-foreign-function-calls">Maybe and Either in foreign function calls</h4>
<p><code>Maybe</code> type and <code>Either</code> type can be used in foreign function calls for null safety and exception handling. <code>Maybe</code>
type can be used for argument types and return types. <code>Maybe</code> type used in an argument position will pass <code>null</code>
to the target foreign function if it is <code>Nothing</code> or the actual value if it is <code>Just</code>. Similarly, <code>Maybe</code> type
used for return type will convert <code>null</code> returned from foreign function into <code>Nothing</code> and the non-null value into
<code>Just.</code> At the bytecode level, <code>Maybe</code> wrapper doesn’t exist. It gets compiled down to
<code>null</code> or the actual value.</p>
<p><code>Either</code> type can only be used in return types to indicate whether the foreign function can throw exceptions.
At runtime, if the foreign function throws exception, it will be captured in the “left” of type <code>Throwable</code> or if the
foreign function completes normally, the result will be stored in the “right” of result type. There are functions <code>try</code>
and <code>catch</code> to handle exceptions which we will see later in the post.</p>
<h2 id="how-it-works">How it works</h2>
<p>Before we look at some examples, first let’s declare some class names as we are going to use them in multiple places and
we don’t want to duplicate.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#B392F0">stringClass</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">stringClass </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/lang/String"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">listInterface</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">listInterface </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/util/List"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">arrayListClass</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">arrayListClass </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/util/ArrayList"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">collectionInterface</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">collectionInterface </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/util/Collection"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">systemClass</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">systemClass </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/lang/System"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">comparatorClass</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">comparatorClass </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/util/Comparator"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">pointClass</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">pointClass </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/awt/Point"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">collectionsClass</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">collectionsClass </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/util/Collections"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">stringBuilderClass</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">stringBuilderClass </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/lang/StringBuilder"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">objectsClass</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">objectsClass </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/util/Objects"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">integerClass</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> String</span></span>
<span class="line"><span style="color:#E1E4E8">integerClass </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "java/lang/Integer"</span></span></code></pre>
<p>And “import” some methods:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#E1E4E8">jdkimport [</span></span>
<span class="line"><span style="color:#E1E4E8">    (systemClass, [</span><span style="color:#9ECBFF">"getProperty"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"setProperty"</span><span style="color:#E1E4E8">]),</span></span>
<span class="line"><span style="color:#E1E4E8">    (stringClass, [</span><span style="color:#9ECBFF">"substring"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"CASE_INSENSITIVE_ORDER"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"valueOf"</span><span style="color:#E1E4E8">]),</span></span>
<span class="line"><span style="color:#E1E4E8">    (integerClass, [</span><span style="color:#9ECBFF">"parseInt"</span><span style="color:#E1E4E8">]),</span></span>
<span class="line"><span style="color:#E1E4E8">    (comparatorClass, [</span><span style="color:#9ECBFF">"compare"</span><span style="color:#E1E4E8">]),</span></span>
<span class="line"><span style="color:#E1E4E8">    (arrayListClass, [</span><span style="color:#9ECBFF">"&#x3C;init>"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"add"</span><span style="color:#E1E4E8">]),</span></span>
<span class="line"><span style="color:#E1E4E8">    (listInterface, [</span><span style="color:#9ECBFF">"get"</span><span style="color:#E1E4E8">]),</span></span>
<span class="line"><span style="color:#E1E4E8">    (collectionsClass, [</span><span style="color:#9ECBFF">"max"</span><span style="color:#E1E4E8">]),</span></span>
<span class="line"><span style="color:#E1E4E8">    (stringBuilderClass, [</span><span style="color:#9ECBFF">"&#x3C;init>"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"toString"</span><span style="color:#E1E4E8">]),</span></span>
<span class="line"><span style="color:#E1E4E8">    (objectsClass, [</span><span style="color:#9ECBFF">"toString"</span><span style="color:#E1E4E8">]),</span></span>
<span class="line"><span style="color:#E1E4E8">    (pointClass, [</span><span style="color:#9ECBFF">"&#x3C;init>"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"x"</span><span style="color:#E1E4E8">])</span></span>
<span class="line"><span style="color:#E1E4E8">  ]</span></span></code></pre>
<p>Here <code>jdkimport</code> is just an additional syntax created using Idris syntax extensions. It just calls a type provider
function written in Idris to know about these classes, methods and fields. Note that it imports fields such as
<code>CASE_INSENSITIVE_ORDER</code>, <code>x</code> and also constructors in the name of <code>&#x3C;init></code> which is the JVM internal name for
constructors. The <code>jdkimport</code> syntax launches a JVM during compilation without any classpath so it basically can import
all the JDK classes and methods.</p>
<p>There is also another syntax called <code>jvmimport</code> that can take an additional argument, a command, which could be just the
JVM with correct classpath or could be a build tool that properly sets up the classpath from your project dependencies so
that we can “import” classes and methods from external foreign libraries.</p>
<p>Once the information about JVM classes and methods is collected using type provider, appropriate call site, Idris code
similar to the one in the beginning of the post can be created using Idris elaborator reflection with just class name
and member name from the user. As a user, we don’t have to know much about these internals, we just need to import classes
and members and can use them without having to explicitly provide foreign types. Now let’s look at some examples on how we can
actually make FFI calls in the new way.</p>
<h2 id="examples">Examples</h2>
<h4 id="1-safe-static-method-call">1. Safe static method call</h4>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#B392F0">main</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">  exceptionOrInt </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> (integerClass </span><span style="color:#F97583">&#x3C;.></span><span style="color:#9ECBFF"> "parseInt"</span><span style="color:#E1E4E8">) </span><span style="color:#9ECBFF">"1234"</span></span>
<span class="line"><span style="color:#E1E4E8">  printLn </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> either (const </span><span style="color:#79B8FF">0</span><span style="color:#E1E4E8">) id exceptionOrInt </span></span></code></pre>
<p>Here the type of <code>(integerClass &#x3C;.> "parseInt")</code> is <code>String -> JVM_IO (Either Throwable Int)</code>. Since the method can throw
exceptions, it returns an <code>Either</code>. Here we return <code>0</code> in case of an exception. Later in the post, we will see a
detailed example of exception handling. As the method returns an <code>Int</code> which is a primitive type in JVM, it cannot be
null and the FFI call already knows that hence the result <code>Int</code> is not wrapped in a <code>Maybe</code>. We don’t provide any
explicit type signature for the foreign function. If we try to pass anything other than <code>String</code> for this foreign
function, it will be a compilation error!</p>
<h4 id="2-unsafe-static-method-call">2. Unsafe static method call</h4>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">  do</span></span>
<span class="line"><span style="color:#E1E4E8">    number </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> (integerClass </span><span style="color:#F97583">&#x3C;.!></span><span style="color:#9ECBFF"> "parseInt"</span><span style="color:#E1E4E8">) </span><span style="color:#9ECBFF">"23"</span></span>
<span class="line"><span style="color:#E1E4E8">    printLn number</span></span></code></pre>
<p>Here we use <code>&#x3C;.!></code> with an <code>!</code> to indicate an unsafe method call instead of <code>&#x3C;.></code>. There is also <code>javaUnsafe</code> and <code>java</code>
if you prefer names to operators. The type of <code>(integerClass &#x3C;.!> "parseInt")</code> is <code>String -> JVM_IO Int</code>.
Sometimes if we are sure that the foreign function would not return null or throw exceptions, we can use unsafe method
calls but as the name indicates, it would fail at runtime if null is returned or an exception is thrown.</p>
<h4 id="3-overloading-resolution">3. Overloading resolution</h4>
<p>We can pick which overloaded variant we want to use by passing appropriate types to the foreign function and
the FFI call will automatically have corresponding types.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#E1E4E8">printLn </span><span style="color:#F97583">!</span><span style="color:#E1E4E8">((stringClass </span><span style="color:#F97583">&#x3C;.!></span><span style="color:#9ECBFF"> "valueOf(double)"</span><span style="color:#E1E4E8">) </span><span style="color:#79B8FF">2</span><span style="color:#F97583">.</span><span style="color:#79B8FF">5</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">printLn </span><span style="color:#F97583">!</span><span style="color:#E1E4E8">((stringClass </span><span style="color:#F97583">&#x3C;.!></span><span style="color:#9ECBFF"> "valueOf(char)"</span><span style="color:#E1E4E8">) </span><span style="color:#9ECBFF">'H'</span><span style="color:#E1E4E8">)</span></span></code></pre>
<p>The first function takes an Idris <code>Double</code> and the second function takes Idris <code>Char</code>. The types passed to the foreign
functions to resolve overloading are JVM types.</p>
<h4 id="4-safe-instance-method">4. Safe instance method</h4>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">  do</span></span>
<span class="line"><span style="color:#E1E4E8">    s </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> (stringClass </span><span style="color:#F97583">&#x3C;.></span><span style="color:#9ECBFF"> "substring(int)"</span><span style="color:#E1E4E8">) </span><span style="color:#9ECBFF">"Foobar"</span><span style="color:#79B8FF"> 1</span></span>
<span class="line"><span style="color:#E1E4E8">    putStrLn </span><span style="color:#F97583">!</span><span style="color:#E1E4E8">(either throw (pure </span><span style="color:#F97583">.</span><span style="color:#E1E4E8"> show) s) </span></span>
<span class="line"></span></code></pre>
<p>Safe instance method calls are similar to static method calls except that the instance should be passed as the first
argument. Here again, we don’t provide any explicit type signature or the type of method invocation whether it is static or
instance method but it all works out automatically in a type safe way. Here also we pick a particular overloaded version.</p>
<p>The type of <code>(stringClass &#x3C;.> "substring(int)")</code> is <code>String -> Int -> JVM_IO (Either Throwable (Maybe String))</code>.
Since the return type is <code>String</code> and it can be null, it is in a <code>Maybe</code> and the method can throw exceptions so the
overall type is in <code>Either</code>.</p>
<h4 id="5-exception-handling">5. Exception handling</h4>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">do</span></span>
<span class="line"><span style="color:#E1E4E8">  propValue </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> try ((systemClass </span><span style="color:#F97583">&#x3C;.></span><span style="color:#9ECBFF"> "getProperty(?java/lang/String)"</span><span style="color:#E1E4E8">) </span><span style="color:#B392F0">Nothing</span><span style="color:#E1E4E8">) [</span></span>
<span class="line"><span style="color:#E1E4E8">    ([catch </span><span style="color:#B392F0">IllegalArgumentExceptionClass</span><span style="color:#E1E4E8">, catch </span><span style="color:#B392F0">NullPointerExceptionClass</span><span style="color:#E1E4E8">], </span><span style="color:#F97583">\</span><span style="color:#E1E4E8">t </span><span style="color:#F97583">=></span></span>
<span class="line"><span style="color:#F97583">      do</span></span>
<span class="line"><span style="color:#E1E4E8">        printLn </span><span style="color:#9ECBFF">"property name is null or empty"</span></span>
<span class="line"><span style="color:#E1E4E8">        pure </span><span style="color:#B392F0">Nothing</span></span>
<span class="line"><span style="color:#E1E4E8">    ),</span></span>
<span class="line"><span style="color:#E1E4E8">    ([catchNonFatal], </span><span style="color:#F97583">\</span><span style="color:#E1E4E8">t </span><span style="color:#F97583">=></span></span>
<span class="line"><span style="color:#F97583">      do</span></span>
<span class="line"><span style="color:#E1E4E8">        printLn </span><span style="color:#9ECBFF">"unable to get property value"</span></span>
<span class="line"><span style="color:#E1E4E8">        pure </span><span style="color:#B392F0">Nothing</span></span>
<span class="line"><span style="color:#E1E4E8">    )</span></span>
<span class="line"><span style="color:#E1E4E8">  ]</span></span>
<span class="line"><span style="color:#E1E4E8">  printLn propValue</span></span></code></pre>
<p>This example shows how to handle exceptions with different handlers and also shows how to pass a <code>null</code> to a foreign function.
If a FFI function argument type is prefixed with <code>?</code>, then the idris type would be <code>Maybe nativeTy</code> and we can pass
<code>Nothing</code> to pass a <code>null</code> to the foreign function. We can have handlers for single exception, multiple exceptions or
for all non fatal errors similar to Scala’s
<a href="https://github.com/scala/scala/blob/2.12.x/src/library/scala/util/control/NonFatal.scala">NonFatal</a>.</p>
<h4 id="6-constructors">6. Constructors</h4>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">do</span></span>
<span class="line"><span style="color:#E1E4E8">  arrayList1 </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> (arrayListClass </span><span style="color:#F97583">&#x3C;.></span><span style="color:#9ECBFF"> "&#x3C;init>(int)"</span><span style="color:#E1E4E8">) </span><span style="color:#79B8FF">10</span></span>
<span class="line"><span style="color:#E1E4E8">  putStrLn </span><span style="color:#F97583">!</span><span style="color:#E1E4E8">(either throw toString arrayList1)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">  -- Unsafe constructor</span></span>
<span class="line"><span style="color:#E1E4E8">  arrayList2 </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> arrayListClass </span><span style="color:#F97583">&#x3C;.!></span><span style="color:#9ECBFF"> "&#x3C;init>()"</span></span>
<span class="line"><span style="color:#E1E4E8">  putStrLn </span><span style="color:#F97583">!</span><span style="color:#E1E4E8">(toString arrayList2)</span></span></code></pre>
<p>Similar to methods, constructors can be overloaded and we can select a particular overload variant by explicitly
specifying the foreign type. Constructors can also be invoked in a safe or unsafe way. As constructors cannot return
null, when invoked in a safe way, the result type will only be in <code>Either</code> and not wrapped in a <code>Maybe</code>.</p>
<h4 id="7-fields">7. Fields</h4>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">do</span></span>
<span class="line"><span style="color:#6A737D">  -- static field getter</span></span>
<span class="line"><span style="color:#E1E4E8">  caseInsensitiveComparator </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> stringClass </span><span style="color:#F97583">&#x3C;.#!></span><span style="color:#9ECBFF"> "CASE_INSENSITIVE_ORDER"</span></span>
<span class="line"><span style="color:#E1E4E8">  printLn </span><span style="color:#F97583">!</span><span style="color:#E1E4E8">((comparatorClass </span><span style="color:#F97583">&#x3C;.!></span><span style="color:#9ECBFF"> "compare"</span><span style="color:#E1E4E8">) caseInsensitiveComparator </span><span style="color:#9ECBFF">"Bar"</span><span style="color:#9ECBFF"> "august"</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">  point </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> (pointClass </span><span style="color:#F97583">&#x3C;.!></span><span style="color:#9ECBFF"> "&#x3C;init>(int,int)"</span><span style="color:#E1E4E8">) </span><span style="color:#79B8FF">2</span><span style="color:#79B8FF"> 3</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">  -- instance field getter</span></span>
<span class="line"><span style="color:#E1E4E8">  printLn </span><span style="color:#F97583">!</span><span style="color:#E1E4E8">((pointClass </span><span style="color:#F97583">&#x3C;.#></span><span style="color:#9ECBFF"> "x"</span><span style="color:#E1E4E8">) point)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">  -- instance field setter</span></span>
<span class="line"><span style="color:#E1E4E8">  (pointClass </span><span style="color:#F97583">&#x3C;.=></span><span style="color:#9ECBFF"> "x"</span><span style="color:#E1E4E8">) point </span><span style="color:#79B8FF">34</span></span>
<span class="line"><span style="color:#E1E4E8">  printLn </span><span style="color:#F97583">!</span><span style="color:#E1E4E8">((pointClass </span><span style="color:#F97583">&#x3C;.#></span><span style="color:#9ECBFF"> "x"</span><span style="color:#E1E4E8">) point)</span></span></code></pre>
<p>Similar to methods and constructors, fields can also be accessed either in a safe or unsafe way using <code>&#x3C;.#></code> for safe
getter, <code>&#x3C;.=></code> for safe setter, <code>&#x3C;.#!></code> for unsafe getter and <code>&#x3C;.=!></code> for unsafe setter. Since field access
cannot throw a exception, the return type is automatically just <code>Maybe nativeTy</code>. The field types are automatically
determined without the user having to provide the foreign types of the fields.</p>
<h2 id="summary">Summary</h2>
<p>This post demonstrated how with Idris’ powerful features FFI, type provider and elaborator reflection, we can safely and
easily access JVM foreign functions. We can access fields, methods and constructors without having to explicitly provide
foreign types and we can access them in safe way without <code>null</code> getting into Idris code and handle exceptions thrown by
foreign functions. It also showed how to call overloaded methods and constructors and how <code>Maybe</code> and <code>Either</code> types are
used with foreign functions.</p>]]></content:encoded>
            <author>Marimuthu Madasamy</author>
            <category>Idris</category>
            <category>JVM</category>
            <category>Java</category>
        </item>
        <item>
            <title><![CDATA[Idris JVM: Guarding against Java null using Maybe type]]></title>
            <link>https://mmhelloworld.github.io/post/idris-jvm-guarding-against-java-null-using-maybe-type</link>
            <guid isPermaLink="false">https://mmhelloworld.github.io/post/idris-jvm-guarding-against-java-null-using-maybe-type</guid>
            <pubDate>Tue, 10 Jan 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[Idris JVM now helps avoiding nulls getting into Idris from FFI calls using Maybe type. FFI declarations can have Maybe type in any argument position or in…]]></description>
            <content:encoded><![CDATA[<p>Idris JVM now helps avoiding nulls getting into Idris from FFI calls using <code>Maybe</code> type.
FFI declarations can have <code>Maybe</code> type in any argument position or in the return type.</p>
<h2 id="handling-null-from-ffi-call">Handling <code>null</code> from FFI call</h2>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#B392F0">getProperty</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> String</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">Maybe</span><span style="color:#79B8FF"> String</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">getProperty </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> invokeStatic </span><span style="color:#B392F0">SystemClass</span><span style="color:#9ECBFF"> "getProperty"</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">String</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">Maybe</span><span style="color:#79B8FF"> String</span><span style="color:#E1E4E8">))</span></span></code></pre>
<p>The above function is an FFI call to Java’s method
<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#getProperty-java.lang.String-"><code>static String getProperty(String key)</code></a>.
The method returns a system property value if the property is set otherwise returns null.
With <code>Maybe</code> type in the Idris function’s return type, the Idris function returns <code>Nothing</code> if the returned value is null
otherwise the value is wrapped in <code>Just</code>.</p>
<h6 id="example">Example</h6>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">module</span><span style="color:#E1E4E8"> Main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#79B8FF"> IdrisJvm.IO</span></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#79B8FF"> Java.Lang</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">main</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> printLn </span><span style="color:#F97583">!</span><span style="color:#E1E4E8">(getProperty </span><span style="color:#9ECBFF">"foo"</span><span style="color:#E1E4E8">)  </span></span></code></pre>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">$</span><span style="color:#9ECBFF"> idris</span><span style="color:#79B8FF"> --portable-codegen</span><span style="color:#9ECBFF"> jvm</span><span style="color:#79B8FF"> -p</span><span style="color:#9ECBFF"> idrisjvmffi</span><span style="color:#9ECBFF"> returningnull.idr</span><span style="color:#79B8FF"> -o</span><span style="color:#9ECBFF"> target</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">$</span><span style="color:#9ECBFF"> java</span><span style="color:#79B8FF"> -cp</span><span style="color:#9ECBFF"> target:/path/to/idris-jvm-runtime-1.0-SNAPSHOT.jar</span><span style="color:#9ECBFF"> main.Main</span></span>
<span class="line"><span style="color:#B392F0">Nothing</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">$</span><span style="color:#9ECBFF"> java</span><span style="color:#79B8FF"> -cp</span><span style="color:#9ECBFF"> target:/path/to/idris-jvm-runtime-1.0-SNAPSHOT.jar</span><span style="color:#79B8FF"> -Dfoo=hello</span><span style="color:#9ECBFF"> main.Main</span></span>
<span class="line"><span style="color:#B392F0">Just</span><span style="color:#9ECBFF"> "hello"</span></span>
<span class="line"></span></code></pre>
<h2 id="passing-maybe-values-for-nullable-values-in-ffi-calls">Passing <code>Maybe</code> values for nullable values in FFI calls</h2>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">module</span><span style="color:#E1E4E8"> Main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#79B8FF"> IdrisJvm.IO</span></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#79B8FF"> Java.Lang</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">namespace</span><span style="color:#B392F0"> Component</span></span>
<span class="line"><span style="color:#B392F0">  Component</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Type</span></span>
<span class="line"><span style="color:#B392F0">  Component</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> JVM_Native</span><span style="color:#F97583"> $</span><span style="color:#B392F0"> Class</span><span style="color:#9ECBFF"> "java/awt/Component"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">namespace</span><span style="color:#B392F0"> JOptionPane</span></span>
<span class="line"><span style="color:#B392F0">  JOptionPaneClass</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> JVM_NativeTy</span></span>
<span class="line"><span style="color:#B392F0">  JOptionPaneClass</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> Class</span><span style="color:#9ECBFF"> "javax/swing/JOptionPane"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">  showMessageDialog</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Inherits</span><span style="color:#B392F0"> Object</span><span style="color:#E1E4E8"> messageTy </span><span style="color:#F97583">=></span><span style="color:#B392F0"> Maybe</span><span style="color:#B392F0"> Component</span><span style="color:#F97583"> -></span><span style="color:#E1E4E8"> messageTy </span><span style="color:#F97583">-></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">  showMessageDialog parent message </span><span style="color:#F97583">=</span></span>
<span class="line"><span style="color:#E1E4E8">    invokeStatic </span><span style="color:#B392F0">JOptionPaneClass</span><span style="color:#9ECBFF"> "showMessageDialog"</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">Maybe</span><span style="color:#B392F0"> Component</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> Object</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span><span style="color:#E1E4E8">) parent (believe_me message)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">main</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> showMessageDialog </span><span style="color:#B392F0">Nothing</span><span style="color:#9ECBFF"> "Hello Idris!"</span></span>
<span class="line"></span></code></pre>
<p>In the above code, the Java method
<a href="https://docs.oracle.com/javase/8/docs/api/javax/swing/JOptionPane.html#showMessageDialog-java.awt.Component-java.lang.Object-"><code>JOptionPane.showMessageDialog(parentComponent, message)</code></a>
takes a nullable parent component and a message. If the parent component is <code>null</code> then the message is displayed in a default frame.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="plaintext"><code><span class="line"><span>$ idris --portable-codegen jvm -p idrisjvmffi passingnull.idr -o target</span></span>
<span class="line"><span></span></span>
<span class="line"><span>$ java -cp target:/path/to/idris-jvm-runtime-1.0-SNAPSHOT.jar main.Main</span></span></code></pre>
<p>Idris code passes <code>Nothing</code> in the above code so <code>null</code> is passed for the Java method that displays the message in a default frame as shown below.
<img src="https://mmhelloworld.github.io/images/idris-passing-null.png" alt="Idris Passing Null"></p>]]></content:encoded>
            <author>Marimuthu Madasamy</author>
            <category>Idris</category>
            <category>JVM</category>
            <category>Java</category>
        </item>
        <item>
            <title><![CDATA[Introducing Idris on the JVM and an Idris Android example]]></title>
            <link>https://mmhelloworld.github.io/post/introducing-idris-on-the-jvm-and-an-idris-android-example</link>
            <guid isPermaLink="false">https://mmhelloworld.github.io/post/introducing-idris-on-the-jvm-and-an-idris-android-example</guid>
            <pubDate>Fri, 06 Jan 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[Idris on the JVM! Yes, a dependently typed language on the JVM! I have been working on a JVM bytecode backend for Idris for the past few months and it is…]]></description>
            <content:encoded><![CDATA[<p><a href="https://github.com/mmhelloworld/idris-jvm">Idris on the JVM!</a> Yes, a dependently typed language on the JVM!
I have been working on a <a href="https://github.com/mmhelloworld/idris-jvm">JVM bytecode backend for Idris</a> for the past few months and
it is now at a point that we can even write Android programs with Idris without having to write a single line of Java.
In this post, we will see how Idris works on the JVM and an example Android program written in Idris.</p>
<h2 id="hello-world">Hello World</h2>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">module</span><span style="color:#E1E4E8"> Main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">main</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> printLn </span><span style="color:#9ECBFF">"Hello World"</span></span></code></pre>
<h6 id="compile">Compile:</h6>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">$</span><span style="color:#9ECBFF"> idris</span><span style="color:#79B8FF"> --portable-codegen</span><span style="color:#9ECBFF"> jvm</span><span style="color:#79B8FF"> -p</span><span style="color:#9ECBFF"> idrisjvmffi</span><span style="color:#9ECBFF"> helloworld.idr</span><span style="color:#79B8FF"> -o</span><span style="color:#9ECBFF"> target</span></span></code></pre>
<p>Dependencies are provided as Idris packages, not as Java dependencies like jar or class files.
The overall process is that the compiler reads Idris files and converts them into an intermediate JSON representation and
the JVM bytecode generator takes the JSON files and converts them into JVM bytecode class files directly.
It is only when we run a Java class, we have to provide Java dependency jars. The output option <code>-o</code> represents a directory
where the Java class files will be created.</p>
<h6 id="run">Run:</h6>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">$</span><span style="color:#9ECBFF"> java</span><span style="color:#79B8FF"> -cp</span><span style="color:#9ECBFF"> target:/path/to/idris-jvm-runtime-1.0-SNAPSHOT.jar</span><span style="color:#9ECBFF"> main.Main</span></span>
<span class="line"><span style="color:#B392F0">"Hello World"</span></span>
<span class="line"></span></code></pre>
<p>And the output folder contains,</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">$</span><span style="color:#9ECBFF"> tree</span><span style="color:#9ECBFF"> target</span></span>
<span class="line"><span style="color:#B392F0">target</span></span>
<span class="line"><span style="color:#B392F0">├──</span><span style="color:#9ECBFF"> Decidable</span></span>
<span class="line"><span style="color:#B392F0">│  </span><span style="color:#9ECBFF"> └──</span><span style="color:#9ECBFF"> Equality.class</span></span>
<span class="line"><span style="color:#B392F0">├──</span><span style="color:#9ECBFF"> main</span></span>
<span class="line"><span style="color:#B392F0">│  </span><span style="color:#9ECBFF"> └──</span><span style="color:#9ECBFF"> Main.class</span></span>
<span class="line"><span style="color:#B392F0">└──</span><span style="color:#9ECBFF"> Prelude</span></span>
<span class="line"><span style="color:#B392F0">    ├──</span><span style="color:#9ECBFF"> Basics.class</span></span>
<span class="line"><span style="color:#B392F0">    ├──</span><span style="color:#9ECBFF"> Bool.class</span></span>
<span class="line"><span style="color:#B392F0">    ├──</span><span style="color:#9ECBFF"> Chars.class</span></span>
<span class="line"><span style="color:#B392F0">    ├──</span><span style="color:#9ECBFF"> Interfaces.class</span></span>
<span class="line"><span style="color:#B392F0">    ├──</span><span style="color:#9ECBFF"> Show.class</span></span>
<span class="line"><span style="color:#B392F0">    └──</span><span style="color:#9ECBFF"> Strings.class</span></span>
<span class="line"></span></code></pre>
<p>Why do we have all these classes? We only compiled <code>Main</code> module! This is because Idris performs whole program analysis/compilation
and code generator generates bytecode for all the modules that are relevant for the result produced by the main program.</p>
<h2 id="how-does-idris-jvm-handle-tail-calls">How does Idris JVM handle tail calls?</h2>
<p>Idris JVM eliminates self-recursion with JVM <code>GOTO</code> and uses trampolines for other tail calls.
Let’s look at the following examples.</p>
<h5 id="self-recursion-example">self-recursion example</h5>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">module</span><span style="color:#E1E4E8"> Main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#79B8FF"> IdrisJvm.IO</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">sum</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Nat</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> Nat</span></span>
<span class="line"><span style="color:#E1E4E8">sum n </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> go </span><span style="color:#79B8FF">0</span><span style="color:#E1E4E8"> n </span><span style="color:#F97583">where</span></span>
<span class="line"><span style="color:#B392F0">  go</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Nat</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> Nat</span><span style="color:#F97583"> -></span><span style="color:#79B8FF"> Nat</span></span>
<span class="line"><span style="color:#E1E4E8">  go acc </span><span style="color:#79B8FF">Z</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> acc</span></span>
<span class="line"><span style="color:#E1E4E8">  go acc n</span><span style="color:#F97583">@</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">S</span><span style="color:#E1E4E8"> k) </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> go (acc </span><span style="color:#F97583">+</span><span style="color:#E1E4E8"> n) k</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">main</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> printLn (sum </span><span style="color:#79B8FF">50000</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span></code></pre>
<p>This program would work just fine without blowing up the stack as it will be compiled down to a loop that uses JVM’s <code>GOTO</code> instruction.
Here is the relevant section from bytecode:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">$</span><span style="color:#9ECBFF"> javap</span><span style="color:#79B8FF"> -c</span><span style="color:#79B8FF"> -cp</span><span style="color:#9ECBFF"> target:/path/to/idris-jvm-runtime-1.0-SNAPSHOT.jar</span><span style="color:#9ECBFF"> main.Main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">  public</span><span style="color:#9ECBFF"> static</span><span style="color:#9ECBFF"> java.lang.Object</span><span style="color:#9ECBFF"> sum</span><span style="color:#E1E4E8">$whr$go$colon</span><span style="color:#FFAB70">$0</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">java.lang.Object,</span><span style="color:#9ECBFF"> java.lang.Object,</span><span style="color:#9ECBFF"> java.lang.Object</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#B392F0">    Code:</span></span>
<span class="line"><span style="color:#B392F0">       0:</span><span style="color:#9ECBFF"> aconst_null</span></span>
<span class="line"><span style="color:#B392F0">       1:</span><span style="color:#9ECBFF"> astore</span><span style="color:#79B8FF">        7</span></span>
<span class="line"><span style="color:#B392F0">       3:</span><span style="color:#9ECBFF"> aconst_null</span></span>
<span class="line"><span style="color:#B392F0">       4:</span><span style="color:#9ECBFF"> astore_3</span></span>
<span class="line"><span style="color:#B392F0">       5:</span><span style="color:#9ECBFF"> aconst_null</span></span>
<span class="line"><span style="color:#B392F0">       6:</span><span style="color:#9ECBFF"> astore</span><span style="color:#79B8FF">        4</span></span>
<span class="line"><span style="color:#B392F0">       8:</span><span style="color:#9ECBFF"> aconst_null</span></span>
<span class="line"><span style="color:#B392F0">       9:</span><span style="color:#9ECBFF"> astore</span><span style="color:#79B8FF">        5</span></span>
<span class="line"><span style="color:#B392F0">      11:</span><span style="color:#9ECBFF"> aconst_null</span></span>
<span class="line"><span style="color:#B392F0">      12:</span><span style="color:#9ECBFF"> astore</span><span style="color:#79B8FF">        6</span></span>
<span class="line"><span style="color:#B392F0">      14:</span><span style="color:#9ECBFF"> iconst_1</span></span>
<span class="line"><span style="color:#B392F0">      15:</span><span style="color:#9ECBFF"> istore</span><span style="color:#79B8FF">        8</span></span>
<span class="line"><span style="color:#B392F0">      17:</span><span style="color:#9ECBFF"> iload</span><span style="color:#79B8FF">         8</span></span>
<span class="line"><span style="color:#B392F0">      19:</span><span style="color:#9ECBFF"> ifeq</span><span style="color:#79B8FF">          130</span></span>
<span class="line"><span style="color:#B392F0">      22:</span><span style="color:#9ECBFF"> aload_2</span></span>
<span class="line"><span style="color:#B392F0">      23:</span><span style="color:#9ECBFF"> new</span><span style="color:#6A737D">           #80                 // class java/math/BigInteger</span></span>
<span class="line"><span style="color:#B392F0">      26:</span><span style="color:#9ECBFF"> dup</span></span>
<span class="line"><span style="color:#B392F0">      27:</span><span style="color:#9ECBFF"> ldc</span><span style="color:#6A737D">           #82                 // String 0</span></span>
<span class="line"><span style="color:#B392F0">      29:</span><span style="color:#9ECBFF"> invokespecial</span><span style="color:#6A737D"> #85                 // Method java/math/BigInteger."&#x3C;init>":(Ljava/lang/String;)V</span></span>
<span class="line"><span style="color:#B392F0">      32:</span><span style="color:#9ECBFF"> invokestatic</span><span style="color:#6A737D">  #333                // Method mmhelloworld/idrisjvmruntime/Util.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z</span></span>
<span class="line"><span style="color:#B392F0">      35:</span><span style="color:#9ECBFF"> ifeq</span><span style="color:#79B8FF">          47</span></span>
<span class="line"><span style="color:#B392F0">      38:</span><span style="color:#9ECBFF"> aload_1</span></span>
<span class="line"><span style="color:#B392F0">      39:</span><span style="color:#9ECBFF"> astore</span><span style="color:#79B8FF">        7</span></span>
<span class="line"><span style="color:#B392F0">      41:</span><span style="color:#9ECBFF"> iconst_0</span></span>
<span class="line"><span style="color:#B392F0">      42:</span><span style="color:#9ECBFF"> istore</span><span style="color:#79B8FF">        8</span></span>
<span class="line"><span style="color:#B392F0">      44:</span><span style="color:#9ECBFF"> goto</span><span style="color:#79B8FF">          127</span></span>
<span class="line"><span style="color:#B392F0">      47:</span><span style="color:#9ECBFF"> new</span><span style="color:#6A737D">           #80                 // class java/math/BigInteger</span></span>
<span class="line"><span style="color:#B392F0">      50:</span><span style="color:#9ECBFF"> dup</span></span>
<span class="line"><span style="color:#B392F0">      51:</span><span style="color:#9ECBFF"> ldc_w</span><span style="color:#6A737D">         #335                // String 1</span></span>
<span class="line"><span style="color:#B392F0">      54:</span><span style="color:#9ECBFF"> invokespecial</span><span style="color:#6A737D"> #85                 // Method java/math/BigInteger."&#x3C;init>":(Ljava/lang/String;)V</span></span>
<span class="line"><span style="color:#B392F0">      57:</span><span style="color:#9ECBFF"> astore_3</span></span>
<span class="line"><span style="color:#B392F0">      58:</span><span style="color:#9ECBFF"> aload_2</span></span>
<span class="line"><span style="color:#B392F0">      59:</span><span style="color:#9ECBFF"> invokestatic</span><span style="color:#6A737D">  #103                // Method mmhelloworld/idrisjvmruntime/Util.asBigInt:(Ljava/lang/Object;)Ljava/math/BigInteger;</span></span>
<span class="line"><span style="color:#B392F0">      62:</span><span style="color:#9ECBFF"> aload_3</span></span>
<span class="line"><span style="color:#B392F0">      63:</span><span style="color:#9ECBFF"> invokestatic</span><span style="color:#6A737D">  #103                // Method mmhelloworld/idrisjvmruntime/Util.asBigInt:(Ljava/lang/Object;)Ljava/math/BigInteger;</span></span>
<span class="line"><span style="color:#B392F0">      66:</span><span style="color:#9ECBFF"> invokevirtual</span><span style="color:#6A737D"> #338                // Method java/math/BigInteger.subtract:(Ljava/math/BigInteger;)Ljava/math/BigInteger;</span></span>
<span class="line"><span style="color:#B392F0">      69:</span><span style="color:#9ECBFF"> astore_3</span></span>
<span class="line"><span style="color:#B392F0">      70:</span><span style="color:#9ECBFF"> new</span><span style="color:#6A737D">           #80                 // class java/math/BigInteger</span></span>
<span class="line"><span style="color:#B392F0">      73:</span><span style="color:#9ECBFF"> dup</span></span>
<span class="line"><span style="color:#B392F0">      74:</span><span style="color:#9ECBFF"> ldc_w</span><span style="color:#6A737D">         #335                // String 1</span></span>
<span class="line"><span style="color:#B392F0">      77:</span><span style="color:#9ECBFF"> invokespecial</span><span style="color:#6A737D"> #85                 // Method java/math/BigInteger."&#x3C;init>":(Ljava/lang/String;)V</span></span>
<span class="line"><span style="color:#B392F0">      80:</span><span style="color:#9ECBFF"> astore</span><span style="color:#79B8FF">        4</span></span>
<span class="line"><span style="color:#B392F0">      82:</span><span style="color:#9ECBFF"> aload_3</span></span>
<span class="line"><span style="color:#B392F0">      83:</span><span style="color:#9ECBFF"> invokestatic</span><span style="color:#6A737D">  #103                // Method mmhelloworld/idrisjvmruntime/Util.asBigInt:(Ljava/lang/Object;)Ljava/math/BigInteger;</span></span>
<span class="line"><span style="color:#B392F0">      86:</span><span style="color:#9ECBFF"> aload</span><span style="color:#79B8FF">         4</span></span>
<span class="line"><span style="color:#B392F0">      88:</span><span style="color:#9ECBFF"> invokestatic</span><span style="color:#6A737D">  #103                // Method mmhelloworld/idrisjvmruntime/Util.asBigInt:(Ljava/lang/Object;)Ljava/math/BigInteger;</span></span>
<span class="line"><span style="color:#B392F0">      91:</span><span style="color:#9ECBFF"> invokevirtual</span><span style="color:#6A737D"> #107                // Method java/math/BigInteger.add:(Ljava/math/BigInteger;)Ljava/math/BigInteger;</span></span>
<span class="line"><span style="color:#B392F0">      94:</span><span style="color:#9ECBFF"> astore</span><span style="color:#79B8FF">        4</span></span>
<span class="line"><span style="color:#B392F0">      96:</span><span style="color:#9ECBFF"> iconst_0</span></span>
<span class="line"><span style="color:#B392F0">      97:</span><span style="color:#9ECBFF"> invokestatic</span><span style="color:#6A737D">  #41                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;</span></span>
<span class="line"><span style="color:#B392F0">     100:</span><span style="color:#9ECBFF"> astore</span><span style="color:#79B8FF">        5</span></span>
<span class="line"><span style="color:#B392F0">     102:</span><span style="color:#9ECBFF"> aload_1</span></span>
<span class="line"><span style="color:#B392F0">     103:</span><span style="color:#9ECBFF"> invokestatic</span><span style="color:#6A737D">  #103                // Method mmhelloworld/idrisjvmruntime/Util.asBigInt:(Ljava/lang/Object;)Ljava/math/BigInteger;</span></span>
<span class="line"><span style="color:#B392F0">     106:</span><span style="color:#9ECBFF"> aload</span><span style="color:#79B8FF">         4</span></span>
<span class="line"><span style="color:#B392F0">     108:</span><span style="color:#9ECBFF"> invokestatic</span><span style="color:#6A737D">  #103                // Method mmhelloworld/idrisjvmruntime/Util.asBigInt:(Ljava/lang/Object;)Ljava/math/BigInteger;</span></span>
<span class="line"><span style="color:#B392F0">     111:</span><span style="color:#9ECBFF"> invokevirtual</span><span style="color:#6A737D"> #107                // Method java/math/BigInteger.add:(Ljava/math/BigInteger;)Ljava/math/BigInteger;</span></span>
<span class="line"><span style="color:#B392F0">     114:</span><span style="color:#9ECBFF"> astore</span><span style="color:#79B8FF">        6</span></span>
<span class="line"><span style="color:#B392F0">     116:</span><span style="color:#9ECBFF"> aload</span><span style="color:#79B8FF">         5</span></span>
<span class="line"><span style="color:#B392F0">     118:</span><span style="color:#9ECBFF"> astore_0</span></span>
<span class="line"><span style="color:#B392F0">     119:</span><span style="color:#9ECBFF"> aload</span><span style="color:#79B8FF">         6</span></span>
<span class="line"><span style="color:#B392F0">     121:</span><span style="color:#9ECBFF"> astore_1</span></span>
<span class="line"><span style="color:#B392F0">     122:</span><span style="color:#9ECBFF"> aload_3</span></span>
<span class="line"><span style="color:#B392F0">     123:</span><span style="color:#9ECBFF"> astore_2</span></span>
<span class="line"><span style="color:#B392F0">     124:</span><span style="color:#9ECBFF"> goto</span><span style="color:#79B8FF">          127</span></span>
<span class="line"><span style="color:#B392F0">     127:</span><span style="color:#9ECBFF"> goto</span><span style="color:#79B8FF">          17</span></span>
<span class="line"><span style="color:#B392F0">     130:</span><span style="color:#9ECBFF"> aload</span><span style="color:#79B8FF">         7</span></span>
<span class="line"><span style="color:#B392F0">     132:</span><span style="color:#9ECBFF"> areturn</span></span>
<span class="line"></span></code></pre>
<p>The third line from the last is the <code>GOTO</code> instruction that transfers the control back to the top of function instead of
actually calling the function.</p>
<h5 id="mutual-recursion-example">Mutual recursion example:</h5>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">module</span><span style="color:#E1E4E8"> Main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">mutual</span></span>
<span class="line"><span style="color:#B392F0">  evenT</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Nat</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> IO</span><span style="color:#79B8FF"> Bool</span></span>
<span class="line"><span style="color:#E1E4E8">  evenT </span><span style="color:#79B8FF">Z</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> pure </span><span style="color:#B392F0">True</span></span>
<span class="line"><span style="color:#E1E4E8">  evenT (</span><span style="color:#79B8FF">S</span><span style="color:#E1E4E8"> k) </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> oddT k</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">  oddT</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Nat</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> IO</span><span style="color:#79B8FF"> Bool</span></span>
<span class="line"><span style="color:#E1E4E8">  oddT </span><span style="color:#79B8FF">Z</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> pure </span><span style="color:#B392F0">False</span></span>
<span class="line"><span style="color:#E1E4E8">  oddT (</span><span style="color:#79B8FF">S</span><span style="color:#E1E4E8"> k) </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> evenT k</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">main</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> printLn </span><span style="color:#F97583">!</span><span style="color:#E1E4E8">(evenT </span><span style="color:#79B8FF">9999</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span></code></pre>
<p>The above code also would work fine without killing the stack. Mutual recursion is handled using trampolines and
the tail calls are delayed and compiled down to Java 8 lambdas. As the bytecode for this is bit long, here is the
decompiled bytecode for the <code>evenT</code> function:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="java"><code><span class="line"><span style="color:#F97583">    public</span><span style="color:#F97583"> static</span><span style="color:#E1E4E8"> Object </span><span style="color:#B392F0">evenT</span><span style="color:#E1E4E8">(Object var0) {</span></span>
<span class="line"><span style="color:#E1E4E8">        Object var4 </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> null</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">        Integer var1 </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> null</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">        Integer var2 </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> null</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">        IdrisObject var3 </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> null</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#F97583">        if</span><span style="color:#E1E4E8"> (Util.</span><span style="color:#B392F0">equals</span><span style="color:#E1E4E8">(var0, BigInteger.ZERO)) {</span></span>
<span class="line"><span style="color:#E1E4E8">            var1 </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> Integer.</span><span style="color:#B392F0">valueOf</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">0</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#E1E4E8">            var2 </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> Integer.</span><span style="color:#B392F0">valueOf</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">0</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#E1E4E8">            var3 </span><span style="color:#F97583">=</span><span style="color:#F97583"> new</span><span style="color:#B392F0"> IdrisObject</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#E1E4E8">            var4 </span><span style="color:#F97583">=</span><span style="color:#F97583"> new</span><span style="color:#B392F0"> IdrisObject</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">65653</span><span style="color:#E1E4E8">, </span><span style="color:#F97583">new</span><span style="color:#F97583"> Object</span><span style="color:#E1E4E8">[]{var1, var2, var3});</span></span>
<span class="line"><span style="color:#E1E4E8">        } </span><span style="color:#F97583">else</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#E1E4E8">            BigInteger var5 </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> BigInteger.ONE;</span></span>
<span class="line"><span style="color:#E1E4E8">            var5 </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> Util.</span><span style="color:#B392F0">asBigInt</span><span style="color:#E1E4E8">(var0).</span><span style="color:#B392F0">subtract</span><span style="color:#E1E4E8">(Util.</span><span style="color:#B392F0">asBigInt</span><span style="color:#E1E4E8">(var5));</span></span>
<span class="line"><span style="color:#E1E4E8">            var4 </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> () </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#F97583">                return</span><span style="color:#B392F0"> oddT</span><span style="color:#E1E4E8">(var5);</span></span>
<span class="line"><span style="color:#E1E4E8">            };</span></span>
<span class="line"><span style="color:#E1E4E8">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">        return</span><span style="color:#E1E4E8"> var4;</span></span>
<span class="line"><span style="color:#E1E4E8">    }</span></span></code></pre>
<p>As we can see from the decompiled output above, the <code>oddT</code> call is not performed on the same call stack but a thunk
wrapping the function call is returned using lambda (which is compiled down to JVM’s <code>invokedynamic</code> instruction).</p>
<p>Here is the relevant bit from bytecode for those who are interested:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="plaintext"><code><span class="line"><span>        68: getstatic     #64                 // Field java/math/BigInteger.ONE:Ljava/math/BigInteger;</span></span>
<span class="line"><span>        71: astore_1</span></span>
<span class="line"><span>        72: aload_0</span></span>
<span class="line"><span>        73: invokestatic  #68                 // Method io/github/mmhelloworld/idrisjvm/runtime/Util.asBigInt:(Ljava/lang/Object;)Ljava/math/BigInteger;</span></span>
<span class="line"><span>        76: aload_1</span></span>
<span class="line"><span>        77: invokestatic  #68                 // Method io/github/mmhelloworld/idrisjvm/runtime/Util.asBigInt:(Ljava/lang/Object;)Ljava/math/BigInteger;</span></span>
<span class="line"><span>        80: invokevirtual #72                 // Method java/math/BigInteger.subtract:(Ljava/math/BigInteger;)Ljava/math/BigInteger;</span></span>
<span class="line"><span>        83: astore_1</span></span>
<span class="line"><span>        84: aload_1</span></span>
<span class="line"><span>        85: invokedynamic #79,  0             // InvokeDynamic #1:call:(Ljava/lang/Object;)Lio/github/mmhelloworld/idrisjvm/runtime/Thunk;</span></span>
<span class="line"><span>        90: astore        4</span></span>
<span class="line"><span>        92: goto          95</span></span>
<span class="line"><span>        95: aload         4</span></span>
<span class="line"><span>        97: areturn</span></span></code></pre>
<h2 id="java-interoperability-calling-java-from-idris-and-calling-idris-from-java">Java interoperability: Calling Java from Idris and calling Idris from Java</h2>
<p>Idris JVM supports calling Java static methods, instance methods, constructors and also accessing static and instance fields from Idris.
At the moment, except for Java arrays, all the Java types can be constructed from Idris and passed to Java methods.
Support for handling nulls and exceptions is currently in progress and will soon be available.
(Update 01/10/2017: We can now
<a href="http://mmhelloworld.github.io/blog/2017/01/10/idris-jvm-guarding-against-java-null-using-maybe-type/">use <code>Maybe</code> type to avoid Java nulls</a>
in Idris code)</p>
<p>To use Idris functions from Java, Idris JVM supports exporting Idris functions as static methods, instance methods,
constructors of an exported Java class. The exported class can also extend a Java class or implement interfaces with Idris functions.</p>
<p>To demonstrate these features, let’s create an Android application In Idris.</p>
<h3 id="an-android-application-in-idris">An Android application in Idris</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="idris"><code><span class="line"><span style="color:#F97583">module</span><span style="color:#E1E4E8"> Main</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#79B8FF"> IdrisJvm.IO</span></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#79B8FF"> Java.Lang</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">pythag</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Int</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> List</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">Int</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">Int</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">Int</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">pythag max </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> [(x, y, z) </span><span style="color:#F97583">|</span><span style="color:#E1E4E8"> z </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> [</span><span style="color:#79B8FF">1</span><span style="color:#F97583">..</span><span style="color:#E1E4E8">max], y </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> [</span><span style="color:#79B8FF">1</span><span style="color:#F97583">..</span><span style="color:#E1E4E8">z], x </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> [</span><span style="color:#79B8FF">1</span><span style="color:#F97583">..</span><span style="color:#E1E4E8">y],</span></span>
<span class="line"><span style="color:#E1E4E8">                          x </span><span style="color:#F97583">*</span><span style="color:#E1E4E8"> x </span><span style="color:#F97583">+</span><span style="color:#E1E4E8"> y </span><span style="color:#F97583">*</span><span style="color:#E1E4E8"> y </span><span style="color:#F97583">==</span><span style="color:#E1E4E8"> z </span><span style="color:#F97583">*</span><span style="color:#E1E4E8"> z]</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">IdrisAndroidActivity</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Type</span></span>
<span class="line"><span style="color:#B392F0">IdrisAndroidActivity</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> JVM_Native</span><span style="color:#F97583"> $</span><span style="color:#B392F0"> Class</span><span style="color:#9ECBFF"> "hello/IdrisAndroidActivity"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">Bundle</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Type</span></span>
<span class="line"><span style="color:#B392F0">Bundle</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> JVM_Native</span><span style="color:#F97583"> $</span><span style="color:#B392F0"> Class</span><span style="color:#9ECBFF"> "android/os/Bundle"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">Context</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Type</span></span>
<span class="line"><span style="color:#B392F0">Context</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> JVM_Native</span><span style="color:#F97583"> $</span><span style="color:#B392F0"> Class</span><span style="color:#9ECBFF"> "android/content/Context"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">View</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Type</span></span>
<span class="line"><span style="color:#B392F0">View</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> JVM_Native</span><span style="color:#F97583"> $</span><span style="color:#B392F0"> Class</span><span style="color:#9ECBFF"> "android/view/View"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">TextView</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Type</span></span>
<span class="line"><span style="color:#B392F0">TextView</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> JVM_Native</span><span style="color:#F97583"> $</span><span style="color:#B392F0"> Class</span><span style="color:#9ECBFF"> "android/widget/TextView"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">Inherits</span><span style="color:#B392F0"> View</span><span style="color:#B392F0"> TextView</span><span style="color:#F97583"> where</span><span style="color:#E1E4E8"> {}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">CharSequence</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> Type</span></span>
<span class="line"><span style="color:#B392F0">CharSequence</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> JVM_Native</span><span style="color:#F97583"> $</span><span style="color:#B392F0"> Class</span><span style="color:#9ECBFF"> "java/lang/CharSequence"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">Inherits</span><span style="color:#B392F0"> CharSequence</span><span style="color:#79B8FF"> String</span><span style="color:#F97583"> where</span><span style="color:#E1E4E8"> {}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">superOnCreate</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> IdrisAndroidActivity</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> Bundle</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">superOnCreate </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> invokeInstance </span><span style="color:#9ECBFF">"superOnCreate"</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">IdrisAndroidActivity</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> Bundle</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">getApplicationContext</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> IdrisAndroidActivity</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#B392F0"> Context</span></span>
<span class="line"><span style="color:#E1E4E8">getApplicationContext </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> invokeInstance </span><span style="color:#9ECBFF">"getApplicationContext"</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">IdrisAndroidActivity</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#B392F0"> Context</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">newTextView</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Context</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#B392F0"> TextView</span></span>
<span class="line"><span style="color:#E1E4E8">newTextView </span><span style="color:#F97583">=</span><span style="color:#B392F0"> FFI</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">new (</span><span style="color:#B392F0">Context</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#B392F0"> TextView</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">setText</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Inherits</span><span style="color:#B392F0"> CharSequence</span><span style="color:#E1E4E8"> charSequence </span><span style="color:#F97583">=></span><span style="color:#B392F0"> TextView</span><span style="color:#F97583"> -></span><span style="color:#E1E4E8"> charSequence </span><span style="color:#F97583">-></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">setText this text </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> invokeInstance </span><span style="color:#9ECBFF">"setText"</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">TextView</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> CharSequence</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span><span style="color:#E1E4E8">) this (believe_me text)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">setContentView</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> Inherits</span><span style="color:#B392F0"> View</span><span style="color:#E1E4E8"> view </span><span style="color:#F97583">=></span><span style="color:#B392F0"> IdrisAndroidActivity</span><span style="color:#F97583"> -></span><span style="color:#E1E4E8"> view </span><span style="color:#F97583">-></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">setContentView this view </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> invokeInstance </span><span style="color:#9ECBFF">"setContentView"</span><span style="color:#E1E4E8"> (</span><span style="color:#B392F0">IdrisAndroidActivity</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> View</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span><span style="color:#E1E4E8">) this (believe_me view)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">onCreate</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> IdrisAndroidActivity</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> Bundle</span><span style="color:#F97583"> -></span><span style="color:#B392F0"> JVM_IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">onCreate this bundle </span><span style="color:#F97583">=</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">  superOnCreate this bundle</span></span>
<span class="line"><span style="color:#E1E4E8">  context </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> getApplicationContext this</span></span>
<span class="line"><span style="color:#E1E4E8">  textView </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> newTextView context</span></span>
<span class="line"><span style="color:#E1E4E8">  setText textView </span><span style="color:#F97583">$</span><span style="color:#9ECBFF"> "Hello Android from Idris! pythag 50 is "</span><span style="color:#F97583"> ++</span><span style="color:#E1E4E8"> show (pythag </span><span style="color:#79B8FF">50</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">  setContentView this textView</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">main</span><span style="color:#F97583"> :</span><span style="color:#B392F0"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> pure </span><span style="color:#79B8FF">()</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">androidExport</span><span style="color:#F97583">:</span><span style="color:#B392F0"> FFI_Export</span><span style="color:#B392F0"> FFI_JVM</span><span style="color:#9ECBFF"> "hello/IdrisAndroidActivity extends android/support/v7/app/AppCompatActivity"</span><span style="color:#E1E4E8"> []</span></span>
<span class="line"><span style="color:#E1E4E8">androidExport </span><span style="color:#F97583">=</span></span>
<span class="line"><span style="color:#B392F0">  Fun</span><span style="color:#E1E4E8"> superOnCreate (</span><span style="color:#B392F0">Super</span><span style="color:#9ECBFF"> "onCreate"</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">$</span></span>
<span class="line"><span style="color:#B392F0">  Fun</span><span style="color:#E1E4E8"> onCreate (</span><span style="color:#B392F0">ExportInstance</span><span style="color:#9ECBFF"> "onCreate"</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">$</span></span>
<span class="line"><span style="color:#B392F0">  End</span></span>
<span class="line"></span></code></pre>
<p>The above program demonstrates calling Java instance methods (<code>setText</code> for example) and constructors (<code>newTextView</code>).</p>
<p>It further demonstrates how to handle inheritance relationship when passing subclass instances to a parent class type.
For example, function <code>setContentView</code> takes a <code>View</code> but we can pass a <code>TextView</code> as it is a subclass of <code>View</code> and we
mention that to Idris via <code>Inherits View TextView where {}</code>.</p>
<p>It also demonstrates how we can create a Java class that extends another class and override methods with Idris functions.
The last section <code>androidExport</code> creates a Java class named <code>hello/IdrisAndroidActivity</code> that extends <code>android/support/v7/app/AppCompatActivity</code>.
The Java class also creates a wrapper method <code>superOnCreate</code> that just delegates to <code>super.OnCreate</code> and the class also overrides <code>onCreate</code> method
with Idris’ <code>onCreate</code> function. The Java class can also implement one or more Java interfaces with something like,</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">hello/IdrisAndroidActivity</span><span style="color:#9ECBFF"> extends</span><span style="color:#9ECBFF"> android/support/v7/app/AppCompatActivity</span><span style="color:#9ECBFF"> implements</span><span style="color:#9ECBFF"> java/lang/Runnable,</span><span style="color:#9ECBFF"> java/lang/Comparable</span></span></code></pre>
<p>A module can have multiple exports so we can actually create multiple Java classes with Idris implementation functions from an Idris module.</p>
<p>We can compile this as usual,</p>
<p><code>idris --portable-codegen jvm -p idrisjvmffi idrisandroid.idr -o target</code></p>
<p>It would produce the following class files:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="plaintext"><code><span class="line"><span>$ tree target/</span></span>
<span class="line"><span>target/</span></span>
<span class="line"><span>├── Decidable</span></span>
<span class="line"><span>│   └── Equality.class</span></span>
<span class="line"><span>├── hello</span></span>
<span class="line"><span>│   └── IdrisAndroidActivity.class</span></span>
<span class="line"><span>├── main</span></span>
<span class="line"><span>│   ├── Main.class</span></span>
<span class="line"><span>│   └── Prelude.class</span></span>
<span class="line"><span>└── Prelude</span></span>
<span class="line"><span>    ├── Algebra.class</span></span>
<span class="line"><span>    ├── Applicative.class</span></span>
<span class="line"><span>    ├── Bool.class</span></span>
<span class="line"><span>    ├── Foldable.class</span></span>
<span class="line"><span>    ├── Interfaces.class</span></span>
<span class="line"><span>    ├── List.class</span></span>
<span class="line"><span>    ├── Monad.class</span></span>
<span class="line"><span>    ├── Show.class</span></span>
<span class="line"><span>    └── Strings.class</span></span>
<span class="line"><span></span></span></code></pre>
<h5 id="deploying-to-android">Deploying to Android:</h5>
<ol>
<li>Create an android project using Android studio with <a href="https://developer.android.com/guide/platform/j8-jack.html#configuration">Jack support for Java 8</a>.</li>
<li>Then package the classes compiled above along with idris-jvm-runtime-1.0-SNAPSHOT.jar classes in a single jar and copy into an
android project’s <code>app/libs</code> directory.</li>
<li>Change the activity class name in android manifest file to the Idris exported class name <code>hello.IdrisAndroidActivity</code>.</li>
<li>Then run <code>./gradlew installDebug</code> from android project after starting an emulator or connected to an android device.</li>
<li>Finally we should see our Idris code running on Android! It should look something like this:
<img src="https://mmhelloworld.github.io/images/idris-android.png" alt="Idris Android"></li>
</ol>
<p>Happy coding!</p>]]></content:encoded>
            <author>Marimuthu Madasamy</author>
            <category>Idris</category>
            <category>JVM</category>
            <category>Java</category>
            <category>Android</category>
        </item>
        <item>
            <title><![CDATA[Haskell on the JVM via GHCJS and Nashorn]]></title>
            <link>https://mmhelloworld.github.io/post/haskell-on-the-jvm-via-ghcjs-and-nashorn</link>
            <guid isPermaLink="false">https://mmhelloworld.github.io/post/haskell-on-the-jvm-via-ghcjs-and-nashorn</guid>
            <pubDate>Sat, 27 Feb 2016 00:00:00 GMT</pubDate>
            <description><![CDATA[Currently there are 2 ways we can write Haskell on the JVM:]]></description>
            <content:encoded><![CDATA[<p>Currently there are 2 ways we can write Haskell on the JVM:</p>
<ol>
<li><a href="https://github.com/Frege/frege">Frege</a>, a language that follows Haskell 2010 standard and compiles to Java.</li>
<li>Haskell itself by compiling it to JavaScript via GHCJS.</li>
</ol>
<p>Frege is basically a Haskell for the JVM and infact conforms to Haskell 2010 with few inbuilt GHC extensions. Even with good Java interop, it doesn’t sacrifice its type guarantees and currently is the only pure language on the JVM.</p>
<p>In this post, I am going to explore another interesting option: Haskell itself on the JVM. Haskell can be compiled to JavaScript using GHCJS and Java has an inbuilt JavaScript engine, called Nashorn so it is actually possible to compile Haskell to JavaScript and run the resulting JavaScript on the JVM.</p>
<p>Here is a simple Haskell code that can be run on the JVM:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#F97583">module</span><span style="color:#B392F0"> Main</span><span style="color:#F97583"> where</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- Nashorn doesn't provide default console object. Haskell's putStrLn logs to the console.</span></span>
<span class="line"><span style="color:#F97583">foreign</span><span style="color:#F97583"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#B392F0"> unsafe</span><span style="color:#E1E4E8"> "</span><span style="color:#B392F0">console</span><span style="color:#E1E4E8">={ \</span></span>
<span class="line"><span style="color:#E1E4E8">    \ </span><span style="color:#B392F0">log</span><span style="color:#E1E4E8">: </span><span style="color:#B392F0">function</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) { </span><span style="color:#B392F0">java</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">lang</span><span style="color:#E1E4E8">.System.</span><span style="color:#B392F0">out</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">print</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">); },\</span></span>
<span class="line"><span style="color:#E1E4E8">    \ </span><span style="color:#B392F0">info</span><span style="color:#E1E4E8">: </span><span style="color:#B392F0">function</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) { </span><span style="color:#B392F0">java</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">lang</span><span style="color:#E1E4E8">.System.</span><span style="color:#B392F0">out</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">print</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">); },\</span></span>
<span class="line"><span style="color:#E1E4E8">    \ </span><span style="color:#B392F0">warn</span><span style="color:#E1E4E8">: </span><span style="color:#B392F0">function</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) { </span><span style="color:#B392F0">java</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">lang</span><span style="color:#E1E4E8">.System.</span><span style="color:#B392F0">out</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">print</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">); },\</span></span>
<span class="line"><span style="color:#E1E4E8">    \ </span><span style="color:#B392F0">debug</span><span style="color:#E1E4E8">: </span><span style="color:#B392F0">function</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) { </span><span style="color:#B392F0">java</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">lang</span><span style="color:#E1E4E8">.System.</span><span style="color:#B392F0">out</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">print</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">); },\</span></span>
<span class="line"><span style="color:#E1E4E8">    \ </span><span style="color:#B392F0">error</span><span style="color:#E1E4E8">: </span><span style="color:#B392F0">function</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) { </span><span style="color:#B392F0">java</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">lang</span><span style="color:#E1E4E8">.System.</span><span style="color:#B392F0">err</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">print</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">); }\</span></span>
<span class="line"><span style="color:#E1E4E8">    \ }"</span></span>
<span class="line"><span style="color:#B392F0">  setupConsole</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">foreign</span><span style="color:#F97583"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "java.lang.System.exit($1)"</span></span>
<span class="line"><span style="color:#B392F0">  sysexit</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> Int</span><span style="color:#F97583"> -></span><span style="color:#F97583"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">  setupConsole</span></span>
<span class="line"><span style="color:#E1E4E8">  putStrLn </span><span style="color:#9ECBFF">"Hello from Haskell!"</span></span>
<span class="line"><span style="color:#E1E4E8">  sysexit </span><span style="color:#79B8FF">0</span></span>
<span class="line"></span></code></pre>
<p>Nashorn doesn’t have an inbuilt <code>console</code> object and Haskell’s <code>putStrLn</code> prints to the console so we have to provide an implementation of console. The implementation, as can be seen from the code above, is actually backed by Java’s <code>System.out.print</code>. That is our first example of calling Java from Haskell. <code>sysexit</code> is another function calling Java. <code>sysexit</code> is needed here as otherwise the program just keeps on running which I think is because of JavaScript event loop or something similar that prevents the JVM from shutting down.</p>
<h3 id="compiling-haskell-with-ghcjs-and-running-on-jvm">Compiling Haskell with GHCJS and running on JVM</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="plaintext"><code><span class="line"><span>$ ghcjs -o HelloJava HelloJava.hs</span></span>
<span class="line"><span>[1 of 1] Compiling Main             ( HelloJava.hs, HelloJava.js_o )</span></span>
<span class="line"><span>Linking HelloJava.jsexe (Main)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>$ jjs HelloJava.jsexe/all.js </span></span>
<span class="line"><span>Hello from Haskell!</span></span></code></pre>
<p><code>jjs</code> is a JVM laucher for JavaScript code similar to Node. It is also possible to run this as a regular Java program along with other Java classes without <code>jjs</code>. <code>jjs</code> is just a convenient way  to run just JavaScript code on the JVM. Above GHCJS compiles the Haskell code to JavaScript in one file <code>all.js</code> and the JVM runs the JavaScript code from <code>all.js</code>.</p>
<h3 id="example-2">Example 2</h3>
<p>Now let’s look at another example that shows how to convert between Haskell and Java lists:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">{-# </span><span style="color:#F97583">LANGUAGE</span><span style="color:#F97583"> ForeignFunctionInterface</span><span style="color:#E1E4E8"> #-}</span></span>
<span class="line"><span style="color:#E1E4E8">{-# </span><span style="color:#F97583">LANGUAGE</span><span style="color:#F97583"> JavaScriptFFI</span><span style="color:#E1E4E8"> #-}</span></span>
<span class="line"><span style="color:#E1E4E8">{-# </span><span style="color:#F97583">LANGUAGE</span><span style="color:#F97583"> UnliftedFFITypes</span><span style="color:#E1E4E8"> #-}</span></span>
<span class="line"><span style="color:#E1E4E8">{-# </span><span style="color:#F97583">LANGUAGE</span><span style="color:#F97583"> GHCForeignImportPrim</span><span style="color:#E1E4E8"> #-}</span></span>
<span class="line"><span style="color:#E1E4E8">{-# </span><span style="color:#F97583">LANGUAGE</span><span style="color:#F97583"> TypeSynonymInstances</span><span style="color:#E1E4E8"> #-}</span></span>
<span class="line"><span style="color:#E1E4E8">{-# </span><span style="color:#F97583">LANGUAGE</span><span style="color:#F97583"> FlexibleInstances</span><span style="color:#E1E4E8"> #-}</span></span>
<span class="line"><span style="color:#E1E4E8">{-# </span><span style="color:#F97583">LANGUAGE</span><span style="color:#F97583"> DataKinds</span><span style="color:#E1E4E8"> #-}</span></span>
<span class="line"><span style="color:#E1E4E8">{-# </span><span style="color:#F97583">LANGUAGE</span><span style="color:#F97583"> PolyKinds</span><span style="color:#E1E4E8"> #-}</span></span>
<span class="line"><span style="color:#E1E4E8">{-# </span><span style="color:#F97583">LANGUAGE</span><span style="color:#F97583"> DeriveDataTypeable</span><span style="color:#E1E4E8"> #-}</span></span>
<span class="line"><span style="color:#E1E4E8">{-# </span><span style="color:#F97583">LANGUAGE</span><span style="color:#F97583"> TypeFamilies</span><span style="color:#E1E4E8"> #-}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">module</span><span style="color:#B392F0"> Main</span><span style="color:#F97583"> where</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#B392F0"> Control.Monad.ST</span></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#B392F0"> GHCJS.Types</span></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#B392F0"> GHCJS.Foreign</span></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#B392F0"> GHCJS.Prim</span></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#B392F0"> Data.Typeable</span></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#B392F0"> GHC.ST</span><span style="color:#E1E4E8"> </span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">data</span><span style="color:#F97583"> MutabilityType</span><span style="color:#E1E4E8"> s </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> Mutable</span></span>
<span class="line"><span style="color:#F97583">                      |</span><span style="color:#79B8FF"> Immutable</span></span>
<span class="line"><span style="color:#F97583">                      |</span><span style="color:#79B8FF"> STMutable</span><span style="color:#E1E4E8"> s</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">data</span><span style="color:#F97583"> IsItMutable</span><span style="color:#F97583"> =</span><span style="color:#79B8FF"> IsImmutable</span></span>
<span class="line"><span style="color:#F97583">                 |</span><span style="color:#79B8FF"> IsMutable</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- Copied from GHCJS.Internal.Types. Not sure why this is not exposed.</span></span>
<span class="line"><span style="color:#F97583">type</span><span style="color:#F97583"> family</span><span style="color:#F97583"> Mutability</span><span style="color:#E1E4E8"> (a </span><span style="color:#F97583">::</span><span style="color:#F97583"> MutabilityType</span><span style="color:#E1E4E8"> s) </span><span style="color:#F97583">::</span><span style="color:#F97583"> IsItMutable</span><span style="color:#F97583"> where</span></span>
<span class="line"><span style="color:#F97583">  Mutability</span><span style="color:#F97583"> Immutable</span><span style="color:#F97583">     =</span><span style="color:#F97583"> IsImmutable</span></span>
<span class="line"><span style="color:#F97583">  Mutability</span><span style="color:#F97583"> Mutable</span><span style="color:#F97583">       =</span><span style="color:#F97583"> IsMutable</span></span>
<span class="line"><span style="color:#F97583">  Mutability</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">STMutable</span><span style="color:#E1E4E8"> s) </span><span style="color:#F97583">=</span><span style="color:#F97583"> IsMutable</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">{- java.util.ArrayList class and its methods -}</span></span>
<span class="line"><span style="color:#F97583">newtype</span><span style="color:#F97583"> SomeArrayList</span><span style="color:#E1E4E8"> (a </span><span style="color:#F97583">::</span><span style="color:#F97583"> MutabilityType</span><span style="color:#E1E4E8"> s) </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> SomeArrayList</span><span style="color:#F97583"> JSVal</span><span style="color:#F97583"> deriving</span><span style="color:#F97583"> Typeable</span></span>
<span class="line"><span style="color:#F97583">type</span><span style="color:#F97583"> ArrayList</span><span style="color:#F97583">           =</span><span style="color:#F97583"> SomeArrayList</span><span style="color:#F97583"> Immutable</span></span>
<span class="line"><span style="color:#F97583">type</span><span style="color:#F97583"> MutableArrayList</span><span style="color:#F97583">    =</span><span style="color:#F97583"> SomeArrayList</span><span style="color:#F97583"> Mutable</span></span>
<span class="line"><span style="color:#F97583">type</span><span style="color:#F97583"> STArrayList</span><span style="color:#E1E4E8"> s      </span><span style="color:#F97583">=</span><span style="color:#F97583"> SomeArrayList</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">STMutable</span><span style="color:#E1E4E8"> s)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">instance</span><span style="color:#F97583"> IsJSVal</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">SomeArrayList</span><span style="color:#E1E4E8"> m)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- ArrayList Constructor</span></span>
<span class="line"><span style="color:#F97583">foreign</span><span style="color:#F97583"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "new $1()"</span></span>
<span class="line"><span style="color:#B392F0">  arrayList_new</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> JType</span><span style="color:#F97583"> -></span><span style="color:#F97583"> ST</span><span style="color:#B392F0"> s</span><span style="color:#E1E4E8"> (STArrayList </span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) </span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- Adds an element to ArrayList</span></span>
<span class="line"><span style="color:#B392F0">foreign</span><span style="color:#B392F0"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "$2.add($1)"</span></span>
<span class="line"><span style="color:#B392F0">  arrayList_add</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> JSVal</span><span style="color:#F97583"> -></span><span style="color:#F97583">  STArrayList</span><span style="color:#B392F0"> s</span><span style="color:#E1E4E8"> -> ST </span><span style="color:#B392F0">s</span><span style="color:#E1E4E8"> ()</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">{- java.util.Iterator class and its methods -}</span></span>
<span class="line"><span style="color:#B392F0">newtype</span><span style="color:#E1E4E8"> SomeIterator (</span><span style="color:#B392F0">a</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> MutabilityType</span><span style="color:#B392F0"> s</span><span style="color:#E1E4E8">) = SomeIterator JSVal </span><span style="color:#B392F0">deriving</span><span style="color:#E1E4E8"> Typeable</span></span>
<span class="line"><span style="color:#B392F0">type</span><span style="color:#E1E4E8"> Iterator            = SomeIterator Immutable</span></span>
<span class="line"><span style="color:#B392F0">type</span><span style="color:#E1E4E8"> MutableIterator     = SomeIterator Mutable</span></span>
<span class="line"><span style="color:#B392F0">type</span><span style="color:#E1E4E8"> STIterator </span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">        = SomeIterator (STMutable </span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">instance</span><span style="color:#E1E4E8"> IsJSVal (SomeIterator </span><span style="color:#B392F0">m</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- Create an Iterator from an ArrayList</span></span>
<span class="line"><span style="color:#B392F0">foreign</span><span style="color:#B392F0"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "$1.iterator()"</span></span>
<span class="line"><span style="color:#B392F0">  iterator</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> STArrayList</span><span style="color:#B392F0"> s</span><span style="color:#E1E4E8"> -> ST </span><span style="color:#B392F0">s</span><span style="color:#E1E4E8"> (STIterator </span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">foreign</span><span style="color:#B392F0"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "$1.hasNext()"</span></span>
<span class="line"><span style="color:#B392F0">  iterator_hasNext</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> STIterator</span><span style="color:#B392F0"> s</span><span style="color:#E1E4E8"> -> ST </span><span style="color:#B392F0">s</span><span style="color:#E1E4E8"> Bool</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">foreign</span><span style="color:#B392F0"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "$1.next()"</span></span>
<span class="line"><span style="color:#B392F0">  iterator_next</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> STIterator</span><span style="color:#B392F0"> s</span><span style="color:#E1E4E8"> -> ST </span><span style="color:#B392F0">s</span><span style="color:#E1E4E8"> JSVal</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">{- Other Nashorn imports -}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- Represents a Java type</span></span>
<span class="line"><span style="color:#B392F0">newtype</span><span style="color:#E1E4E8"> JType = JType JSVal</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">foreign</span><span style="color:#B392F0"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "java.lang.System.out.println($1)"</span></span>
<span class="line"><span style="color:#B392F0">  jprintln</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> JSVal</span><span style="color:#F97583"> -></span><span style="color:#F97583"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">foreign</span><span style="color:#F97583"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "java.lang.System.exit($1)"</span></span>
<span class="line"><span style="color:#B392F0">  sysexit</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> Int</span><span style="color:#F97583"> -></span><span style="color:#F97583"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- Imports a Java class</span></span>
<span class="line"><span style="color:#F97583">foreign</span><span style="color:#F97583"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "Java.type($1)"</span></span>
<span class="line"><span style="color:#B392F0">  jimport</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> JSVal</span><span style="color:#F97583"> -></span><span style="color:#F97583"> JType</span><span style="color:#E1E4E8"> </span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">{- Create an instance of Java's ArrayList from Haskell's list -}</span></span>
<span class="line"><span style="color:#B392F0">listToArrayList</span><span style="color:#F97583"> ::</span><span style="color:#E1E4E8"> [</span><span style="color:#F97583">JSVal</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">-></span><span style="color:#F97583"> ST</span><span style="color:#E1E4E8"> s (</span><span style="color:#F97583">STArrayList</span><span style="color:#E1E4E8"> s)</span></span>
<span class="line"><span style="color:#E1E4E8">listToArrayList xs </span><span style="color:#F97583">=</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#F97583">    let</span><span style="color:#E1E4E8"> arrayListClass </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> jimport </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> toJSString </span><span style="color:#9ECBFF">"java.util.ArrayList"</span></span>
<span class="line"><span style="color:#E1E4E8">    arrList </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> arrayList_new arrayListClass</span></span>
<span class="line"><span style="color:#E1E4E8">    go xs arrList</span></span>
<span class="line"><span style="color:#F97583">  where</span></span>
<span class="line"><span style="color:#E1E4E8">    go </span><span style="color:#79B8FF">[]</span><span style="color:#E1E4E8"> arrList </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> return arrList</span></span>
<span class="line"><span style="color:#E1E4E8">    go (x</span><span style="color:#F97583">:</span><span style="color:#E1E4E8">xs) arrList </span><span style="color:#F97583">=</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">      arrayList_add x arrList</span></span>
<span class="line"><span style="color:#E1E4E8">      go xs arrList</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">{- Create Haskell's list from Java's Iterator -}</span></span>
<span class="line"><span style="color:#B392F0">iteratorToList</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> STIterator</span><span style="color:#E1E4E8"> s </span><span style="color:#F97583">-></span><span style="color:#F97583"> ST</span><span style="color:#E1E4E8"> s [</span><span style="color:#F97583">JSVal</span><span style="color:#E1E4E8">]</span></span>
<span class="line"><span style="color:#E1E4E8">iteratorToList itr </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> reverse </span><span style="color:#F97583">&#x3C;$></span><span style="color:#E1E4E8"> go </span><span style="color:#79B8FF">[]</span><span style="color:#F97583"> where</span></span>
<span class="line"><span style="color:#E1E4E8">  go acc </span><span style="color:#F97583">=</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">    hasNext </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> iterator_hasNext itr</span></span>
<span class="line"><span style="color:#F97583">    if</span><span style="color:#E1E4E8"> hasNext</span></span>
<span class="line"><span style="color:#F97583">      then</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">        next </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> iterator_next itr</span></span>
<span class="line"><span style="color:#E1E4E8">        go (next</span><span style="color:#F97583">:</span><span style="color:#E1E4E8"> acc)</span></span>
<span class="line"><span style="color:#F97583">      else</span></span>
<span class="line"><span style="color:#E1E4E8">        return acc</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">-- Nashorn doesn't provide default console object. Haskell's putStrLn logs to the console.</span></span>
<span class="line"><span style="color:#F97583">foreign</span><span style="color:#F97583"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#B392F0"> unsafe</span><span style="color:#E1E4E8"> "</span><span style="color:#B392F0">console</span><span style="color:#E1E4E8">={ \</span></span>
<span class="line"><span style="color:#E1E4E8">    \ </span><span style="color:#B392F0">log</span><span style="color:#E1E4E8">: </span><span style="color:#B392F0">function</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) { </span><span style="color:#B392F0">java</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">lang</span><span style="color:#E1E4E8">.System.</span><span style="color:#B392F0">out</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">print</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">); },\</span></span>
<span class="line"><span style="color:#E1E4E8">    \ </span><span style="color:#B392F0">info</span><span style="color:#E1E4E8">: </span><span style="color:#B392F0">function</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) { </span><span style="color:#B392F0">java</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">lang</span><span style="color:#E1E4E8">.System.</span><span style="color:#B392F0">out</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">print</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">); },\</span></span>
<span class="line"><span style="color:#E1E4E8">    \ </span><span style="color:#B392F0">warn</span><span style="color:#E1E4E8">: </span><span style="color:#B392F0">function</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) { </span><span style="color:#B392F0">java</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">lang</span><span style="color:#E1E4E8">.System.</span><span style="color:#B392F0">out</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">print</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">); },\</span></span>
<span class="line"><span style="color:#E1E4E8">    \ </span><span style="color:#B392F0">debug</span><span style="color:#E1E4E8">: </span><span style="color:#B392F0">function</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) { </span><span style="color:#B392F0">java</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">lang</span><span style="color:#E1E4E8">.System.</span><span style="color:#B392F0">out</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">print</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">); },\</span></span>
<span class="line"><span style="color:#E1E4E8">    \ </span><span style="color:#B392F0">error</span><span style="color:#E1E4E8">: </span><span style="color:#B392F0">function</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">) { </span><span style="color:#B392F0">java</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">lang</span><span style="color:#E1E4E8">.System.</span><span style="color:#B392F0">err</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">print</span><span style="color:#E1E4E8">(</span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">); }\</span></span>
<span class="line"><span style="color:#E1E4E8">    \ }"</span></span>
<span class="line"><span style="color:#B392F0">  setupConsole</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> IO</span><span style="color:#79B8FF"> ()</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">demo </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> runST </span><span style="color:#F97583">$</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">  jlist </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> listToArrayList </span><span style="color:#F97583">.</span><span style="color:#E1E4E8"> map toJSInt </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> [</span><span style="color:#79B8FF">1</span><span style="color:#F97583">..</span><span style="color:#79B8FF">5</span><span style="color:#E1E4E8">]</span></span>
<span class="line"><span style="color:#E1E4E8">  iterator jlist </span><span style="color:#F97583">>>=</span><span style="color:#E1E4E8"> iteratorToList</span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#E1E4E8">main </span><span style="color:#F97583">=</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">  setupConsole</span></span>
<span class="line"><span style="color:#E1E4E8">  mapM_ (putStrLn </span><span style="color:#F97583">.</span><span style="color:#E1E4E8"> show </span><span style="color:#F97583">.</span><span style="color:#E1E4E8"> fromJSInt) demo</span></span>
<span class="line"><span style="color:#E1E4E8">  sysexit </span><span style="color:#79B8FF">0</span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span></code></pre>
<p>In the code above, two Java types are used: <code>java.util.ArrayList</code> and <code>java.util.Iterator</code>.</p>
<h4 id="importing-a-java-class">Importing a Java class</h4>
<p>A Java class can be imported with <code>Java.type(className)</code> Nashorn JavaScript code. Line 80 defines the corresponding Haskell FFI function:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#6A737D">-- Imports a Java class</span></span>
<span class="line"><span style="color:#F97583">foreign</span><span style="color:#F97583"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "Java.type($1)"</span></span>
<span class="line"><span style="color:#B392F0">  jimport</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> JSVal</span><span style="color:#F97583"> -></span><span style="color:#F97583"> JType</span></span></code></pre>
<h4 id="creating-an-instance-of-a-java-class">Creating an instance of a Java class</h4>
<p>An instance can be created by invoking the constructor on the Java class with <code>new</code>. Here is the corresponding FFI:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#6A737D">-- ArrayList Constructor</span></span>
<span class="line"><span style="color:#F97583">foreign</span><span style="color:#F97583"> import</span><span style="color:#B392F0"> javascript</span><span style="color:#F97583"> unsafe</span><span style="color:#9ECBFF"> "new $1()"</span></span>
<span class="line"><span style="color:#B392F0">  arrayList_new</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> JType</span><span style="color:#F97583"> -></span><span style="color:#F97583"> ST</span><span style="color:#B392F0"> s</span><span style="color:#E1E4E8"> (STArrayList </span><span style="color:#B392F0">s</span><span style="color:#E1E4E8">)</span></span></code></pre>
<p>It takes the <code>ArrayList</code> class and invokes the dafault <code>ArrayList</code> constructor to return an instance of it. In the same way, we can create FFI functions for <code>ArrayList.add</code> and <code>ArrayList.iterator</code> to return an Java <code>Iterator</code> instance.</p>
<p>The function <code>listToArrayList</code> takes a Haskell list and return an instance of Java <code>ArrayList</code>. As the java list is mutable, it is returned as <code>STArrayList s</code> inside <code>ST</code>. This function first creates an instance of <code>ArrayList</code> by invoking the Java constructor and then calls <code>ArrayList.add</code> to add items from Haskell list to the <code>ArrayList</code>.</p>
<p>In the similar way, the function <code>iteratorToList</code> takes a Java <code>iterator</code> and returns Haskell list by extracting items from the iterator by invoking corresponding FFI functions for <code>Iterator.hasNext</code> and <code>Iterator.next</code>.</p>
<h3 id="building-with-stack">Building with <code>Stack</code></h3>
<p>It is easy to <a href="http://docs.haskellstack.org/en/stable/ghcjs/">setup a GHCJS project with <code>Stack</code></a> so that we can add other dependencies easily and build it for GHCJS. With the above code in a stack project “haskell-jvm-hello”, we can build it with <code>stack build</code> and run it with <code>jjs</code>:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="plaintext"><code><span class="line"><span>$ stack build</span></span>
<span class="line"><span>haskell-jvm-hello-0.1.0.0: unregistering (local file changes: app/Main.hs)</span></span>
<span class="line"><span>haskell-jvm-hello-0.1.0.0: build</span></span>
<span class="line"><span>Preprocessing library haskell-jvm-hello-0.1.0.0...</span></span>
<span class="line"><span>In-place registering haskell-jvm-hello-0.1.0.0...</span></span>
<span class="line"><span>Preprocessing executable 'haskell-jvm-hello-exe' for</span></span>
<span class="line"><span>haskell-jvm-hello-0.1.0.0...</span></span>
<span class="line"><span>[1 of 1] Compiling Main             ( app/Main.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.4.0_ghcjs/build/haskell-jvm-hello-exe/haskell-jvm-hello-exe-tmp/Main.js_o )</span></span>
<span class="line"><span>Linking .stack-work/dist/x86_64-linux/Cabal-1.22.4.0_ghcjs/build/haskell-jvm-hello-exe/haskell-jvm-hello-exe.jsexe (Main)</span></span>
<span class="line"><span>haskell-jvm-hello-0.1.0.0: copy/register</span></span>
<span class="line"><span>Installing library in</span></span>
<span class="line"><span>/workspace/haskell-jvm-hello/.stack-work/install/x86_64-linux/lts-3.12/ghcjs-0.2.0_ghc-7.10.3/lib/x86_64-linux-ghcjs-0.2.0-ghc7_10_3/haskell-jvm-hello-0.1.0.0-7MA0h74rERuEwiJY2TRuHx</span></span>
<span class="line"><span>Installing executable(s) in</span></span>
<span class="line"><span>/workspace/haskell-jvm-hello/.stack-work/install/x86_64-linux/lts-3.12/ghcjs-0.2.0_ghc-7.10.3/bin</span></span>
<span class="line"><span>Warning: the following files would be used as linker inputs, but linking is not being done: .stack-work/dist/x86_64-linux/Cabal-1.22.4.0_ghcjs/build/haskell-jvm-hello-exe/haskell-jvm-hello-exe</span></span>
<span class="line"><span>Registering haskell-jvm-hello-0.1.0.0...</span></span>
<span class="line"><span></span></span>
<span class="line"><span>$ jjs .stack-work/dist/x86_64-linux/Cabal-1.22.4.0_ghcjs/build/haskell-jvm-hello-exe/haskell-jvm-hello-exe.jsexe/all.js</span></span>
<span class="line"><span>1</span></span>
<span class="line"><span>2</span></span>
<span class="line"><span>3</span></span>
<span class="line"><span>4</span></span>
<span class="line"><span>5</span></span></code></pre>
<p>Java’s Nashorn JavaScript engine opens up few more ways for the JVM to be polyglot and it is so good to have one of the best languages, Haskell, on the JVM. Actually it should also be possible to run PureScript as well in this way on the JVM but that is for another day. Happy Haskelling!</p>]]></content:encoded>
            <author>Marimuthu Madasamy</author>
            <category>Haskell</category>
            <category>JVM</category>
            <category>Nashorn</category>
            <category>GHCJS</category>
        </item>
        <item>
            <title><![CDATA[Frege: Record accessors and mutators]]></title>
            <link>https://mmhelloworld.github.io/post/frege-record-accessors-and-mutators</link>
            <guid isPermaLink="false">https://mmhelloworld.github.io/post/frege-record-accessors-and-mutators</guid>
            <pubDate>Sat, 15 Mar 2014 00:00:00 GMT</pubDate>
            <description><![CDATA[Frege has built-in mechanism to access and mutate (non-destructive) record fields.]]></description>
            <content:encoded><![CDATA[<p>Frege has built-in mechanism to access and mutate (non-destructive) record fields.</p>
<p>Consider the following type in Frege:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> data </span><span style="color:#79B8FF">Point</span><span style="color:#F97583"> =</span><span style="color:#79B8FF"> Point</span><span style="color:#E1E4E8"> {x </span><span style="color:#F97583">::</span><span style="color:#F97583"> Int</span><span style="color:#E1E4E8">, y </span><span style="color:#F97583">::</span><span style="color:#F97583"> Int</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#F97583">data</span><span style="color:#E1E4E8"> type </span><span style="color:#F97583">Point</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> *</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> derive </span><span style="color:#79B8FF">Show</span><span style="color:#79B8FF"> Point</span></span>
<span class="line"><span style="color:#F97583">instance</span><span style="color:#F97583"> Show</span><span style="color:#F97583">  Point</span></span></code></pre>
<p>Now we can use the following functions to get and set record fields:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#B392F0"> Point.</span><span style="color:#E1E4E8">x</span></span>
<span class="line"><span style="color:#F97583">::</span><span style="color:#F97583"> Point</span><span style="color:#F97583"> -></span><span style="color:#F97583"> Int</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#F97583"> Point.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> }</span></span>
<span class="line"><span style="color:#F97583">::</span><span style="color:#F97583"> Point</span><span style="color:#F97583"> -></span><span style="color:#F97583"> Int</span><span style="color:#F97583"> -></span><span style="color:#F97583"> Point</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#F97583"> Point.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> }</span></span>
<span class="line"><span style="color:#F97583">::</span><span style="color:#F97583"> Point</span><span style="color:#F97583"> -></span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">Int->Int</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">-></span><span style="color:#F97583"> Point</span></span></code></pre>
<p>For Field <code>x</code>,</p>
<ol>
<li>The function <code>Point.x</code> is the getter.</li>
<li>The function <code>Point.{x = }</code> is a setter which sets the field <code>x</code> with a new value.</li>
<li>The function <code>Point.{x &#x3C;- }</code> is also a setter but applies a function to update the current value.</li>
</ol>
<p>We can use the functions like this:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> p </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> Point</span><span style="color:#79B8FF"> 3</span><span style="color:#79B8FF"> 4</span></span>
<span class="line"><span style="color:#E1E4E8">value p </span><span style="color:#F97583">::</span><span style="color:#F97583"> Point</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> p</span></span>
<span class="line"><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 3</span><span style="color:#79B8FF"> 4</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#B392F0"> Point.</span><span style="color:#E1E4E8">x p</span></span>
<span class="line"><span style="color:#79B8FF">3</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#B392F0"> Point.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">=</span><span style="color:#E1E4E8">} p </span><span style="color:#79B8FF">13</span></span>
<span class="line"><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 13</span><span style="color:#79B8FF"> 4</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#B392F0"> Point.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8">} p (</span><span style="color:#F97583">+</span><span style="color:#79B8FF">15</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 18</span><span style="color:#79B8FF"> 4</span></span></code></pre>
<p>Frege also provides some shortcuts to apply these functions:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> p</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">x </span><span style="color:#6A737D">-- Same as `Point.x p`</span></span>
<span class="line"><span style="color:#79B8FF">3</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> p</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 10</span><span style="color:#E1E4E8">} </span><span style="color:#6A737D">-- Same as `Point.{x = } p 10`</span></span>
<span class="line"><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 10</span><span style="color:#79B8FF"> 4</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> p</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8">} </span><span style="color:#6A737D">-- Same as `Point.{x &#x3C;-} p`</span></span>
<span class="line"><span style="color:#E1E4E8">:: (Int</span><span style="color:#F97583">-></span><span style="color:#79B8FF">Int</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">-></span><span style="color:#79B8FF"> Point</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> p</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">+</span><span style="color:#79B8FF">10</span><span style="color:#E1E4E8">)} </span><span style="color:#6A737D">-- Same as `Point.{x &#x3C;- } p (+10)`</span></span>
<span class="line"><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 13</span><span style="color:#79B8FF"> 4</span></span></code></pre>
<p>Multiple updates can be combined:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> p</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">+</span><span style="color:#79B8FF">8</span><span style="color:#E1E4E8">), y </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 20</span><span style="color:#E1E4E8">} </span><span style="color:#6A737D">-- Increment x by 8 and set y to 20</span></span>
<span class="line"><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 11</span><span style="color:#79B8FF"> 20</span></span></code></pre>
<p>Accessors and updates can be at any level deep.
Let’s create another type:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#F97583"> :</span><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#E1E4E8">> data </span><span style="color:#79B8FF">Circle</span><span style="color:#F97583"> =</span><span style="color:#79B8FF"> Circle</span><span style="color:#E1E4E8"> {center </span><span style="color:#F97583">::</span><span style="color:#F97583"> Point</span><span style="color:#E1E4E8">, radius </span><span style="color:#F97583">::</span><span style="color:#F97583"> Int</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#F97583">></span></span>
<span class="line"><span style="color:#F97583">></span><span style="color:#E1E4E8"> derive </span><span style="color:#79B8FF">Show</span><span style="color:#79B8FF"> Circle</span></span>
<span class="line"><span style="color:#F97583">></span><span style="color:#F97583"> :</span><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">data</span><span style="color:#E1E4E8"> type </span><span style="color:#F97583">Circle</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> *</span></span>
<span class="line"><span style="color:#F97583">instance</span><span style="color:#F97583"> Show</span><span style="color:#F97583">  Circle</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span></span></code></pre>
<p>Here we have an aggregate type <code>Circle</code> which composes another type <code>Point</code> for it’s field <code>center</code>.
Now we can update and select fields at different levels:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> c </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> Circle</span><span style="color:#E1E4E8"> {center </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> Point</span><span style="color:#79B8FF"> 4</span><span style="color:#79B8FF"> 5</span><span style="color:#E1E4E8">, radius </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 10</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#E1E4E8">value c </span><span style="color:#F97583">::</span><span style="color:#F97583"> Circle</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> c</span></span>
<span class="line"><span style="color:#79B8FF">Circle</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 4</span><span style="color:#79B8FF"> 5</span><span style="color:#E1E4E8">) </span><span style="color:#79B8FF">10</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> c</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">center</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">x</span></span>
<span class="line"><span style="color:#79B8FF">4</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> c</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">{center </span><span style="color:#F97583">&#x3C;-</span><span style="color:#B392F0"> Point.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 8</span><span style="color:#E1E4E8">}}</span></span>
<span class="line"><span style="color:#79B8FF">Circle</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 8</span><span style="color:#79B8FF"> 5</span><span style="color:#E1E4E8">) </span><span style="color:#79B8FF">10</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> c</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">{center </span><span style="color:#F97583">&#x3C;-</span><span style="color:#B392F0"> Point.</span><span style="color:#E1E4E8">{y </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">+</span><span style="color:#79B8FF">20</span><span style="color:#E1E4E8">)}, radius </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">*</span><span style="color:#79B8FF">5</span><span style="color:#E1E4E8">)}</span></span>
<span class="line"><span style="color:#79B8FF">Circle</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 4</span><span style="color:#79B8FF"> 25</span><span style="color:#E1E4E8">) </span><span style="color:#79B8FF">50</span></span></code></pre>
<p>In the latest version, Frege provides syntactic sugar for lambdas using underscores. For example, <code>T.foo</code> can be written
as <code>_.foo</code> if the type can be deduced from the context the lambda is applied. Hence the following two are equivalent.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> c</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">{center </span><span style="color:#F97583">&#x3C;-</span><span style="color:#B392F0"> Point.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 25</span><span style="color:#E1E4E8">}}</span></span>
<span class="line"><span style="color:#79B8FF">Circle</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 25</span><span style="color:#79B8FF"> 5</span><span style="color:#E1E4E8">) </span><span style="color:#79B8FF">10</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> c</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">{center </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> _</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">{x </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 25</span><span style="color:#E1E4E8">}}</span></span>
<span class="line"><span style="color:#79B8FF">Circle</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">Point</span><span style="color:#79B8FF"> 25</span><span style="color:#79B8FF"> 5</span><span style="color:#E1E4E8">) </span><span style="color:#79B8FF">10</span></span></code></pre>
<p>Frege provides another utility to check for a field’s existence. This would be useful if we have multiple constructors
with different set of fields.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#F97583"> :</span><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#E1E4E8">> data </span><span style="color:#79B8FF">Point</span><span style="color:#F97583"> =</span><span style="color:#79B8FF"> Point2d</span><span style="color:#E1E4E8"> {x </span><span style="color:#F97583">::</span><span style="color:#F97583"> Int</span><span style="color:#E1E4E8">, y </span><span style="color:#F97583">::</span><span style="color:#F97583"> Int</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#F97583">></span><span style="color:#F97583">            |</span><span style="color:#79B8FF"> Point3d</span><span style="color:#E1E4E8"> {x </span><span style="color:#F97583">::</span><span style="color:#F97583"> Int</span><span style="color:#E1E4E8">, y </span><span style="color:#F97583">::</span><span style="color:#F97583"> Int</span><span style="color:#E1E4E8">, z </span><span style="color:#F97583">::</span><span style="color:#F97583"> Int</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#F97583">></span></span>
<span class="line"><span style="color:#F97583">></span><span style="color:#E1E4E8"> derive </span><span style="color:#79B8FF">Show</span><span style="color:#79B8FF"> Point</span></span>
<span class="line"><span style="color:#F97583">></span><span style="color:#F97583"> :</span><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">data</span><span style="color:#E1E4E8"> type </span><span style="color:#F97583">Point</span><span style="color:#F97583"> ::</span><span style="color:#F97583"> *</span></span>
<span class="line"><span style="color:#F97583">instance</span><span style="color:#F97583"> Show</span><span style="color:#F97583">  Point</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span></span></code></pre>
<p>In the above code, we have two constructors <code>Point2d</code> and <code>Point3d</code> where the field <code>z</code> exists only for <code>Point3d</code>.
We can check for the existence of field <code>z</code> like this:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#B392F0"> Point.</span><span style="color:#E1E4E8">{z</span><span style="color:#F97583">?</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#F97583">::</span><span style="color:#F97583"> Point</span><span style="color:#F97583"> -></span><span style="color:#F97583"> Bool</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> hasZ </span><span style="color:#F97583">=</span><span style="color:#B392F0"> Point.</span><span style="color:#E1E4E8">{z</span><span style="color:#F97583">?</span><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> hasZ </span><span style="color:#F97583">$</span><span style="color:#79B8FF"> Point3d</span><span style="color:#79B8FF"> 3</span><span style="color:#79B8FF"> 4</span><span style="color:#79B8FF"> 5</span></span>
<span class="line"><span style="color:#E1E4E8">true</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> hasZ </span><span style="color:#F97583">$</span><span style="color:#79B8FF"> Point2d</span><span style="color:#79B8FF"> 3</span><span style="color:#79B8FF"> 4</span></span>
<span class="line"><span style="color:#E1E4E8">false</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> p </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> Point3d</span><span style="color:#79B8FF"> 3</span><span style="color:#79B8FF"> 4</span><span style="color:#79B8FF"> 5</span></span>
<span class="line"><span style="color:#E1E4E8">value p </span><span style="color:#F97583">::</span><span style="color:#F97583"> Point</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">frege</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> p</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">{z</span><span style="color:#F97583">?</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#E1E4E8">true</span></span>
<span class="line"></span></code></pre>
<p>For more details on how these field existence check, accessor and mutator functions are generated for a record type,
here is the link to Frege language reference: <a href="http://www.frege-lang.org/doc/Language.pdf">http://www.frege-lang.org/doc/Language.pdf</a>.</p>
<p>Happy coding!</p>]]></content:encoded>
            <author>Marimuthu Madasamy</author>
            <category>Frege</category>
        </item>
        <item>
            <title><![CDATA[Frege: Hello Java]]></title>
            <link>https://mmhelloworld.github.io/post/frege-hello-java</link>
            <guid isPermaLink="false">https://mmhelloworld.github.io/post/frege-hello-java</guid>
            <pubDate>Wed, 10 Jul 2013 00:00:00 GMT</pubDate>
            <description><![CDATA[Here is a small code demonstrating Java interoperability in Frege:]]></description>
            <content:encoded><![CDATA[<p>Here is a small code demonstrating Java interoperability in Frege:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#F97583">module</span><span style="color:#E1E4E8"> hellojava.</span><span style="color:#B392F0">HelloJava</span><span style="color:#F97583"> where</span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#F97583">data</span><span style="color:#F97583"> LinkedList</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> native java.util.</span><span style="color:#79B8FF">LinkedList</span><span style="color:#E1E4E8"> where</span></span>
<span class="line"><span style="color:#E1E4E8">    native add </span><span style="color:#F97583">::</span><span style="color:#F97583"> Mutable</span><span style="color:#E1E4E8"> s (</span><span style="color:#F97583">LinkedList</span><span style="color:#E1E4E8"> a) </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">-></span><span style="color:#F97583"> ST</span><span style="color:#E1E4E8"> s </span><span style="color:#F97583">Bool</span></span>
<span class="line"><span style="color:#E1E4E8">    native get </span><span style="color:#F97583">::</span><span style="color:#F97583"> Mutable</span><span style="color:#E1E4E8"> s (</span><span style="color:#F97583">LinkedList</span><span style="color:#E1E4E8"> a) </span><span style="color:#F97583">-></span><span style="color:#F97583"> Int</span><span style="color:#F97583"> -></span><span style="color:#F97583"> ST</span><span style="color:#E1E4E8"> s (</span><span style="color:#F97583">Maybe</span><span style="color:#E1E4E8"> a) throws</span></span>
<span class="line"><span style="color:#F97583">        IndexOutOfBoundsException</span></span>
<span class="line"><span style="color:#E1E4E8">    native new </span><span style="color:#F97583">::</span><span style="color:#79B8FF"> ()</span><span style="color:#F97583"> -></span><span style="color:#F97583"> STMutable</span><span style="color:#E1E4E8"> s (</span><span style="color:#F97583">LinkedList</span><span style="color:#E1E4E8"> a)</span></span>
<span class="line"><span style="color:#E1E4E8">    </span></span>
<span class="line"><span style="color:#E1E4E8">    fromFregeList </span><span style="color:#F97583">::</span><span style="color:#E1E4E8"> [a] </span><span style="color:#F97583">-></span><span style="color:#F97583"> STMutable</span><span style="color:#E1E4E8"> s (</span><span style="color:#F97583">LinkedList</span><span style="color:#E1E4E8"> a)</span></span>
<span class="line"><span style="color:#E1E4E8">    fromFregeList xs </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> LinkedList</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">new </span><span style="color:#79B8FF">()</span><span style="color:#F97583"> >>=</span><span style="color:#E1E4E8"> loop xs where</span></span>
<span class="line"><span style="color:#E1E4E8">        loop (x</span><span style="color:#F97583">:</span><span style="color:#E1E4E8">xs) jlist </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> LinkedList</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">add jlist x </span><span style="color:#F97583">>></span><span style="color:#E1E4E8"> loop xs jlist</span></span>
<span class="line"><span style="color:#E1E4E8">        loop </span><span style="color:#79B8FF">[]</span><span style="color:#E1E4E8"> jlist </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> return jlist</span></span>
<span class="line"><span style="color:#E1E4E8">        </span></span>
<span class="line"><span style="color:#E1E4E8">plusTop </span><span style="color:#79B8FF">::</span><span style="color:#F97583"> Mutable</span><span style="color:#E1E4E8"> s (</span><span style="color:#F97583">LinkedList</span><span style="color:#F97583"> Int</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">-></span><span style="color:#F97583"> ST</span><span style="color:#E1E4E8"> s (</span><span style="color:#F97583">Maybe</span><span style="color:#F97583"> Int</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">plusTop xs </span><span style="color:#F97583">=</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">    a </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> xs</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">get </span><span style="color:#79B8FF">0</span></span>
<span class="line"><span style="color:#E1E4E8">    b </span><span style="color:#F97583">&#x3C;-</span><span style="color:#E1E4E8"> xs</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">get </span><span style="color:#79B8FF">1</span></span>
<span class="line"><span style="color:#E1E4E8">    return ((</span><span style="color:#B392F0">+</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">&#x3C;$></span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">&#x3C;*></span><span style="color:#E1E4E8"> b)</span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#F97583">data</span><span style="color:#F97583"> IndexOutOfBoundsException</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> native java.lang.</span><span style="color:#79B8FF">IndexOutOfBoundsException</span></span>
<span class="line"><span style="color:#E1E4E8">derive </span><span style="color:#79B8FF">Exceptional</span><span style="color:#79B8FF"> IndexOutOfBoundsException</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">data</span><span style="color:#F97583"> Exception</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> native java.lang.</span><span style="color:#79B8FF">Exception</span></span>
<span class="line"><span style="color:#E1E4E8">derive </span><span style="color:#79B8FF">Exceptional</span><span style="color:#79B8FF"> Exception</span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#F97583">data</span><span style="color:#F97583"> NullPointerException</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> native java.lang.</span><span style="color:#79B8FF">NullPointerException</span></span>
<span class="line"><span style="color:#E1E4E8">derive </span><span style="color:#79B8FF">Exceptional</span><span style="color:#79B8FF"> NullPointerException</span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#E1E4E8">pure native showThrowable toString </span><span style="color:#F97583">::</span><span style="color:#F97583"> Throwable</span><span style="color:#F97583"> -></span><span style="color:#F97583"> String</span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#E1E4E8">main _ </span><span style="color:#F97583">=</span><span style="color:#F97583"> do</span></span>
<span class="line"><span style="color:#E1E4E8">    javaList </span><span style="color:#F97583">&#x3C;-</span><span style="color:#B392F0"> LinkedList.</span><span style="color:#E1E4E8">fromFregeList [</span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">2</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">3</span><span style="color:#E1E4E8">]</span></span>
<span class="line"><span style="color:#E1E4E8">    try (</span><span style="color:#F97583">\</span><span style="color:#E1E4E8">xs </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> plusTop xs </span><span style="color:#F97583">>>=</span><span style="color:#E1E4E8"> (println </span><span style="color:#F97583">.</span><span style="color:#E1E4E8"> maybe </span><span style="color:#9ECBFF">"Got a null pointer"</span><span style="color:#E1E4E8"> show)) javaList </span></span>
<span class="line"><span style="color:#F97583">        `catch`</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">\</span><span style="color:#E1E4E8">(npe </span><span style="color:#F97583">::</span><span style="color:#F97583"> NullPointerException</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> println </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> showThrowable npe)</span></span>
<span class="line"><span style="color:#F97583">        `catch`</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">\</span><span style="color:#E1E4E8">(exception </span><span style="color:#F97583">::</span><span style="color:#F97583"> Exception</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> println </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> showThrowable exception)</span></span></code></pre>
<p>We can observe the following things from the above code:</p>
<ol>
<li>Making use of a Java class and its methods</li>
<li>Using a Java object in a Frege function</li>
<li>Using Java Exceptions in functions</li>
<li>Handling Java exceptions</li>
</ol>
<h3 id="1-making-use-of-a-java-class-and-its-methods">1. Making use of a Java class and its methods:</h3>
<p>If a Java class is pure then without much effort, we can use that class in Frege. For example,</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#F97583">data</span><span style="color:#F97583"> Integer</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> native java.math.</span><span style="color:#79B8FF">BigInteger</span><span style="color:#E1E4E8"> where</span></span>
<span class="line"><span style="color:#E1E4E8">    pure  native abs                                  </span><span style="color:#F97583">::</span><span style="color:#F97583"> Integer</span><span style="color:#F97583"> -></span><span style="color:#F97583"> Integer</span></span>
<span class="line"><span style="color:#E1E4E8">    pure  native negate                               </span><span style="color:#F97583">::</span><span style="color:#F97583"> Integer</span><span style="color:#F97583"> -></span><span style="color:#F97583"> Integer</span></span>
<span class="line"><span style="color:#E1E4E8">    pure  native valueOf java</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">math</span><span style="color:#F97583">.BigInteger.</span><span style="color:#E1E4E8">valueOf </span><span style="color:#F97583">::</span><span style="color:#F97583"> Long</span><span style="color:#F97583"> -></span><span style="color:#F97583"> Integer</span></span></code></pre>
<p>A Java class is declared with <code>data</code> declaration in Frege. The identifier after the <code>data</code> keyword
is the corresponding type for the Java class in Frege and the qualified Java class is identified after the <code>native</code>
keyword followed by the instance methods, static methods or even some Frege functions not defined in the
original Java class.</p>
<p>An important point here is that the instance methods on BigInteger take Integer as their
first argument which is the <code>this</code> reference on which the methods will be invoked.</p>
<p>Coming back to our original example, here
we are trying to use the mutable Java class <code>java.util.LinkedList</code>.
An obvious difference between this one and the <code>BigInteger</code> example is that the
functions now do not have the <code>pure</code> keyword in front.</p>
<p>The next difference is that the instance methods now cannot take the simple type like <code>LinkedList a</code> as we did for
<code>Integer</code> but the type is now <code>Mutable s (LinkedList a)</code> since it is not a pure function.
If we don’t annotate a native function <code>pure</code> and we don’t use <code>Mutable</code> to consume or return a mutable Object, it will be a
compilation error. Mutable objects can only be used in <code>ST</code> or <code>IO</code> actions so the return type
must be in ST or IO monad.</p>
<p>The [LinkedList.add()](<a href="http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#add(E%5C)">http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#add(E\)</a>) method returns a boolean. Since
it is an impure function, it should be used in <code>ST</code> monad. Here the boolean itself is pure so it is just <code>ST s Bool</code>.
Take a look at the third function <code>new</code>, <code>LinkedList</code> constructor. This function is impure and it returns
a mutable object, a new <code>LinkedList</code> instance, so the return type is <code>ST s (Mutable s (LinkedList a))</code> for which the shorthand is <code>STMutable s (LinkedList a)</code>.</p>
<p>Here is an example for a native function not being part of a native
<code>data</code> declaration. This is useful when a native class is already
declared in Frege in some module but the function that we are looking
for is missing in the <code>data</code> declaration.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">pure native showThrowable toString </span><span style="color:#F97583">::</span><span style="color:#F97583"> Throwable</span><span style="color:#F97583"> -></span><span style="color:#F97583"> String</span></span></code></pre>
<p>Here <code>showThrowable</code> is the Frege function name for <code>Throwable.toString()</code>. Since it is an
instance method on <code>Throwable</code>, the first argument is of type
<code>Throwable</code> and then the formal arguments’ types (in this case, none) and return type.</p>
<h3 id="2-using-a-java-object-in-a-frege-function">2. Using a Java object in a Frege function</h3>
<p>A native <code>data</code> declaration doesn’t have to just contain the native members, it can also have
additional Frege functions.
In our example, the function <code>fromFregeList</code> is not defined in
the Java class but it has been added as an utility function to create a <code>LinkedList</code> from a frege list.
Here again the same rule as in the previous section applies: To return a mutable Java object,
we should use <code>ST s (Mutable s TheJavaType)</code> which is nothing but <code>STMutable s TheJavaType</code>.</p>
<p>In the same way, the <code>plusTop</code> function takes a mutable Java object so the parameter type is
<code>Mutable s (LinkedList Int)</code>. Also since it consumes a mutable type, it must be in <code>ST</code> monad hence
the return type is <code>ST s (Maybe Int)</code> returning an <code>Maybe Int</code> in <code>ST</code>.</p>
<h3 id="3-using-java-exceptions-in-functions">3. Using Java Exceptions in functions</h3>
<p>To use a Java Exception class, it must be first defined in a Frege
module. It is the same as declaring native declaration for a Java class but
additionally we need to derive the <code>Exceptional</code> type class so that the exception can later be handled with
<code>catch</code>.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#F97583">data</span><span style="color:#F97583"> IndexOutOfBoundsException</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> native java.lang.</span><span style="color:#79B8FF">IndexOutOfBoundsException</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">derive </span><span style="color:#79B8FF">Exceptional</span><span style="color:#79B8FF"> IndexOutOfBoundsException</span></span></code></pre>
<p>The exceptions can then be used in native declarations as in <code>get</code> function in our example:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">native get </span><span style="color:#F97583">::</span><span style="color:#F97583"> Mutable</span><span style="color:#E1E4E8"> s (</span><span style="color:#F97583">LinkedList</span><span style="color:#E1E4E8"> a) </span><span style="color:#F97583">-></span><span style="color:#F97583"> Int</span><span style="color:#F97583"> -></span><span style="color:#F97583"> ST</span><span style="color:#E1E4E8"> s (</span><span style="color:#F97583">Maybe</span><span style="color:#E1E4E8"> a) throws</span></span>
<span class="line"><span style="color:#79B8FF">    IndexOutOfBoundsException</span></span></code></pre>
<h3 id="4-handling-java-exceptions">4. Handling Java exceptions</h3>
<p>In two ways, we can handle exceptions:</p>
<ol>
<li>
<p>Using <code>action `catch` handler1 `catch` handler2</code></p>
<p>The type of <code>catch</code> is <code>Exceptional β => ST γ α -> (β->ST γ α) -> ST γ α</code>.</p>
<p>Here the <code>action</code> is the code where an exception might be thrown
and the handlers <code>handler1</code> and <code>handler2</code> take an exception and
return another value in <code>ST</code> monad. The infix notation facilitates
adding multiple handlers with better readability. Further here the
<code>handler1</code> must be more specific(in terms of the types of the
exceptions being handled) than <code>handler2</code>. Also note that from <a href="https://github.com/Frege/frege/blob/master/frege/prelude/PreludeIO.fr#L116">Frege standard library</a> with respect to <code>catch</code>:</p>
<blockquote>
<p><strong>Note</strong> If <em>action</em> is of the form:
<code>doSomething arg</code>
then, depending on the strictness of <code>doSomething</code> the argument <code>arg</code> may be evaluated
<strong>before</strong> the action is returned. Exceptions (i.e. undefined values)
that occur in the construction of the action do <strong>not</strong> count as
exceptions thrown during execution of it, and hence cannot be catched.</p>
</blockquote>
<blockquote>
<p>Example:
<code>println (head []) `catch`  ....</code></p>
</blockquote>
<blockquote>
<p>will not catch the exception that will be thrown when println evaluates</p>
</blockquote>
<blockquote>
<p>For a remedy, see <code>try</code>.</p>
</blockquote>
</li>
<li>
<p>Using <code>try</code></p>
<p>First, the type: <code>try :: Monad γ => (α-> γ β) -> α -> γ β</code></p>
<p>Unlike <code>catch</code>, <code>try</code> takes a function that produces a monadic value. If
the function can throw an exception, it must result in an <code>ST</code>
monad which can then be passed to <code>catch</code> to handle those
exceptions. In our example, <code>\xs -> plusTop xs >>= (println . maybe "Got a null pointer" show)</code> is the function which when applied to a
<code>java.util.LinkedList</code> might throw a <code>NullPointerException</code> or
<code>IndexOutOfBoundsException</code>:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;" tabindex="0" data-language="haskell"><code><span class="line"><span style="color:#E1E4E8">try (</span><span style="color:#F97583">\</span><span style="color:#E1E4E8">xs </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> plusTop xs </span><span style="color:#F97583">>>=</span><span style="color:#E1E4E8"> (println </span><span style="color:#F97583">.</span><span style="color:#E1E4E8"> maybe </span><span style="color:#9ECBFF">"Got a null pointer"</span><span style="color:#E1E4E8"> show)) javaList</span></span>
<span class="line"><span style="color:#E1E4E8">    catch` (</span><span style="color:#F97583">\</span><span style="color:#E1E4E8">(npe </span><span style="color:#F97583">::</span><span style="color:#F97583"> NullPointerException</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> println </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> showThrowable npe)</span></span>
<span class="line"><span style="color:#E1E4E8">    catch` (</span><span style="color:#F97583">\</span><span style="color:#E1E4E8">(exception </span><span style="color:#F97583">::</span><span style="color:#F97583"> Exception</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">-></span><span style="color:#E1E4E8"> println </span><span style="color:#F97583">$</span><span style="color:#E1E4E8"> showThrowable exception)</span></span></code></pre>
</li>
</ol>
<p>Since the construction of action is deferred through a lambda
here, <code>try</code> eliminates the issue with <code>catch</code> mentioned in the above note.</p>
<p>###Extending a class or implementing an interface in Frege:</p>
<p>One thing that is not shown in the example is extending a Java class
or implementing an interface in Frege. Unfortunately both are not possible in Frege
yet. There is a workaround though using a Java class which extends a
class or implements an interface but instead of an implementation on
its own, it just delegates to a Frege function. For example, see
<a href="https://github.com/Frege/frege/blob/master/frege/java/Lang.fr#L89">here</a>
for implementing <code>java.lang.Runnable</code> in Frege using a Java class
<a href="https://github.com/Frege/frege/blob/master/frege/runtime/SwingSupport.java#L56">frege.runtime.SwingSupport</a> which takes a Frege function and then
delegates to it in <code>run</code> method implementation.</p>
<p>This concludes our little experimentation calling Java from Frege. The
other interesting side, calling Frege from Java, is for a
future post.</p>]]></content:encoded>
            <author>Marimuthu Madasamy</author>
            <category>Frege</category>
            <category>Java</category>
        </item>
    </channel>
</rss>