UNPKG

@ciao-lang/ts-ciao-interface

Version:

Simple Ciao interface for node.

146 lines (99 loc) 8.49 kB
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><meta name="theme-color" content="#273f79"/><link rel="stylesheet" href="lpdoc.css" type="text/css"/><script type="text/javascript" src="lpdoc.js"></script><title>Traits &mdash; The Ciao System v1.22</title></head><body><div class="lpdoc-page fixleftbar"><a href="#" id="sidebar-toggle-button" class="lpdoc-navbutton"><span id="sidebar-button-arrow">&#9776;</span></a><div id="sidebar" class="lpdoc-sidebar"><div style="height: 40px; margin-left: auto; margin-right: auto"><img src="ciao-logo_autofig.png" width=auto height=100%></div><div class="lpdoc-nav"><span class="lpdoc-on-right"><a class="lpdoc-navbutton" href="ExtendLang.html">&#x2191;</a><a class="lpdoc-navbutton" href="hiord_rt.html">&#x2190;</a><a class="lpdoc-navbutton" href="argnames_doc.html">&#x2192;</a><a class="lpdoc-navbutton" href="ciaosearch.html">&#x1F50D;</a></span><span><a href="ciaofulltoc.html">TOC</a></span></div><hr></hr><ul class="lpdoc-itemize-sectpath"><li><a href="ciao.html">The Ciao System</a> &raquo;<br/> </li><li><a href="ExtendLang.html">PART IV - Language extensions</a> &raquo;<br/> </li><li><a href=""><strong>Traits</strong></a></li></ul><hr></hr><em>ON THIS PAGE</em><ul><li><a href="#Usage and interface">Usage and interface</a></li><li><a href="#Other information">Other information</a></li><li><a href="#Example code and translation">Example code and translation</a></li></ul></div><div class="lpdoc-main"><div id=""><h1>Traits</h1><a class="lpdoc-idx-anchor" href="ciaosearch.html#traits"></a> <strong>Author(s):</strong> <a class="lpdoc-idx-anchor" id="Jose F. Morales" href="ciaosearch.html#Jose F. Morales">Jose F. Morales</a>.<p> <div class="lpdoc-alert"><strong>Stability: [</strong><strong>devel</strong><strong>] </strong>Currently the subject of active development and research. Syntax may change without warning or deprecation period.</div><p><br/> This package extends the Ciao module system with traits. This is a lightweight translation with no overhead w.r.t. traditional use of <tt>multifile</tt> declarations for <em>hook</em> predicates.<p>A <a class="lpdoc-idx-anchor" id="0" href="ciaosearch.html#trait">trait</a> is defined in Ciao as a collection of predicates that can be implemented for any functor. Functors can implement multiple traits.<p>This translation delegates on the underlying module system as much as possible, e.g., for dealing with undefined predicates. See <a href="#Example code and translation">Example code and translation</a> for a complete example that shows syntax, some special cases, and the translation to plain clauses.<p>Some important notes on the translation: <ul> <li>internal argument order ensures that first-argument indexing is preserved<p><li>functors data is passed as an extra argument to implementation clauses as follows: <ul> <li>constants add no extra arguments <li>unary functors <tt>f(Datum)</tt> are passed as <tt>Datum</tt> <li>any other functor is passed unaltered </ul> </ul> <p><br/><div id="Usage and interface"><h2>Usage and interface</h2><div class="lpdoc-cartouche"><ul><li><strong>Library usage:</strong><br/><tt>:- use_package(traits).</tt> or <tt>:- module(...,...,[traits]).</tt><li><strong>Implicit imports:</strong><br/><ul class="lpdoc-itemize-minus"><li><em>Packages:</em><br/><a class="lpdoc-idx-anchor" id="1" href="ciaosearch.html#prelude"><tt>prelude</tt></a>, <a class="lpdoc-idx-anchor" id="2" href="ciaosearch.html#initial"><tt>initial</tt></a>, <a class="lpdoc-idx-anchor" id="3" href="condcomp_doc.html"><tt>condcomp</tt></a>, <a class="lpdoc-idx-anchor" id="4" href="assertions_doc.html"><tt>assertions</tt></a>, <a class="lpdoc-idx-anchor" id="5" href="ciaosearch.html#assertions/assertions_basic"><tt>assertions/assertions_basic</tt></a>. </ul></ul></div></div><div id="Other information"><h2>Other information</h2> <div id="Example code and translation"><h2>Example code and translation</h2> <p>Example code:<p><pre class="lpdoc-codeblock">:- module(trait_test, [], [traits, assertions]). :- trait(gadget, [ p1/0, p2/0, q/1, r/2 ]). :- impl(gadget, datum0). (datum0 as gadget).p1. (datum0 as gadget).p2 :- fail. (datum0 as gadget).q(X) :- X = r1. (datum0 as gadget).r(X, Y) :- X = r1, Y = r2. :- impl(gadget, datum1/1). (datum1(_) as gadget).p1. (datum1(_) as gadget).p2 :- fail. (datum1(E1) as gadget).q(X) :- X = r1(E1). (datum1(E1) as gadget).r(X, Y) :- X = r1(E1), Y = r2. :- impl(gadget, datum2/2). (datum2(_,_) as gadget).p1. (datum2(_,_) as gadget).p2 :- fail. (datum2(E1,_) as gadget).q(X) :- X = r1(E1). (datum2(E1,E2) as gadget).r(X, Y) :- X = r1(E1), Y = r2(E2). % (tests) :- use_module(library(aggregates), [findall/3]). :- test trait_test(X) =&gt; X = [[true,false,r1, [r1, r2]], [true,false,r1(e1),[r1(e1),r2]], [true,false,r1(e1),[r1(e1),r2(e2)]]]. :- export(trait_test/1). trait_test([Y1,Y2,Y3]) :- row(datum0,Y1), row(datum1(e1),Y2), row(datum2(e1,e2),Y3). row(A,Xs) :- findall(X,col(A,X),Xs). col(A,X) :- ( (A as gadget).p1 -&gt; X = true ; X = false ). col(A,X) :- ( (A as gadget).p2 -&gt; X = true ; X = false ). col(A,X) :- (A as gadget).q(X). col(A,[X,Y]) :- (A as gadget).r(X, Y). </pre> <p>which should be equivalent to:<p><pre class="lpdoc-codeblock">:- module(trait_orig, [], [traits, assertions]). % :- trait gadget { ... }. :- discontiguous &apos;gadget.p1&apos;/1. :- multifile &apos;gadget.p1&apos;/1. :- discontiguous &apos;gadget.p2&apos;/1. :- multifile &apos;gadget.p2&apos;/1. :- discontiguous &apos;gadget.q&apos;/2. :- multifile &apos;gadget.q&apos;/2. :- discontiguous &apos;gadget.r&apos;/3. :- multifile &apos;gadget.r&apos;/3. % :- impl gadget for datum0. &apos;gadget.p1&apos;(datum0) :- &apos;&lt;datum0 as gadget&gt;.p1&apos;. &apos;gadget.p2&apos;(datum0) :- &apos;&lt;datum0 as gadget&gt;.p2&apos;. &apos;gadget.q&apos;(datum0, X) :- &apos;&lt;datum0 as gadget&gt;.q&apos;(X). &apos;gadget.r&apos;(datum0, X, Y) :- &apos;&lt;datum0 as gadget&gt;.r&apos;(X, Y). &apos;&lt;datum0 as gadget&gt;.p1&apos; :- true. &apos;&lt;datum0 as gadget&gt;.p2&apos; :- fail. &apos;&lt;datum0 as gadget&gt;.q&apos;(X) :- X = r1. &apos;&lt;datum0 as gadget&gt;.r&apos;(X, Y) :- X = r1, Y = r2. % :- impl gadget for datum1/1. &apos;gadget.p1&apos;(M) :- M = datum1(D), &apos;&lt;datum1/1 as gadget&gt;.p1&apos;(D). &apos;gadget.p2&apos;(M) :- M = datum1(D), &apos;&lt;datum1/1 as gadget&gt;.p2&apos;(D). &apos;gadget.q&apos;(M, X) :- M = datum1(D), &apos;&lt;datum1/1 as gadget&gt;.q&apos;(X, D). &apos;gadget.r&apos;(M, X, Y) :- M = datum1(D), &apos;&lt;datum1/1 as gadget&gt;.r&apos;(X, D, Y). &apos;&lt;datum1/1 as gadget&gt;.p1&apos;(_E1) :- true. &apos;&lt;datum1/1 as gadget&gt;.p2&apos;(_E1) :- fail. &apos;&lt;datum1/1 as gadget&gt;.q&apos;(X, E1) :- X = r1(E1). &apos;&lt;datum1/1 as gadget&gt;.r&apos;(X, E1, Y) :- X = r1(E1), Y = r2. % :- impl gadget for datum2/2. &apos;gadget.p1&apos;(M) :- M = datum2(_,_), &apos;&lt;datum2/2 as gadget&gt;.p1&apos;(M). &apos;gadget.p2&apos;(M) :- M = datum2(_,_), &apos;&lt;datum2/2 as gadget&gt;.p2&apos;(M). &apos;gadget.q&apos;(M, X) :- M = datum2(_,_), &apos;&lt;datum2/2 as gadget&gt;.q&apos;(X, M). &apos;gadget.r&apos;(M, X, Y) :- M = datum2(_,_), &apos;&lt;datum2/2 as gadget&gt;.r&apos;(X, M, Y). &apos;&lt;datum2/2 as gadget&gt;.p1&apos;(datum2(_E1, _E2)) :- true. &apos;&lt;datum2/2 as gadget&gt;.p2&apos;(datum2(_E1, _E2)) :- fail. &apos;&lt;datum2/2 as gadget&gt;.q&apos;(X, datum2(E1, _E2)) :- X = r1(E1). &apos;&lt;datum2/2 as gadget&gt;.r&apos;(X, datum2(E1, E2), Y) :- X = r1(E1), Y = r2(E2). % (tests) :- use_module(library(aggregates), [findall/3]). :- test trait_test(X) =&gt; X = [[true,false,r1, [r1, r2]], [true,false,r1(e1),[r1(e1),r2]], [true,false,r1(e1),[r1(e1),r2(e2)]]]. :- export(trait_test/1). trait_test([Y1,Y2,Y3]) :- row(datum0,Y1), row(datum1(e1),Y2), row(datum2(e1,e2),Y3). row(A,Xs) :- findall(X,col(A,X),Xs). col(A,X) :- ( &apos;gadget.p1&apos;(A) -&gt; X = true ; X = false ). col(A,X) :- ( &apos;gadget.p2&apos;(A) -&gt; X = true ; X = false ). col(A,X) :- &apos;gadget.q&apos;(A, X). col(A,[X,Y]) :- &apos;gadget.r&apos;(A, X, Y). </pre> </div><br/></div></div><div class="lpdoc-footer">Generated with LPdoc using Ciao</div></div><div class="lpdoc-clearer"></div></div></body></html>