@ciao-lang/ts-ciao-interface
Version:
Simple Ciao interface for node.
146 lines (99 loc) • 8.49 kB
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 — 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">☰</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">↑</a><a class="lpdoc-navbutton" href="hiord_rt.html">←</a><a class="lpdoc-navbutton" href="argnames_doc.html">→</a><a class="lpdoc-navbutton" href="ciaosearch.html">🔍</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> »<br/> </li><li><a href="ExtendLang.html">PART IV - Language extensions</a> »<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) =>
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 -> X = true ; X = false ).
col(A,X) :- ( (A as gadget).p2 -> 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 'gadget.p1'/1.
:- multifile 'gadget.p1'/1.
:- discontiguous 'gadget.p2'/1.
:- multifile 'gadget.p2'/1.
:- discontiguous 'gadget.q'/2.
:- multifile 'gadget.q'/2.
:- discontiguous 'gadget.r'/3.
:- multifile 'gadget.r'/3.
% :- impl gadget for datum0.
'gadget.p1'(datum0) :- '<datum0 as gadget>.p1'.
'gadget.p2'(datum0) :- '<datum0 as gadget>.p2'.
'gadget.q'(datum0, X) :- '<datum0 as gadget>.q'(X).
'gadget.r'(datum0, X, Y) :- '<datum0 as gadget>.r'(X, Y).
'<datum0 as gadget>.p1' :- true.
'<datum0 as gadget>.p2' :- fail.
'<datum0 as gadget>.q'(X) :- X = r1.
'<datum0 as gadget>.r'(X, Y) :- X = r1, Y = r2.
% :- impl gadget for datum1/1.
'gadget.p1'(M) :- M = datum1(D), '<datum1/1 as gadget>.p1'(D).
'gadget.p2'(M) :- M = datum1(D), '<datum1/1 as gadget>.p2'(D).
'gadget.q'(M, X) :- M = datum1(D), '<datum1/1 as gadget>.q'(X, D).
'gadget.r'(M, X, Y) :- M = datum1(D), '<datum1/1 as gadget>.r'(X, D, Y).
'<datum1/1 as gadget>.p1'(_E1) :- true.
'<datum1/1 as gadget>.p2'(_E1) :- fail.
'<datum1/1 as gadget>.q'(X, E1) :- X = r1(E1).
'<datum1/1 as gadget>.r'(X, E1, Y) :- X = r1(E1), Y = r2.
% :- impl gadget for datum2/2.
'gadget.p1'(M) :- M = datum2(_,_), '<datum2/2 as gadget>.p1'(M).
'gadget.p2'(M) :- M = datum2(_,_), '<datum2/2 as gadget>.p2'(M).
'gadget.q'(M, X) :- M = datum2(_,_), '<datum2/2 as gadget>.q'(X, M).
'gadget.r'(M, X, Y) :- M = datum2(_,_), '<datum2/2 as gadget>.r'(X, M, Y).
'<datum2/2 as gadget>.p1'(datum2(_E1, _E2)) :- true.
'<datum2/2 as gadget>.p2'(datum2(_E1, _E2)) :- fail.
'<datum2/2 as gadget>.q'(X, datum2(E1, _E2)) :- X = r1(E1).
'<datum2/2 as gadget>.r'(X, datum2(E1, E2), Y) :- X = r1(E1), Y = r2(E2).
% (tests)
:- use_module(library(aggregates), [findall/3]).
:- test trait_test(X) =>
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) :- ( 'gadget.p1'(A) -> X = true ; X = false ).
col(A,X) :- ( 'gadget.p2'(A) -> X = true ; X = false ).
col(A,X) :- 'gadget.q'(A, X).
col(A,[X,Y]) :- 'gadget.r'(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>