2024-05-07 07:22:32 +02:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< meta name = "generator" content = "Asciidoctor 2.0.20" >
< meta name = "author" content = "Celestino Amoroso" >
< title > Expr< / title >
< link rel = "stylesheet" href = "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700" >
< style >
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment the following line when using as a custom stylesheet */
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=checkbox],input[type=radio]{padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,::before,::after{box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ul.square{list-style-type:square}
ul.circle ul:not([class]),ul.disc ul:not([class]),ul.square ul:not([class]){list-style:inherit}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:first-child,.sidebarblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,td.hdlist1,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]{border-bottom:1px dotted}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
< / style >
< link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" >
< style >
pre.rouge table td { padding: 5px; }
pre.rouge table pre { margin: 0; }
pre.rouge, pre.rouge .w {
color: #fbf1c7;
background-color: #282828;
}
pre.rouge .err {
color: #fb4934;
background-color: #282828;
font-weight: bold;
}
pre.rouge .c, pre.rouge .ch, pre.rouge .cd, pre.rouge .cm, pre.rouge .cpf, pre.rouge .c1, pre.rouge .cs {
color: #928374;
font-style: italic;
}
pre.rouge .cp {
color: #8ec07c;
}
pre.rouge .nt {
color: #fb4934;
}
pre.rouge .o, pre.rouge .ow {
color: #fbf1c7;
}
pre.rouge .p, pre.rouge .pi {
color: #fbf1c7;
}
pre.rouge .gi {
color: #b8bb26;
background-color: #282828;
}
pre.rouge .gd {
color: #fb4934;
background-color: #282828;
}
pre.rouge .gh {
color: #b8bb26;
font-weight: bold;
}
2024-12-25 07:43:06 +01:00
pre.rouge .ge {
font-style: italic;
}
pre.rouge .ges {
font-weight: bold;
font-style: italic;
}
pre.rouge .gs {
font-weight: bold;
}
2024-05-07 07:22:32 +02:00
pre.rouge .k, pre.rouge .kn, pre.rouge .kp, pre.rouge .kr, pre.rouge .kv {
color: #fb4934;
}
pre.rouge .kc {
color: #d3869b;
}
pre.rouge .kt {
color: #fabd2f;
}
pre.rouge .kd {
color: #fe8019;
}
pre.rouge .s, pre.rouge .sb, pre.rouge .sc, pre.rouge .dl, pre.rouge .sd, pre.rouge .s2, pre.rouge .sh, pre.rouge .sx, pre.rouge .s1 {
color: #b8bb26;
font-style: italic;
}
pre.rouge .si {
color: #b8bb26;
font-style: italic;
}
pre.rouge .sr {
color: #b8bb26;
font-style: italic;
}
pre.rouge .sa {
color: #fb4934;
}
pre.rouge .se {
color: #fe8019;
}
pre.rouge .nn {
color: #8ec07c;
}
pre.rouge .nc {
color: #8ec07c;
}
pre.rouge .no {
color: #d3869b;
}
pre.rouge .na {
color: #b8bb26;
}
pre.rouge .m, pre.rouge .mb, pre.rouge .mf, pre.rouge .mh, pre.rouge .mi, pre.rouge .il, pre.rouge .mo, pre.rouge .mx {
color: #d3869b;
}
pre.rouge .ss {
color: #83a598;
}
< / style >
< / head >
< body class = "article toc2 toc-right" >
< div id = "header" >
< h1 > Expr< / h1 >
< div class = "details" >
< span id = "author" class = "author" > Celestino Amoroso< / span > < br >
< / div >
< div id = "toc" class = "toc2" >
< div id = "toctitle" > Table of Contents< / div >
< ul class = "sectlevel1" >
< li > < a href = "#_expr" > 1. Expr< / a >
< ul class = "sectlevel2" >
2024-06-19 09:38:02 +02:00
< li > < a href = "#_concepts_and_terminology" > 1.1. Concepts and terminology< / a >
< ul class = "sectlevel3" >
< li > < a href = "#_variables" > 1.1.1. Variables< / a > < / li >
< li > < a href = "#_multi_expression" > 1.1.2. Multi-expression< / a > < / li >
< li > < a href = "#_calculation_context" > 1.1.3. Calculation context< / a > < / li >
< / ul >
< / li >
2024-05-10 06:39:48 +02:00
< li > < a href = "#_dev_expr_test_tool" > 1.2. < code > dev-expr< / code > test tool< / a > < / li >
2024-05-07 07:22:32 +02:00
< / ul >
< / li >
< li > < a href = "#_data_types" > 2. Data types< / a >
< ul class = "sectlevel2" >
2024-05-15 22:06:26 +02:00
< li > < a href = "#_numbers" > 2.1. Numbers< / a >
< ul class = "sectlevel3" >
< li > < a href = "#_integers" > 2.1.1. Integers< / a > < / li >
< li > < a href = "#_floats" > 2.1.2. Floats< / a > < / li >
< li > < a href = "#_fractions" > 2.1.3. Fractions< / a > < / li >
< / ul >
< / li >
< li > < a href = "#_strings" > 2.2. Strings< / a > < / li >
2024-05-17 07:31:13 +02:00
< li > < a href = "#_booleans" > 2.3. Booleans< / a > < / li >
2024-05-15 22:06:26 +02:00
< li > < a href = "#_lists" > 2.4. Lists< / a > < / li >
2024-05-17 07:31:13 +02:00
< li > < a href = "#_dictionaries" > 2.5. Dictionaries< / a > < / li >
2024-05-07 07:22:32 +02:00
< / ul >
< / li >
2024-06-19 09:38:02 +02:00
< li > < a href = "#_variables_2" > 3. Variables< / a > < / li >
2024-05-17 07:31:13 +02:00
< li > < a href = "#_other_operations" > 4. Other operations< / a >
2024-05-07 07:22:32 +02:00
< ul class = "sectlevel2" >
2024-05-17 07:31:13 +02:00
< li > < a href = "#_operator" > 4.1. < code class = "blue" > ;< / code > operator< / a > < / li >
< li > < a href = "#_but_operator" > 4.2. < code class = "blue" > but< / code > operator< / a > < / li >
< li > < a href = "#_assignment_operator" > 4.3. Assignment operator < code class = "blue" > =< / code > < / a > < / li >
< li > < a href = "#_selector_operator" > 4.4. Selector operator < code class = "blue" > ? : ::< / code > < / a > < / li >
2024-09-16 06:52:29 +02:00
< li > < a href = "#_variable_default_value_and" > 4.5. Variable default value < code class = "blue" > ??< / code > , < code class = "blue" > ?=< / code > , and < code class = "blue" > ?!< / code > < / a > < / li >
2024-05-07 07:22:32 +02:00
< / ul >
< / li >
2024-05-17 07:31:13 +02:00
< li > < a href = "#_priorities_of_operators" > 5. Priorities of operators< / a > < / li >
< li > < a href = "#_functions" > 6. Functions< / a >
2024-05-07 07:22:32 +02:00
< ul class = "sectlevel2" >
2024-06-21 09:06:25 +02:00
< li > < a href = "#_expr_function_definition" > 6.1. < em > Expr< / em > function definition< / a > < / li >
< li > < a href = "#_golang_function_definition" > 6.2. < em > Golang< / em > function definition< / a > < / li >
< li > < a href = "#_function_calls" > 6.3. Function calls< / a > < / li >
2024-10-05 05:30:22 +02:00
< li > < a href = "#_function_context" > 6.4. Function context< / a > < / li >
2024-05-07 07:22:32 +02:00
< / ul >
< / li >
2024-06-19 22:51:37 +02:00
< li > < a href = "#_iterators" > 7. Iterators< / a > < / li >
< li > < a href = "#_builtins" > 8. Builtins< / a >
2024-05-07 07:22:32 +02:00
< ul class = "sectlevel2" >
2024-06-19 22:51:37 +02:00
< li > < a href = "#_builtin_functions" > 8.1. Builtin functions< / a > < / li >
< li > < a href = "#_import" > 8.2. < em class = "blue" > import()< / em > < / a > < / li >
2024-05-07 07:22:32 +02:00
< / ul >
< / li >
2024-06-19 22:51:37 +02:00
< li > < a href = "#_plugins" > 9. Plugins< / a > < / li >
2024-05-07 07:22:32 +02:00
< / ul >
< / div >
< / div >
< div id = "content" >
< div id = "preamble" >
< div class = "sectionbody" >
<!-- toc disabled -->
< div class = "paragraph" >
2024-06-21 09:06:25 +02:00
< p > < mark > TODO: Work in progress (last update on 2024/06/21, 05:40 a.m.)< / mark > < / p >
2024-05-07 07:22:32 +02:00
< / div >
< / div >
< / div >
< div class = "sect1" >
< h2 id = "_expr" > < a class = "anchor" href = "#_expr" > < / a > < a class = "link" href = "#_expr" > 1. Expr< / a > < / h2 >
< div class = "sectionbody" >
< div class = "paragraph" >
< p > < em > Expr< / em > is a GO package capable of analysing, interpreting and calculating expressions.< / p >
< / div >
< div class = "sect2" >
2024-05-10 06:39:48 +02:00
< h3 id = "_concepts_and_terminology" > < a class = "anchor" href = "#_concepts_and_terminology" > < / a > < a class = "link" href = "#_concepts_and_terminology" > 1.1. Concepts and terminology< / a > < / h3 >
< div class = "paragraph" >
2024-06-19 09:38:02 +02:00
< p > Expressions are texts containing sequences of operations represented by a syntax very similar to that of most programming languages. < em > Expr< / em > package provides these macro functions:< / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > < strong > < em > Scanner< / em > < / strong >   —   Its input is a text. It scans expression text characters to produce a flow of logical symbol and related attributes, aka tokens.< / p >
< / li >
< li >
< p > < strong > < em > Parser< / em > < / strong >   —   Parser input is the token flow coming from the scanner. It analyses the token flow verifyng if it complies with the < em > Expr< / em > syntax. If that is the case, the Parser generates the Abstract Syntax Tree (AST). This is tree data structure that represents the components of an expressions and how they are related one each other.< / p >
< / li >
< li >
< p > < strong > < em > Calculator< / em > < / strong > . Its input is the AST. It computes the parsed expression contained in the AST and returns the result or an error.< / p >
< / li >
< / ul >
2024-05-10 06:39:48 +02:00
< / div >
< div class = "imageblock" >
< div class = "content" >
2024-06-19 22:04:13 +02:00
< img src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABHUAAABjCAYAAAAVUjy4AAA2WHRFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMmFwcC5kaWFncmFtcy5uZXQlMjIlMjBtb2RpZmllZCUzRCUyMjIwMjQtMDQtMDNUMTMlM0ExMSUzQTEwLjIxNFolMjIlMjBhZ2VudCUzRCUyMk1vemlsbGElMkY1LjAlMjAoTWFjaW50b3NoJTNCJTIwSW50ZWwlMjBNYWMlMjBPUyUyMFglMjAxMC4xNSUzQiUyMHJ2JTNBMTI0LjApJTIwR2Vja28lMkYyMDEwMDEwMSUyMEZpcmVmb3glMkYxMjQuMCUyMiUyMHZlcnNpb24lM0QlMjIyNC4yLjElMjIlMjBldGFnJTNEJTIyQ1BnbXB0TmJaWnFhZ2tDWFFCOWUlMjIlMjB0eXBlJTNEJTIyZGV2aWNlJTIyJTIwc2NhbGUlM0QlMjIxJTIyJTIwYm9yZGVyJTNEJTIyMCUyMiUzRSUwQSUyMCUyMCUzQ2RpYWdyYW0lMjBuYW1lJTNEJTIyUGFnaW5hLTElMjIlMjBpZCUzRCUyMnpMbVE5QVNKMDRGQV9DWDNrR1hYJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDbXhHcmFwaE1vZGVsJTIwZHglM0QlMjI5ODklMjIlMjBkeSUzRCUyMjU3MCUyMiUyMGdyaWQlM0QlMjIxJTIyJTIwZ3JpZFNpemUlM0QlMjIxMCUyMiUyMGd1aWRlcyUzRCUyMjElMjIlMjB0b29sdGlwcyUzRCUyMjElMjIlMjBjb25uZWN0JTNEJTIyMSUyMiUyMGFycm93cyUzRCUyMjElMjIlMjBmb2xkJTNEJTIyMSUyMiUyMHBhZ2UlM0QlMjIxJTIyJTIwcGFnZVNjYWxlJTNEJTIyMSUyMiUyMHBhZ2VXaWR0aCUzRCUyMjgyNyUyMiUyMHBhZ2VIZWlnaHQlM0QlMjIxMTY5JTIyJTIwbWF0aCUzRCUyMjAlMjIlMjBzaGFkb3clM0QlMjIwJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTNDcm9vdCUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214Q2VsbCUyMGlkJTNEJTIyMCUyMiUyMCUyRiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214Q2VsbCUyMGlkJTNEJTIyMSUyMiUyMHBhcmVudCUzRCUyMjAlMjIlMjAlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteENlbGwlMjBpZCUzRCUyMjIlMjIlMjBzdHlsZSUzRCUyMmVkZ2VTdHlsZSUzRG9ydGhvZ29uYWxFZGdlU3R5bGUlM0Jyb3VuZGVkJTNEMCUzQm9ydGhvZ29uYWxMb29wJTNEMSUzQmpldHR5U2l6ZSUzRGF1dG8lM0JodG1sJTNEMSUzQmVudHJ5WCUzRDAlM0JlbnRyeVklM0QwLjUlM0JlbnRyeUR4JTNEMCUzQmVudHJ5RHklM0QwJTNCZW5kQXJyb3clM0RjbGFzc2ljJTNCZW5kRmlsbCUzRDAlM0IlMjIlMjBlZGdlJTNEJTIyMSUyMiUyMHNvdXJjZSUzRCUyMjMlMjIlMjB0YXJnZXQlM0QlMjI1JTIyJTIwcGFyZW50JTNEJTIyMSUyMiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214R2VvbWV0cnklMjByZWxhdGl2ZSUzRCUyMjElMjIlMjBhcyUzRCUyMmdlb21ldHJ5JTIyJTIwJTJGJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGbXhDZWxsJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbXhDZWxsJTIwaWQlM0QlMjIzJTIyJTIwdmFsdWUlM0QlMjJzY2FubmVyJTIyJTIwc3R5bGUlM0QlMjJyb3VuZGVkJTNEMSUzQndoaXRlU3BhY2UlM0R3cmFwJTNCaHRtbCUzRDElM0Jmb250U2l6ZSUzRDEyJTNCZ2xhc3MlM0QwJTNCc3Ryb2tlV2lkdGglM0QxJTNCc2hhZG93JTNEMCUzQmZpbGxDb2xvciUzRCUyMzFiYTFlMiUzQmZvbnRDb2xvciUzRCUyM2ZmZmZmZiUzQnN0cm9rZUNvbG9yJTNEJTIzMDA2RUFGJTNCJTIyJTIwdmVydGV4JTNEJTIyMSUyMiUyMHBhcmVudCUzRCUyMjElMjIlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteEdlb21ldHJ5JTIweCUzRCUyMjE4MCUyMiUyMHklM0QlMjIzOSUyMiUyMHdpZHRoJTNEJTIyMTAwJTIyJTIwaGVpZ2h0JTNEJTIyNDAlMjIlMjBhcyUzRCUyMmdlb21ldHJ5JTIyJTIwJTJGJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGbXhDZWxsJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbXhDZWxsJTIwaWQlM0QlMjI0JTIyJTIwc3R5bGUlM0QlMjJlZGdlU3R5bGUlM0RvcnRob2dvbmFsRWRnZVN0eWxlJTNCcm91bmRlZCUzRDAlM0JvcnRob2dvbmFsTG9vcCUzRDElM0JqZXR0eVNpemUlM0RhdXRvJTNCaHRtbCUzRDElM0JlbnRyeVglM0QwLjEzJTNCZW50cnlZJTNEMC40NzUlM0JlbnRyeUR4JTNEMCUzQmVudHJ5RHklM0QwJTNCZW5kQXJyb3clM0RjbGFzc2ljJTNCZW5kRmlsbCUzRDAlM0JlbnRyeVBlcmltZXRlciUzRDAlM0IlMjIlMjBlZGdlJTNEJTIyMSUyMiUyMHNvdXJjZSUzRCUyMjUlMjIlMjB0YXJnZXQlM0QlMjIxNyUyMiUyMHBhcmVudCUzRCUyMjElMjIlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteEdlb21ldHJ5JTIwcmVsYXRpdmUlM0QlMjIxJTIyJTIwYXMlM0QlMjJnZW9tZXRyeSUyMiUyMCUyRiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQyUyRm14Q2VsbCUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214Q2VsbCUyMGlkJTNEJTIyNSUyMiUyMHZhbHVlJTNEJTIyJTIyJTIwc3R5bGUlM0QlMjJyb3VuZGVkJTNEMSUzQndoaXRlU3BhY2UlM0R3cmFwJTNCaHRtbCUzRDElM0Jmb250U2l6ZSUzRDEyJTNCZ2xhc3MlM0QwJTNCc3Ryb2tlV2lkdGglM0QxJTNCc2hhZG93JTNEMCUzQmZpbGxDb2xvciUzRCUyM2RhZThmYyUzQnN0cm9rZUNvbG9yJTNEJTIzNmM4ZWJmJTNCJTIyJTIwdmVydGV4JTNEJTIyMSUyMiUyMHBhcmVudCUzRCUyMjElMjIlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteEdlb21ldHJ5JTIweCUzRCUyMjMyMCUyMiUyMHklM0QlMjIxNCUyMiUyMHdpZHRoJTNEJTIyMjg2JTIyJTIwaGVpZ2h0JTNEJTIyOTAlMjIlMjBhcyUzRCUyMmdlb21ldHJ5JTIyJTIwJTJGJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGbXhDZWxsJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbXhDZWxsJTIwaWQlM0QlMjI2JTIyJTIwdmFsdWUlM0QlMjIlMjIlMjBzdHlsZSUzRCUyMmVkZ2VTdHlsZSUzRG9ydGhvZ29uYWxFZGdlU3R5bGUlM0Jyb3VuZGVkJTNEMCUzQm9
2024-05-10 06:39:48 +02:00
< / div >
< / div >
2024-06-19 09:38:02 +02:00
< div class = "sect3" >
< h4 id = "_variables" > < a class = "anchor" href = "#_variables" > < / a > < a class = "link" href = "#_variables" > 1.1.1. Variables< / a > < / h4 >
< div class = "paragraph" >
< p > < em > Expr< / em > supports variables. The result of an expression can be stored in a variable and reused in other espressions simply specifying the name of the variable as an operand.< / p >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_multi_expression" > < a class = "anchor" href = "#_multi_expression" > < / a > < a class = "link" href = "#_multi_expression" > 1.1.2. Multi-expression< / a > < / h4 >
< div class = "paragraph" >
< p > An input text valid for < em > Expr< / em > can contain more than an expression. Expressions are separated by < code class = "blue" > ;< / code > (semicolon). When an input contains two or more expressions it is called < em > multi-expression< / em > .< / p >
< / div >
< div class = "paragraph" >
< p > < em > Expr< / em > parses and computes each expression of a multi-espression, from the left to the right. If all expressions are computed without errors, it only returns the value of the last, the right most.< / p >
< / div >
< div class = "paragraph" >
< p > The result of each expression of a multi-expression is stored in an automatic variable named < em > last< / em > . In this way, each expression can refer to the result of the previous one without the need to assign that value to a new dedicated variable.< / p >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_calculation_context" > < a class = "anchor" href = "#_calculation_context" > < / a > < a class = "link" href = "#_calculation_context" > 1.1.3. Calculation context< / a > < / h4 >
< div class = "paragraph" >
< p > All objects, such as variables and functions, created during the calculation of an expression are stored in a memory called < em > context< / em > .< / p >
< / div >
< div class = "paragraph" >
< p > The expression context is analogous to the stack-frame of other programming languages. When a function is called, a new context is allocated to store local definitions.< / p >
< / div >
< div class = "paragraph" >
< p > Function contexts are created by cloning the calling context. More details on this topic are given later in this document.< / p >
< / div >
< div class = "paragraph" >
2024-10-05 05:30:22 +02:00
< p > < em > Expr< / em > creates and keeps a inner < em > global context< / em > where it stores imported functions, either from builtin or plugin modules. To perform calculations, the user program must provide its own context; this is the < em > main context< / em > . All calculations take place in this context. As mentioned eralier, when a function is called, a new context is created by cloning the calling context. The created context can be called < em > function context< / em > .< / p >
2024-06-19 09:38:02 +02:00
< / div >
< div class = "paragraph" >
< p > Imported functions are registerd in the < em > global context< / em > . When an expression first calls an imported function, that function is linked to the current context; this can be the < em > main context< / em > or a < em > function context< / em > .< / p >
< / div >
< / div >
2024-05-10 06:39:48 +02:00
< / div >
< div class = "sect2" >
< h3 id = "_dev_expr_test_tool" > < a class = "anchor" href = "#_dev_expr_test_tool" > < / a > < a class = "link" href = "#_dev_expr_test_tool" > 1.2. < code > dev-expr< / code > test tool< / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2024-06-19 22:04:13 +02:00
< p > Before we begin to describe the syntax of < em > Expr< / em > , it is worth introducing < em > dev-expr< / em > because it will be used to show many examples of expressions.< / p >
< / div >
< div class = "paragraph" >
2024-06-19 09:38:02 +02:00
< p > < code > dev-expr< / code > is a simple program that can be used to evaluate expressions interactively. As its name suggests, it was created for testing purpose. In fact, in additon to the automatic verification test suite based on the Go test framework, < code > dev-expr< / code > provided an important aid for quickly testing of new features during their development.< / p >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "paragraph" >
2024-05-16 07:11:20 +02:00
< p > < code > dev-expr< / code > can work as a < em > REPL< / em > , < em > < strong > R< / strong > ead-< strong > E< / strong > xecute-< strong > P< / strong > rint-< strong > L< / strong > oop< / em > , or it can process expression acquired from files or standard input.< / p >
2024-05-10 06:39:48 +02:00
< / div >
< div class = "paragraph" >
< p > The program can be downloaded from < a href = "https://git.portale-stac.it/go-pkg/-/packages/generic/dev-expr/" > dev-expr< / a > .< / p >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "paragraph" >
2024-05-10 06:39:48 +02:00
< p > Here are some examples of execution.< / p >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "listingblock" >
< div class = "title" > Run < code > dev-expr< / code > in REPL mode and ask for help< / div >
< div class = "content" >
2024-05-17 07:31:13 +02:00
< pre class = "rouge highlight" > < code data-lang = "shell" > < span class = "c" > # Type 'exit' or Ctrl+D to quit the program.< / span >
2024-05-07 07:22:32 +02:00
2024-05-16 07:11:20 +02:00
< span class = "o" > [< / span > user]< span class = "nv" > $ < / span > ./dev-expr
2024-09-16 06:52:29 +02:00
dev-expr < span class = "nt" > --< / span > Expressions calculator v1.12.0< span class = "o" > (< / span > build 1< span class = "o" > )< / span > ,2024/09/14 < span class = "o" > (< / span > celestino.amoroso@portale-stac.it< span class = "o" > )< / span >
Based on the Expr package v0.26.0
2024-05-16 07:11:20 +02:00
Type < span class = "nb" > help < / span > to get the list of available commands
2024-05-07 07:22:32 +02:00
See also https://git.portale-stac.it/go-pkg/expr/src/branch/main/README.adoc
< span class = "o" > > > > < / span > < span class = "nb" > help< / span >
< span class = "nt" > ---< / span > REPL commands:
2024-05-08 07:51:01 +02:00
base < span class = "nt" > --< / span > Set the integer output base: 2, 8, 10, or 16
< span class = "nb" > exit< / span > < span class = "nt" > --< / span > Exit the program
2024-05-07 07:22:32 +02:00
< span class = "nb" > help< / span > < span class = "nt" > --< / span > Show < span class = "nb" > command < / span > list
ml < span class = "nt" > --< / span > Enable/Disable multi-line output
mods < span class = "nt" > --< / span > List < span class = "nb" > builtin < / span > modules
2024-06-19 09:38:02 +02:00
output < span class = "nt" > --< / span > Enable/Disable printing expression results. Options < span class = "s1" > 'on'< / span > , < span class = "s1" > 'off'< / span > , < span class = "s1" > 'status'< / span >
2024-09-16 06:52:29 +02:00
< span class = "nb" > source< / span > < span class = "nt" > --< / span > Load a file as input
< span class = "nb" > tty< / span > < span class = "nt" > --< / span > Enable/Disable ansi output < i class = "conum" data-value = "1" > < / i > < b > (1)< / b >
2024-05-07 07:22:32 +02:00
< span class = "nt" > ---< / span > Command line options:
< span class = "nt" > -b< / span > < < span class = "nb" > builtin< / span > < span class = "o" > > < / span > Import < span class = "nb" > builtin < / span > modules.
< < span class = "nb" > builtin< / span > < span class = "o" > > < / span > can be a list of module names or a glob-pattern.
Use the special value < span class = "s1" > 'all'< / span > or the pattern < span class = "s1" > '*'< / span > to import all modules.
< span class = "nt" > -e< / span > < expression> Evaluate < expression> instead of standard-input
< span class = "nt" > -i< / span > Force REPL operation when all < span class = "nt" > -e< / span > occurences have been processed
< span class = "nt" > -h< / span > , < span class = "nt" > --help< / span > , < span class = "nb" > help < / span > Show this < span class = "nb" > help < / span > menu
< span class = "nt" > -m< / span > , < span class = "nt" > --modules< / span > List all < span class = "nb" > builtin < / span > modules
2024-06-19 09:38:02 +02:00
< span class = "nt" > --noout< / span > Disable printing of expression results
2024-05-07 07:22:32 +02:00
< span class = "nt" > -p< / span > Print prefix form
2024-05-08 07:51:01 +02:00
< span class = "nt" > -t< / span > Print tree form < i class = "conum" data-value = "2" > < / i > < b > (2)< / b >
2024-06-19 09:38:02 +02:00
< span class = "nt" > -v< / span > , < span class = "nt" > --version< / span > Show program version
2024-05-08 07:51:01 +02:00
< span class = "o" > > > > < / span > < / code > < / pre >
2024-05-07 07:22:32 +02:00
< / div >
< / div >
< div class = "colist arabic" >
< table >
< tr >
< td > < i class = "conum" data-value = "1" > < / i > < b > 1< / b > < / td >
< td > Only available for single fraction values< / td >
< / tr >
< tr >
< td > < i class = "conum" data-value = "2" > < / i > < b > 2< / b > < / td >
< td > Work in progress< / td >
< / tr >
< / table >
< / div >
< div class = "listingblock" >
< div class = "title" > REPL examples< / div >
< div class = "content" >
2024-05-16 07:11:20 +02:00
< pre class = "rouge highlight" > < code data-lang = "shell" > < span class = "o" > [< / span > user]< span class = "nv" > $ < / span > ./dev-expr
2024-06-19 09:38:02 +02:00
dev-expr < span class = "nt" > --< / span > Expressions calculator v1.10.0< span class = "o" > (< / span > build 14< span class = "o" > )< / span > ,2024/06/17 < span class = "o" > (< / span > celestino.amoroso@portale-stac.it< span class = "o" > )< / span >
Based on the Expr package v0.19.0
2024-05-16 07:11:20 +02:00
Type < span class = "nb" > help < / span > to get the list of available commands
See also https://git.portale-stac.it/go-pkg/expr/src/branch/main/README.adoc
2024-05-07 07:22:32 +02:00
< span class = "o" > > > > < / span > 2+3
5
< span class = "o" > > > > < / span > 2+3< span class = "k" > *< / span > < span class = "o" > (< / span > 4-1.5< span class = "o" > )< / span >
9.5
< span class = "o" > > > > < / span > 0xFD + 0b1 + 0o1 < i class = "conum" data-value = "1" > < / i > < b > (1)< / b >
255
2024-12-25 07:43:06 +01:00
< span class = "o" > > > > < / span > 1:2 + 2:3 < i class = "conum" data-value = "2" > < / i > < b > (2)< / b >
7:6
2024-05-07 07:22:32 +02:00
< span class = "o" > > > > < / span > ml < i class = "conum" data-value = "3" > < / i > < b > (3)< / b >
2024-12-25 07:43:06 +01:00
< span class = "o" > > > > < / span > 1:2 + 2:3
2024-05-07 07:22:32 +02:00
7
-
6
2024-12-25 07:43:06 +01:00
< span class = "o" > > > > < / span > 4+2 but 5:2+0.5 < i class = "conum" data-value = "4" > < / i > < b > (4)< / b >
2024-05-07 07:22:32 +02:00
3
2024-12-25 07:43:06 +01:00
< span class = "o" > > > > < / span > 4+2< span class = "p" > ;< / span > 5:2+0.5 < i class = "conum" data-value = "5" > < / i > < b > (5)< / b >
2024-05-07 07:22:32 +02:00
3
< span class = "o" > > > > < / span > < / code > < / pre >
< / div >
< / div >
< div class = "colist arabic" >
< table >
< tr >
< td > < i class = "conum" data-value = "1" > < / i > < b > 1< / b > < / td >
2024-06-19 09:38:02 +02:00
< td > Number bases: 0x = < em > hexadecimal< / em > , 0o = < em > octal< / em > , 0b = < em > binary< / em > .< / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td > < i class = "conum" data-value = "2" > < / i > < b > 2< / b > < / td >
2024-12-25 07:43:06 +01:00
< td > Fractions: < em > numerator< / em > : < em > denominator< / em > .< / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td > < i class = "conum" data-value = "3" > < / i > < b > 3< / b > < / td >
< td > Activate multi-line output of fractions.< / td >
< / tr >
< tr >
< td > < i class = "conum" data-value = "4" > < / i > < b > 4< / b > < / td >
< td > But operator, see < a href = "#_but_operator" > < code class = "blue" > but< / code > operator< / a > .< / td >
< / tr >
< tr >
< td > < i class = "conum" data-value = "5" > < / i > < b > 5< / b > < / td >
< td > Multi-expression: the same result of the previous single expression but this it is obtained with two separated calculations.< / td >
< / tr >
< / table >
< / div >
< / div >
< / div >
< / div >
< div class = "sect1" >
< h2 id = "_data_types" > < a class = "anchor" href = "#_data_types" > < / a > < a class = "link" href = "#_data_types" > 2. Data types< / a > < / h2 >
< div class = "sectionbody" >
< div class = "paragraph" >
2024-06-19 09:38:02 +02:00
< p > < em > Expr< / em > has its type system which is a subset of Golang’ s type system. It supports numerical, string, relational, boolean expressions, and mixed-type lists and maps.< / p >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "sect2" >
< h3 id = "_numbers" > < a class = "anchor" href = "#_numbers" > < / a > < a class = "link" href = "#_numbers" > 2.1. Numbers< / a > < / h3 >
< div class = "paragraph" >
2024-05-15 22:06:26 +02:00
< p > < em > Expr< / em > supports three type of numbers:< / p >
< / div >
< div class = "olist arabic" >
< ol class = "arabic" >
< li >
< p > < span class = "blue" > Integers< / span > < / p >
< / li >
< li >
< p > < span class = "blue" > Floats< / span > < / p >
< / li >
< li >
2024-09-16 06:52:29 +02:00
< p > < span class = "blue" > Fractions< / span > < / p >
2024-05-15 22:06:26 +02:00
< / li >
< / ol >
< / div >
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< p > In mixed operations involving integers, fractions and floats, automatic type promotion to the largest type is performed.< / p >
2024-05-15 22:06:26 +02:00
< / div >
< div class = "sect3" >
< h4 id = "_integers" > < a class = "anchor" href = "#_integers" > < / a > < a class = "link" href = "#_integers" > 2.1.1. Integers< / a > < / h4 >
< div class = "paragraph" >
< p > < em > Expr< / em > 's integers are a subset of the integer set. Internally they are stored as Golang < em > int64< / em > values.< / p >
< / div >
< div class = "exampleblock" >
< div class = "title" > Example 1. Integer literal syntax< / div >
< div class = "content" >
< div class = "paragraph" >
< p > < strong > < em > integer< / em > < / strong > = [< em > sign< / em > ] < em > digit-seq< / em > < br >
< em > sign< / em > = "< strong > +< / strong > " | "< strong > -< / strong > "< br >
< em > digit-seq< / em > = < em > dec-seq< / em > | < em > bin-seq< / em > | < em > oct-seq< / em > | < em > hex-seq< / em > < br >
< em > dec-seq< / em > = {< em > dec-digit< / em > }< br >
< em > dec-digit< / em > = "< strong > 0< / strong > "|"< strong > 1< / strong > "|… ​ |"< strong > 9< / strong > "< br >
< em > bin-seq< / em > = "< strong > 0b< / strong > "{< em > bin-digit< / em > }< br >
< em > bin-digit< / em > = "< strong > 0< / strong > "|"< strong > 1< / strong > "< br >
< em > oct-seq< / em > = "< strong > 0o< / strong > "{< em > oct-digit< / em > }< br >
< em > oct-digit< / em > = "< strong > 0< / strong > "|"< strong > 1< / strong > "|… ​ |"< strong > 7< / strong > "< br >
< em > hex-seq< / em > = "< strong > 0x< / strong > "{< em > hex-digit< / em > }< br >
< em > hex-digit< / em > = "< strong > 0< / strong > "|"< strong > 1< / strong > "|… ​ |"< strong > 9< / strong > "|"< strong > a< / strong > "|… ​ |"< strong > z< / strong > "|"< strong > A< / strong > "|… ​ |"< strong > Z< / strong > "< / p >
< / div >
< / div >
< / div >
< div class = "paragraph" >
< p > Value range: < strong > -9223372036854775808< / strong > to < strong > 9223372036854775807< / strong > < / p >
2024-05-07 07:22:32 +02:00
< / div >
< table class = "tableblock frame-all grid-all stretch" >
< caption class = "title" > Table 1. Arithmetic operators< / caption >
< colgroup >
< col style = "width: 7.6923%;" >
< col style = "width: 15.3846%;" >
< col style = "width: 46.1538%;" >
< col style = "width: 30.7693%;" >
< / colgroup >
2024-05-15 22:06:26 +02:00
< tbody >
2024-05-07 07:22:32 +02:00
< tr >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > Symbol< / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > Operation< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Description< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Examples< / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
2024-05-15 22:06:26 +02:00
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +< / code > < / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Sum< / em > < / p > < / td >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Add two values< / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > -1 + 2< / code > → < em > 1< / em > < / p > < / td >
2024-05-15 22:06:26 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > -< / code > < / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Subtraction< / em > < / p > < / td >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Subtract the right value from the left one< / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 3 - 1< / code > → < em > 2< / em > < / p > < / td >
2024-05-15 22:06:26 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > *< / code > < / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Product< / em > < / p > < / td >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Multiply two values< / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > -1 * 2< / code > → < em > -2< / em > < / p > < / td >
2024-05-15 22:06:26 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > /< / code > < / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Integer division< / em > < / p > < / td >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Divide the left value by the right one< sup > (*)< / sup > < / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > -11 / 2< / code > → < em > -5< / em > < / p > < / td >
2024-05-15 22:06:26 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > %< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Modulo< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Remainder of the integer division< / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 5 % 2< / code > → < em > 1< / em > < / p > < / td >
2024-05-15 22:06:26 +02:00
< / tr >
< / tbody >
< / table >
< div class = "paragraph" >
< p > < sup > (*)< / sup > See also the < em > float division< / em > < code class = "blue" > ./< / code > below.< / p >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_floats" > < a class = "anchor" href = "#_floats" > < / a > < a class = "link" href = "#_floats" > 2.1.2. Floats< / a > < / h4 >
< div class = "paragraph" >
< p > < em > Expr< / em > 's floats are a subset of the rational number set. Note that they can’ t hold the exact value of an unlimited number; floats can only approximate them. Internally floats are stored as Golang’ s < em > float64< / em > values.< / p >
< / div >
< div class = "exampleblock" >
< div class = "title" > Example 2. Float literal syntax< / div >
< div class = "content" >
< div class = "paragraph" >
< p > < strong > < em > float< / em > < / strong > = [< em > sign< / em > ] < em > dec-seq< / em > "< strong > .< / strong > " [< em > dec-seq< / em > ] [("< strong > e< / strong > "|"< strong > E< / strong > ") [< em > sign< / em > ] < em > dec-seq< / em > ]< br >
< em > sign< / em > = "< strong > +< / strong > " | "< strong > -< / strong > "< br >
< em > dec-seq< / em > = < em > see-integer-literal-syntax< / em > < / p >
< / div >
< / div >
< / div >
2024-05-16 07:11:20 +02:00
< div class = "paragraph" >
< div class = "title" > Examples< / div >
< p > < code > > > > < / code > < code class = "blue" > 1.0< / code > < br >
2024-06-19 22:46:35 +02:00
< code class = "green" > 1< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 0.123< / code > < br >
< code class = "green" > 0.123< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 4.5e+3< / code > < br >
< code class = "green" > 4500< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 4.5E-33< / code > < br >
< code class = "green" > 4.5e-33< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 4.5E-3< / code > < br >
< code class = "green" > 0.0045< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 4.5E10< / code > < br >
2024-05-17 15:46:56 +02:00
< code class = "green" > 4.5e+10< / code > < / p >
2024-05-16 07:11:20 +02:00
< / div >
2024-05-15 22:06:26 +02:00
< table class = "tableblock frame-all grid-all stretch" >
< caption class = "title" > Table 2. Arithmetic operators< / caption >
< colgroup >
< col style = "width: 7.6923%;" >
< col style = "width: 15.3846%;" >
< col style = "width: 46.1538%;" >
< col style = "width: 30.7693%;" >
< / colgroup >
2024-05-07 07:22:32 +02:00
< tbody >
< tr >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > Symbol< / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > Operation< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Description< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Examples< / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +< / code > < / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Sum< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Add two values< / p > < / td >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 4 + 0.5< / code > → 4.5< / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > -< / code > < / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Subtraction< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Subtract the right value from the left one< / p > < / td >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 4 - 0.5< / code > → 3.5< / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > *< / code > < / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Product< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Multiply two values< / p > < / td >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 4 * 0.5< / code > → 2.0< / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > /< / code > < / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Float division< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Divide the left value by the right one< / p > < / td >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 1.0 / 2< / code > → 0.5< / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ./< / code > < / p > < / td >
2024-09-16 06:52:29 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Forced float division< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Force float division< / p > < / td >
2024-05-15 22:06:26 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > -1 ./ 2< / code > → -0.5< / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< / tbody >
< / table >
< / div >
2024-05-15 22:06:26 +02:00
< div class = "sect3" >
< h4 id = "_fractions" > < a class = "anchor" href = "#_fractions" > < / a > < a class = "link" href = "#_fractions" > 2.1.3. Fractions< / a > < / h4 >
2024-05-09 07:20:22 +02:00
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < em > Expr< / em > also supports fractions. Fraction literals are made with two integers separated by a colon character < code > :< / code > .< / p >
2024-05-09 07:20:22 +02:00
< / div >
2024-05-15 22:06:26 +02:00
< div class = "exampleblock" >
< div class = "title" > Example 3. Fraction literal syntax< / div >
< div class = "content" >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < strong > < em > fraction< / em > < / strong > = [< em > sign< / em > ] (< em > num-den-spec< / em > "< strong > :< / strong > " < em > float-spec< / em > )< br >
2024-05-15 22:06:26 +02:00
< em > sign< / em > = "< strong > +< / strong > " | "< strong > -< / strong > "< br >
< em > num-den-spec< / em > = < em > digit-seq< / em > "< strong > |< / strong > " < em > digit-seq< / em > < br >
< em > float-spec< / em > = < em > dec-seq< / em > "< strong > .< / strong > " [< em > dec-seq< / em > ] "< strong > (< / strong > " < em > dec-seq< / em > "< strong > )< / strong > "< br >
< em > dec-seq< / em > = < em > see-integer-literal-syntax< / em > < br >
2024-05-17 15:46:56 +02:00
< em > digit-seq< / em > = < em > see-integer-literal-syntax< / em > < / p >
2024-05-15 22:06:26 +02:00
< / div >
< / div >
< / div >
2024-05-09 07:20:22 +02:00
< div class = "paragraph" >
< div class = "title" > Examples< / div >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 1 : 2< / code > < br >
< code class = "green" > 1:2< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 4:6< / code > < em class = "gray" > // Fractions are always reduced to their lowest terms< / em > < br >
< code class = "green" > 2:3< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 1:2 + 2:3< / code > < br >
< code class = "green" > 7:6< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 1:2 * 2:3< / code > < br >
< code class = "green" > 1:3< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 1:2 / 1:3< / code > < br >
< code class = "green" > 3:2< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 1:2 ./ 1:3< / code > < em class = "gray" > // Force decimal division< / em > < br >
2024-06-19 22:46:35 +02:00
< code class = "green" > 1.5< / code > < / p >
< / div >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > -1:2< / code > < br >
< code class = "green" > -1:2< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 1:-2< / code > < em class = "gray" > // Invalid sign specification< / em > < br >
< em class = "red" > Eval Error: [1:3] infix operator ":" requires two non-nil operands, got 1< / em > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 1:(-2)< / code > < br >
< code class = "green" > -1:2< / code > < / p >
2024-05-09 07:20:22 +02:00
< / div >
< div class = "paragraph" >
< p > Fractions can be used together with integers and floats in expressions.< / p >
< / div >
< div class = "paragraph" >
2024-05-17 07:31:13 +02:00
< div class = "title" > Examples< / div >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 1:2 + 5< / code > < br >
< code class = "green" > 11:2< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 4 - 1:2< / code > < br >
< code class = "green" > 7:2< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
2024-12-25 07:43:06 +01:00
< p > < code > > > > < / code > < code class = "blue" > 1.0 + 1:2< / code > < br >
2024-05-17 15:46:56 +02:00
< code class = "green" > 1.5< / code > < / p >
2024-05-09 07:20:22 +02:00
< / div >
< / div >
2024-05-15 22:06:26 +02:00
< / div >
2024-05-09 07:20:22 +02:00
< div class = "sect2" >
2024-05-15 22:06:26 +02:00
< h3 id = "_strings" > < a class = "anchor" href = "#_strings" > < / a > < a class = "link" href = "#_strings" > 2.2. Strings< / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2024-05-16 07:11:20 +02:00
< p > Strings are character sequences enclosed between two double quote < code class = "blue" > "< / code > .< / p >
< / div >
< div class = "paragraph" >
< div class = "title" > Examples< / div >
< p > < code > > > > < / code > < code class = "blue" > "I’ m a string"< / code > < br >
2024-06-19 22:46:35 +02:00
< code class = "green" > I’ m a string< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > "123abc?!"< / code > < br >
< code class = "green" > 123abc?!< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > "123\nabc"< / code > < br >
2024-05-16 07:11:20 +02:00
< code class = "green" > 123< / code > < br >
2024-06-19 22:46:35 +02:00
< code class = "green" > abc< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > "123\tabc"< / code > < br >
2024-05-16 07:11:20 +02:00
< code class = "green" > 123        abc< / code > < / p >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< p > Some arithmetic operators also apply to strings.< / p >
2024-05-07 07:22:32 +02:00
< / div >
< table class = "tableblock frame-all grid-all stretch" >
2024-05-15 22:06:26 +02:00
< caption class = "title" > Table 3. String operators< / caption >
2024-05-07 07:22:32 +02:00
< colgroup >
< col style = "width: 7.6923%;" >
< col style = "width: 15.3846%;" >
< col style = "width: 46.1538%;" >
< col style = "width: 30.7693%;" >
< / colgroup >
< thead >
< tr >
< th class = "tableblock halign-center valign-top" > Symbol< / th >
< th class = "tableblock halign-center valign-top" > Operation< / th >
< th class = "tableblock halign-left valign-top" > Description< / th >
< th class = "tableblock halign-left valign-top" > Examples< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > concatenation< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Join two strings or two < em > stringable< / em > values< / p > < / td >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > "one" + "two"< / code > → < em > "onetwo"< / em > < br >
< code class = "blue" > "one" + 2< / code > → < em > "one2"< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > *< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > repeat< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Make < em > n< / em > copy of a string< / p > < / td >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > "one" * 2< / code > → < em > "oneone"< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< / tbody >
< / table >
2024-05-11 20:14:54 +02:00
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > The charanters in a string can be accessed using the square < code > []< / code > operator.< / p >
2024-05-11 20:14:54 +02:00
< / div >
2024-05-16 07:11:20 +02:00
< div class = "exampleblock" >
< div class = "title" > Example 4. Item access syntax< / div >
2024-05-11 20:14:54 +02:00
< div class = "content" >
2024-05-16 07:11:20 +02:00
< div class = "paragraph" >
2024-06-19 22:46:35 +02:00
< p > < strong > < em > item< / em > < / strong > = < em > string-expr< / em > "< strong > [< / strong > " < em > integer-expr< / em > "< strong > ]< / strong > "< / p >
2024-06-19 09:38:02 +02:00
< / div >
< / div >
< / div >
< div class = "exampleblock" >
2024-06-19 22:20:28 +02:00
< div class = "title" > Example 5. Sub-string syntax< / div >
2024-06-19 09:38:02 +02:00
< div class = "content" >
< div class = "paragraph" >
2024-06-19 22:46:35 +02:00
< p > < strong > < em > sub-string< / em > < / strong > = < em > string-expr< / em > "< strong > [< / strong > " < em > integer-expr< / em > "< strong > :< / strong > " < em > integer-expr< / em > "< strong > ]< / strong > "< / p >
2024-05-16 07:11:20 +02:00
< / div >
2024-05-11 20:14:54 +02:00
< / div >
< / div >
< div class = "paragraph" >
< div class = "title" > String examples< / div >
2024-06-19 09:38:02 +02:00
< p > < code > > > > < / code > < code class = "blue" > s="abcd"< / code > < em class = "gray" > // assign the string to variable s< / em > < br >
2024-06-19 22:46:35 +02:00
< code class = "green" > "abcd"< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > s[1]< / code > < em class = "gray" > // char at position 1 (starting from 0)< / em > < br >
< code class = "green" > "b"< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > s[-1]< / code > < em class = "gray" > // char at position -1, the rightmost one< / em > < br >
2024-06-19 22:46:35 +02:00
< code class = "green" > "d"< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > #s< / code > < em class = "gray" > // number of chars< / em > < br >
2024-06-19 22:46:35 +02:00
< code class = "gren" > 4< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > #"abc"< / code > < em class = "gray" > // number of chars< / em > < br >
< code class = "green" > 3< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > s[1:3]< / code > < em class = "gray" > // chars from position 1 to position 3 excluded< / em > < br >
2024-06-19 09:38:02 +02:00
< code class = "grean" > "bc"< / code > < / p >
2024-05-11 20:14:54 +02:00
< / div >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "sect2" >
2024-05-17 07:31:13 +02:00
< h3 id = "_booleans" > < a class = "anchor" href = "#_booleans" > < / a > < a class = "link" href = "#_booleans" > 2.3. Booleans< / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2024-05-16 07:11:20 +02:00
< p > Boolean data type has two values only: < em class = "blue" > true< / em > and < em class = "blue" > false< / em > . Relational and boolean expressions result in boolean values.< / p >
2024-05-07 07:22:32 +02:00
< / div >
< table class = "tableblock frame-all grid-all stretch" >
2024-05-20 15:50:45 +02:00
< caption class = "title" > Table 4. Relational operators< sup > (*)< / sup > < / caption >
2024-05-07 07:22:32 +02:00
< colgroup >
< col style = "width: 7.6923%;" >
< col style = "width: 15.3846%;" >
< col style = "width: 46.1538%;" >
< col style = "width: 30.7693%;" >
< / colgroup >
< thead >
< tr >
< th class = "tableblock halign-center valign-top" > Symbol< / th >
< th class = "tableblock halign-center valign-top" > Operation< / th >
< th class = "tableblock halign-left valign-top" > Description< / th >
< th class = "tableblock halign-left valign-top" > Examples< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ==< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Equal< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if the left value is equal to the right one< / p > < / td >
2024-05-16 07:11:20 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 5 == 2< / code > → < em > false< / em > < br >
< code class = "blue" > "a" == "a"< / code > → < em > true< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > !=< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Not Equal< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if the left value is NOT equal to the right one< / p > < / td >
2024-05-16 07:11:20 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 5 != 2< / code > → < em > true< / em > < br >
< code class = "blue" > "a" != "a"< / code > → < em > false< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > < < / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Less< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if the left value is less than the right one< / p > < / td >
2024-05-16 07:11:20 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 5 < 2< / code > → < em > false< / em > < br >
< code class = "blue" > "a" < "b"< / code > → < em > true< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > < =< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Less or Equal< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if the left value is less than or equal to the right one< / p > < / td >
2024-05-16 07:11:20 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 5 < = 2< / code > → < em > false< / em > < br >
< code class = "blue" > "b" < = "b"< / code > → < em > true< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > > < / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Greater< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if the left value is greater than the right one< / p > < / td >
2024-05-16 07:11:20 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 5 > 2< / code > → < em > true< / em > < br >
2024-09-12 06:57:43 +02:00
< code class = "blue" > "a" > "b"< / code > → < em > false< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > > =< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Greater or Equal< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if the left value is greater than or equal to the right one< / p > < / td >
2024-05-16 07:11:20 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 5 > = 2< / code > → < em > true< / em > < br >
2024-09-12 06:57:43 +02:00
< code class = "blue" > "b" > = "b"< / code > → < em > true< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< / tbody >
< / table >
2024-05-20 15:50:45 +02:00
< div class = "paragraph" >
< p > < sup > (*)< / sup > See also the < code class = "blue" > in< / code > operator in the < em > list< / em > and < em > dictionary< / em > sections.< / p >
< / div >
2024-05-07 07:22:32 +02:00
< table class = "tableblock frame-all grid-all stretch" >
2024-05-15 22:06:26 +02:00
< caption class = "title" > Table 5. Boolean operators< / caption >
2024-05-07 07:22:32 +02:00
< colgroup >
< col style = "width: 15.3846%;" >
< col style = "width: 15.3846%;" >
< col style = "width: 38.4615%;" >
< col style = "width: 30.7693%;" >
< / colgroup >
< thead >
< tr >
< th class = "tableblock halign-center valign-top" > Symbol< / th >
< th class = "tableblock halign-center valign-top" > Operation< / th >
< th class = "tableblock halign-left valign-top" > Description< / th >
< th class = "tableblock halign-left valign-top" > Examples< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > NOT< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Not< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if the right value is false< / p > < / td >
2024-05-16 07:11:20 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > NOT true< / code > → < em > false< / em > < br >
< code class = "blue" > NOT (2 < 1)< / code > → < em > true< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > AND< / code > / < code class = "blue" > & & < / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > And< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if both left and right values are true< / p > < / td >
2024-05-16 07:11:20 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > false & & true< / code > → < em > false< / em > < br >
< code class = "blue" > "a" < "b" AND NOT (2 < 1)< / code > → < em > true< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > OR< / code > / < code class = "blue" > ||< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Or< / em > < / p > < / td >
2024-09-12 06:57:43 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if at least one of the left and right values integers is true< / p > < / td >
2024-05-16 07:11:20 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > false or true< / code > → < em > true< / em > < br >
< code class = "blue" > "a" == "b" OR (2 == 1)< / code > → < em > false< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< / tbody >
< / table >
< div class = "admonitionblock caution" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-caution" title = "Caution" > < / i >
< / td >
< td class = "content" >
< div class = "paragraph" >
2024-06-19 22:20:28 +02:00
< p > Currently, boolean operations are evaluated using < em > short cut evaluation< / em > . This means that, if the left expression of the < code class = "blue" > and< / code > and < code class = "blue" > or< / code > operators is sufficient to establish the result of the whole operation, the right expression would not be evaluated at all.
.Example< / p >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "rouge highlight" > < code data-lang = "go" > < span class = "m" > 2< / span > < span class = "o" > > < / span > < span class = "p" > (< / span > < span class = "n" > a< / span > < span class = "o" > =< / span > < span class = "m" > 1< / span > < span class = "p" > )< / span > < span class = "n" > or< / span > < span class = "p" > (< / span > < span class = "n" > a< / span > < span class = "o" > =< / span > < span class = "m" > 8< / span > < span class = "p" > )< / span > < span class = "o" > > < / span > < span class = "m" > 0< / span > < span class = "p" > ;< / span > < span class = "n" > a< / span > < i class = "conum" data-value = "1" > < / i > < b > (1)< / b > < / code > < / pre >
< / div >
< / div >
< div class = "colist arabic" >
< table >
< tr >
< td > < i class = "conum" data-value = "1" > < / i > < b > 1< / b > < / td >
< td > This multi-expression returns < em > 1< / em > because in the first expression the left value of < code class = "blue" > or< / code > is < em > true< / em > and as a conseguence its right value is not computed. Therefore the < em > a< / em > variable only receives the integer < em > 1< / em > .< / td >
< / tr >
< / table >
< / div >
2024-06-19 22:20:28 +02:00
< div class = "admonitionblock tip" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-tip" title = "Tip" > < / i >
< / td >
< td class = "content" >
< code > dev-expr< / code > provides the < em > ctrl()< / em > function that allows to change this behaviour.
< / td >
< / tr >
< / table >
< / div >
2024-05-07 07:22:32 +02:00
< / td >
< / tr >
< / table >
< / div >
< / div >
< div class = "sect2" >
2024-05-15 22:06:26 +02:00
< h3 id = "_lists" > < a class = "anchor" href = "#_lists" > < / a > < a class = "link" href = "#_lists" > 2.4. Lists< / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2024-05-17 07:31:13 +02:00
< p > < em > Expr< / em > supports list of mixed-type values, also specified by normal expressions. Internally, < em > Expr< / em > 's lists are Go arrays.< / p >
2024-05-07 07:22:32 +02:00
< / div >
2024-05-17 07:31:13 +02:00
< div class = "exampleblock" >
2024-06-19 09:38:02 +02:00
< div class = "title" > Example 6. List literal syntax< / div >
2024-05-07 07:22:32 +02:00
< div class = "content" >
2024-05-17 07:31:13 +02:00
< div class = "paragraph" >
< p > < strong > < em > list< / em > < / strong > = < em > empty-list< / em > | < em > non-empty-list< / em > < br >
< em > empty-list< / em > = "< strong > []< / strong > "< br >
2024-09-12 06:57:43 +02:00
< em > non-empty-list< / em > = "< strong > [< / strong > " < em > any-value< / em > {"< strong > ,< / strong > " < em > any-value< / em > } "< strong > ]< / strong > "< br > < / p >
2024-05-07 07:22:32 +02:00
< / div >
< / div >
2024-05-17 07:31:13 +02:00
< / div >
< div class = "paragraph" >
< div class = "title" > Examples< / div >
< p > < code > > > > < / code > < code class = "blue" > [1,2,3]< / code > < em class = "gray" > // List of integers< / em > < br >
2024-06-19 22:25:38 +02:00
< code class = "green" > [1, 2, 3]< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > ["one", "two", "three"]< / code > < em class = "gray" > // List of strings< / em > < br >
< code class = "green" > ["one", "two", "three"]< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > ["one", 2, false, 4.1]< / code > < em class = "gray" > // List of mixed-types< / em > < br >
< code class = "green" > ["one", 2, false, 4.1]< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > ["one"+1, 2.0*(9-2)]< / code > < em class = "gray" > // List of expressions< / em > < br >
< code class = "green" > ["one1", 14]< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > [ [1,"one"], [2,"two"]]< / code > < em class = "gray" > // List of lists< / em > < br >
2024-05-17 07:31:13 +02:00
< code class = "green" > [[1, "one"], [2, "two"]]< / code > < / p >
< / div >
2024-05-07 07:22:32 +02:00
< table class = "tableblock frame-all grid-all stretch" >
2024-05-15 22:06:26 +02:00
< caption class = "title" > Table 6. List operators< / caption >
2024-05-07 07:22:32 +02:00
< colgroup >
< col style = "width: 15.3846%;" >
< col style = "width: 15.3846%;" >
< col style = "width: 38.4615%;" >
< col style = "width: 30.7693%;" >
< / colgroup >
< thead >
< tr >
< th class = "tableblock halign-center valign-top" > Symbol< / th >
< th class = "tableblock halign-center valign-top" > Operation< / th >
< th class = "tableblock halign-left valign-top" > Description< / th >
< th class = "tableblock halign-left valign-top" > Examples< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Join< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Joins two lists< / p > < / td >
2024-05-17 07:31:13 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > [1,2] + [3]< / code > → < em > [1,2,3]< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > -< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Difference< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Left list without elements in the right list< / p > < / td >
2024-05-17 07:31:13 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > [1,2,3] - [2]< / code > → < em > [1,3]< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
2024-05-20 06:59:49 +02:00
< tr >
2024-12-28 09:28:12 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +> < / code > < / p > < / td >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Front insertion< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Insert an item in front< / p > < / td >
2024-12-28 09:28:12 +01:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 0 +> [1,2]< / code > → < em > [0,1,2]< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< / tr >
< tr >
2024-12-28 09:28:12 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > < +< / code > < / p > < / td >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Back insertion< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Insert an item at end< / p > < / td >
2024-12-28 09:28:12 +01:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > [1,2] < + 3< / code > → < em > [1,2,3]< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< / tr >
< tr >
2024-06-19 22:20:28 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > []< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Item at index< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Item at given position< / p > < / td >
2024-06-19 22:20:28 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > [1,2,3][1]< / code > → < em > 2< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > in< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Item in list< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if item is in list< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > 2 in [1,2,3]< / code > → < em > true< / em > < br >
< code class = "blue" > 6 in [1,2,3]< / code > → < em > false< / em > < / p > < / td >
< / tr >
2024-09-16 06:52:29 +02:00
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > #< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Size< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Number of items in a list< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > #[1,2,3]< / code > → < em > 3< / em > < / p > < / td >
< / tr >
2024-05-07 07:22:32 +02:00
< / tbody >
< / table >
2024-05-10 06:39:48 +02:00
< div class = "paragraph" >
2024-06-19 22:20:28 +02:00
< p > Array’ s items can be accessed using the index < code > []< / code > operator.< / p >
2024-05-10 06:39:48 +02:00
< / div >
2024-05-17 07:31:13 +02:00
< div class = "exampleblock" >
2024-06-19 09:38:02 +02:00
< div class = "title" > Example 7. Item access syntax< / div >
2024-05-10 06:39:48 +02:00
< div class = "content" >
2024-05-17 07:31:13 +02:00
< div class = "paragraph" >
2024-06-19 22:20:28 +02:00
< p > < strong > < em > item< / em > < / strong > = < em > list-expr< / em > "< strong > [< / strong > " < em > integer-expr< / em > "< strong > ]< / strong > "< / p >
< / div >
< / div >
< / div >
< div class = "exampleblock" >
< div class = "title" > Example 8. Sub-array (or slice of array) syntax< / div >
< div class = "content" >
< div class = "paragraph" >
< p > < strong > < em > slice< / em > < / strong > = < em > string-expr< / em > "< strong > [< / strong > " < em > integer-expr< / em > "< strong > :< / strong > " < em > integer-expr< / em > "< strong > ]< / strong > "< / p >
2024-05-17 07:31:13 +02:00
< / div >
2024-05-10 06:39:48 +02:00
< / div >
< / div >
2024-05-11 20:14:54 +02:00
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< div class = "title" > Examples: Getting items from lists< / div >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > [1,2,3][1]< / code > < br >
2024-06-19 22:25:38 +02:00
< code class = "green" > 2< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< p > < code > > > > < / code > < code class = "blue" > index=2; ["a", "b", "c", "d"][index]< / code > < br >
< code class = "green" > c< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > ["a", "b", "c", "d"][2:]< / code > < br >
< code class = "green" > ["c", "d"]< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > list=[1,2,3]; list[1]< / code > < br >
2024-06-19 22:25:38 +02:00
< code class = "green" > 2< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > ["one","two","three"][1]< / code > < br >
2024-06-19 22:25:38 +02:00
< code class = "green" > two< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > list=["one","two","three"]; list[2-1]< / code > < br >
2024-06-19 22:25:38 +02:00
< code class = "green" > two< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< p > < code > > > > < / code > < code class = "blue" > list[1]="six"; list< / code > < br >
< code class = "green" > ["one", "six", "three"]< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > list[-1]< / code > < br >
2024-06-19 22:25:38 +02:00
< code class = "green" > three< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > list[10]< / code > < br >
2024-06-19 22:25:38 +02:00
< code class = "red" > Eval Error: [1:9] index 10 out of bounds< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< div class = "title" > Example: Number of elements in a list< / div >
2024-06-19 22:25:38 +02:00
< p > < code > > > > < / code > < code class = "blue" > #list< / code > < br >
< code class = "green" > 3< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< div class = "title" > Examples: Element insertion< / div >
< p > < code > > > > < / code > < code class = "blue" > "first" > > list< / code > < br >
< code class = "green" > ["first", "one", "six", "three"]< / code > < / p >
2024-05-10 06:39:48 +02:00
< / div >
2024-06-19 22:46:35 +02:00
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< p > < code > > > > < / code > < code class = "blue" > list < < "last"< / code > < br >
< code class = "green" > ["first", "one", "six", "three", "last"]< / code > < / p >
< / div >
< div class = "paragraph" >
< div class = "title" > Examples: Element in list< / div >
< p > < code > > > > < / code > < code class = "blue" > "six" in list< / code > < br >
< code class = "green" > true< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > "ten" in list< / code > < br >
< code class = "green" > false< / code > < / p >
< / div >
< div class = "paragraph" >
< div class = "title" > Examples: Concatenation and filtering< / div >
< p > < code > > > > < / code > < code class = "blue" > [1,2,3] + ["one", "two", "three"]< / code > < br >
< code class = "green" > [1, 2, 3, "one", "two", "three"]< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > [1,2,3,4] - [2,4]< / code > < br >
< code class = "green" > [1, 3]< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
2024-05-07 07:22:32 +02:00
< / div >
2024-05-17 07:31:13 +02:00
< div class = "sect2" >
< h3 id = "_dictionaries" > < a class = "anchor" href = "#_dictionaries" > < / a > < a class = "link" href = "#_dictionaries" > 2.5. Dictionaries< / a > < / h3 >
2024-05-20 06:59:49 +02:00
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< p > The < em > dictionary< / em > , or < em > dict< / em > , data-type represents sets of pairs < em > key/value< / em > . It is also known as < em > map< / em > or < em > associative array< / em > .< / p >
2024-05-09 07:20:22 +02:00
< / div >
2024-05-17 07:31:13 +02:00
< div class = "paragraph" >
2024-05-20 06:59:49 +02:00
< p > Dictionary literals are sequences of pairs separated by comma < code class = "blue" > ,< / code > enclosed between brace brackets.< / p >
2024-05-17 07:31:13 +02:00
< / div >
< div class = "exampleblock" >
2024-06-19 22:20:28 +02:00
< div class = "title" > Example 9. Dict literal syntax< / div >
2024-05-17 07:31:13 +02:00
< div class = "content" >
< div class = "paragraph" >
< p > < strong > < em > dict< / em > < / strong > = < em > empty-dict< / em > | < em > non-empty-dict< / em > < br >
< em > empty-dict< / em > = "< strong > {}< / strong > "< br >
2024-09-12 06:57:43 +02:00
< em > non-empty-dict< / em > = "< strong > {< / strong > " < em > key-scalar< / em > "< strong > :< / strong > " < em > any-value< / em > {"< strong > ,< / strong > " < em > key-scalar< / em > "< strong > :< / strong > " < em > any-value< / em > } "< strong > }< / strong > "< br > < / p >
2024-05-17 07:31:13 +02:00
< / div >
< / div >
< / div >
2024-06-19 22:46:35 +02:00
< div class = "exampleblock" >
< div class = "title" > Example 10. Item access syntax< / div >
< div class = "content" >
2024-05-17 07:31:13 +02:00
< div class = "paragraph" >
2024-06-19 22:46:35 +02:00
< p > < strong > < em > item< / em > < / strong > = < em > dict-expr< / em > "< strong > [< / strong > " < em > key-expr< / em > "< strong > ]< / strong > "< / p >
< / div >
< / div >
2024-05-17 07:31:13 +02:00
< / div >
2024-05-20 06:59:49 +02:00
< table class = "tableblock frame-all grid-all stretch" >
< caption class = "title" > Table 7. Dict operators< / caption >
< colgroup >
< col style = "width: 15.3846%;" >
< col style = "width: 15.3846%;" >
< col style = "width: 30.7692%;" >
< col style = "width: 38.4616%;" >
< / colgroup >
< thead >
< tr >
< th class = "tableblock halign-center valign-top" > Symbol< / th >
< th class = "tableblock halign-center valign-top" > Operation< / th >
< th class = "tableblock halign-left valign-top" > Description< / th >
< th class = "tableblock halign-left valign-top" > Examples< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Join< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Joins two dicts< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > {1:"one"}+{6:"six"}< / code > → < em > {1: "one", 6: "six"}< / em > < / p > < / td >
< / tr >
< tr >
2024-06-19 22:46:35 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > []< / code > < / p > < / td >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Dict item value< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Item value of given key< / p > < / td >
2024-06-19 22:46:35 +02:00
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > {"one":1, "two":2}["two"]< / code > → < em > 2< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > in< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Key in dict< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > True if key is in dict< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > "one" in {"one":1, "two":2}< / code > → < em > true< / em > < br >
< code class = "blue" > "six" in {"one":1, "two":2}< / code > → < em > false< / em > < / p > < / td >
< / tr >
2024-09-16 06:52:29 +02:00
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > #< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Size< / em > < / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Number of items in a dict< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < code class = "blue" > #{1:"a",2:"b",3:"c"}< / code > → < em > 3< / em > < / p > < / td >
< / tr >
2024-05-20 06:59:49 +02:00
< / tbody >
< / table >
2024-06-19 22:46:35 +02:00
< div class = "paragraph" >
< div class = "title" > Examples< / div >
< p > < code > > > > < / code > < code class = "blue" > {1:"one", 2:"two"}< / code > < br >
< code class = "green" > {1: "one", 2: "two"}< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > {"one":1, "two": 2}< / code > < br >
< code class = "green" > {"one": 1, "two": 2}< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > {"sum":1+2+3, "prod":1*2*3}< / code > < br >
< code class = "green" > {"sum": 6, "prod": 6}< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > {"one":1, "two":2}["two"]< / code > < br >
< code class = "green" > 2< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > d={"one":1, "two":2}; d["six"]=6; d< / code > < br >
< code class = "green" > {"two": 2, "one": 1, "six": 6}< / code > < / p >
< / div >
2024-09-16 06:52:29 +02:00
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > #d< / code > < br >
< code class = "green" > 3< / code > < / p >
< / div >
2024-05-17 07:31:13 +02:00
< / div >
2024-05-09 07:20:22 +02:00
< / div >
< / div >
< div class = "sect1" >
2024-06-19 09:38:02 +02:00
< h2 id = "_variables_2" > < a class = "anchor" href = "#_variables_2" > < / a > < a class = "link" href = "#_variables_2" > 3. Variables< / a > < / h2 >
2024-05-07 07:22:32 +02:00
< div class = "sectionbody" >
< div class = "paragraph" >
2024-05-20 06:59:49 +02:00
< p > < em > Expr< / em > , like most programming languages, supports variables. A variable is an identifier with an assigned value. Variables are stored in < em > contexts< / em > .< / p >
2024-05-07 07:22:32 +02:00
< / div >
2024-05-17 07:31:13 +02:00
< div class = "exampleblock" >
2024-06-19 22:46:35 +02:00
< div class = "title" > Example 11. Variable literal syntax< / div >
2024-05-07 07:22:32 +02:00
< div class = "content" >
2024-05-17 07:31:13 +02:00
< div class = "paragraph" >
< p > < strong > < em > variable< / em > < / strong > = < em > identifier< / em > "< strong > =< / strong > " < em > any-value< / em > < br >
< em > identifier< / em > = < em > alpha< / em > {(< em > alpha< / em > )|< em > dec-digit< / em > |"< strong > _< / strong > "}< br >
< em > alpha< / em > = "< strong > a< / strong > "|"< strong > b< / strong > "|… ​ "< strong > z< / strong > "|"< strong > A< / strong > "|"< strong > B< / strong > "|… ​ "< strong > Z< / strong > "< / p >
2024-05-07 07:22:32 +02:00
< / div >
< / div >
< / div >
2024-05-17 07:31:13 +02:00
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-note" title = "Note" > < / i >
< / td >
< td class = "content" >
The assign operator < code class = "blue" > =< / code > returns the value assigned to the variable.
< / td >
< / tr >
< / table >
< / div >
< div class = "paragraph" >
< div class = "title" > Examples< / div >
< p > < code > > > > < / code > < code class = "blue" > a=1< / code > < br >
2024-06-19 22:46:35 +02:00
< code class = "green" > 1< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > a_b=1+2< / code > < br >
2024-09-12 06:57:43 +02:00
< code class = "green" > 3< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > a_b< / code > < br >
< code class = "green" > 3< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< p > < code > > > > < / code > < code class = "blue" > x = 5.2 * (9-3)< / code > < em class = "gray" > // The assigned value here has the typical approximation error of the float data-type< / em > < br >
2024-06-19 22:46:35 +02:00
< code class = "green" > 31.200000000000003< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > x = 1; y = 2*x< / code > < br >
< code class = "green" > 2< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > _a=2< / code > < br >
< code class = "red" > Parse Error: [1:2] unexpected token "_"< / code > < / p >
2024-06-19 22:46:35 +02:00
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 1=2< / code > < br >
2024-05-17 07:31:13 +02:00
< code class = "red" > Parse Error: assign operator ("=") must be preceded by a variable< / code > < / p >
< / div >
< / div >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "sect1" >
2024-05-17 07:31:13 +02:00
< h2 id = "_other_operations" > < a class = "anchor" href = "#_other_operations" > < / a > < a class = "link" href = "#_other_operations" > 4. Other operations< / a > < / h2 >
2024-05-07 07:22:32 +02:00
< div class = "sectionbody" >
< div class = "sect2" >
2024-05-17 07:31:13 +02:00
< h3 id = "_operator" > < a class = "anchor" href = "#_operator" > < / a > < a class = "link" href = "#_operator" > 4.1. < code class = "blue" > ;< / code > operator< / a > < / h3 >
< div class = "paragraph" >
< p > The semicolon operator < code class = "blue" > ;< / code > is an infixed pseudo-operator. It evaluates the left expression first and then the right expression. The value of the latter is the final result.< / p >
< / div >
2024-06-21 09:06:25 +02:00
< div class = "exampleblock" >
2024-09-12 06:57:43 +02:00
< div class = "title" > Example 12. Multi-expression syntax< / div >
2024-06-21 09:06:25 +02:00
< div class = "content" >
< div class = "paragraph" >
< p > < strong > < em > multi-expression< / em > < / strong > = < em > expression< / em > {"< strong > ;< / strong > " < em > expression< / em > }< / p >
< / div >
< / div >
< / div >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > An expression that contains < code class = "blue" > ;< / code > is called a < em > multi-expression< / em > and each component expression is called a < em > sub-expression< / em > .< / p >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "admonitionblock important" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-important" title = "Important" > < / i >
< / td >
< td class = "content" >
Technically < code class = "blue" > ;< / code > is not treated as a real operator. It acts as a separator in lists of expressions.
< / td >
< / tr >
< / table >
< / div >
< div class = "admonitionblock tip" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-tip" title = "Tip" > < / i >
< / td >
< td class = "content" >
< code class = "blue" > ;< / code > can be used to set some variables before the final calculation.
< / td >
< / tr >
< / table >
< / div >
2024-05-17 07:31:13 +02:00
< div class = "paragraph" >
2024-05-07 07:22:32 +02:00
< div class = "title" > Example< / div >
2024-05-17 07:31:13 +02:00
< p > < code > > > > < / code > < code class = "blue" > a=1; b=2; c=3; a+b+c< / code > < br >
< code class = "green" > 6< / code > < / p >
2024-05-07 07:22:32 +02:00
< / div >
2024-05-17 07:31:13 +02:00
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > The value of each sub-expression is stored in the automatic variable < em > last< / em > .< / p >
2024-05-17 07:31:13 +02:00
< / div >
< div class = "paragraph" >
< div class = "title" > Example< / div >
< p > < code > > > > < / code > < code class = "blue" > 2+3; b=last+10; last< / code > < br >
< code class = "green" > 15< / code > < / p >
2024-05-07 07:22:32 +02:00
< / div >
< / div >
< div class = "sect2" >
2024-05-17 07:31:13 +02:00
< h3 id = "_but_operator" > < a class = "anchor" href = "#_but_operator" > < / a > < a class = "link" href = "#_but_operator" > 4.2. < code class = "blue" > but< / code > operator< / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2024-05-20 06:59:49 +02:00
< p > < code class = "blue" > but< / code > is an infixed operator. Its operands can be expressions of any type. It evaluates the left expression first, then the right expression. The value of the right expression is the final result.< / p >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "paragraph" >
2024-05-20 06:59:49 +02:00
< div class = "title" > Examples< / div >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > 5 but 2< / code > < br >
< code class = "green" > 2< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > x=2*3 but x-1< / code > < br >
2024-05-20 06:59:49 +02:00
< code class = "green" > 5< / code > .< / p >
< / div >
< div class = "paragraph" >
< p > < code class = "blue" > but< / code > behavior is very similar to < code class = "blue" > ;< / code > . The only difference is that < code class = "blue" > ;< / code > is not a true operator and can’ t be used inside parenthesis < code class = "blue" > (< / code > and < code class = "blue" > )< / code > .< / p >
2024-05-07 07:22:32 +02:00
< / div >
< / div >
< div class = "sect2" >
2024-05-17 07:31:13 +02:00
< h3 id = "_assignment_operator" > < a class = "anchor" href = "#_assignment_operator" > < / a > < a class = "link" href = "#_assignment_operator" > 4.3. Assignment operator < code class = "blue" > =< / code > < / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2024-05-20 06:59:49 +02:00
< p > The assignment operator < code class = "blue" > =< / code > is used to define variables or to change their value in the evaluation context (see < em > ExprContext< / em > ).< / p >
< / div >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > The value on the left side of < code class = "blue" > =< / code > must be a variable identifier or an expression that evalutes to a variable. The value on the right side can be any expression and it becomes the result of the assignment operation.< / p >
2024-05-07 07:22:32 +02:00
< / div >
2024-05-17 15:46:56 +02:00
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< div class = "title" > Examples< / div >
< p > < code > > > > < / code > < code class = "blue" > a=15+1< / code > < br >
2024-05-17 15:46:56 +02:00
< code class = "green" > 16< / code > < / p >
2024-05-07 07:22:32 +02:00
< / div >
2024-09-12 06:57:43 +02:00
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > L=[1,2,3]; L[1]=5; L< / code > < br >
< code class = "green" > [1, 5, 3]< / code > < / p >
< / div >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "sect2" >
2024-05-17 07:31:13 +02:00
< h3 id = "_selector_operator" > < a class = "anchor" href = "#_selector_operator" > < / a > < a class = "link" href = "#_selector_operator" > 4.4. Selector operator < code class = "blue" > ? : ::< / code > < / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
< p > The < em > selector operator< / em > is very similar to the < em > switch/case/default< / em > statement available in many programming languages.< / p >
< / div >
2024-09-12 06:57:43 +02:00
< div class = "exampleblock" >
< div class = "title" > Example 13. Selector literal Syntax< / div >
< div class = "content" >
2024-05-17 15:46:56 +02:00
< div class = "paragraph" >
< p > < em > selector-operator< / em > = < em > select-expression< / em > "< strong > ?< / strong > " < em > selector-case< / em > { "< strong > :< / strong > " < em > selector-case< / em > } ["< strong > ::< / strong > " < em > default-multi-expression< / em > ]< br >
< em > selector-case< / em > = [< em > match-list< / em > ] < em > case-value< / em > < br >
< em > match-list< / em > = "< strong > [< / strong > " < em > item< / em > {"< strong > ,< / strong > " < em > items< / em > } "< strong > ]< / strong > "< br >
< em > item< / em > = < em > expression< / em > < br >
< em > case-multi-expression< / em > = "< strong > {< / strong > " < em > multi-expression< / em > "< strong > }< / strong > "< br >
< em > multi-expression< / em > = < em > expression< / em > { "< strong > ;< / strong > " < em > expression< / em > }< br >
< em > default-multi-expression< / em > = < em > multi-expression< / em > < / p >
< / div >
2024-09-12 06:57:43 +02:00
< / div >
< / div >
2024-05-17 15:46:56 +02:00
< div class = "paragraph" >
< p > In other words, the selector operator evaluates the < em > select-expression< / em > on the left-hand side of the < code class = "blue" > ?< / code > symbol; it then compares the result obtained with the values listed in the < em > match-list< / em > 's, from left to right. If the comparision finds a match with a value in a < em > match-list< / em > , the associated < em > case-multi-expression< / em > is evaluted, and its result will be the final result of the selection operation.< / p >
2024-05-07 07:22:32 +02:00
< / div >
2024-05-17 15:46:56 +02:00
< div class = "paragraph" >
< p > The match lists are optional. In that case, the position, from left to right, of the < em > selector-case< / em > is used as < em > match-list< / em > . Of course, that only works if the < em > select-expression< / em > results in an integer.< / p >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "paragraph" >
2024-05-17 15:46:56 +02:00
< p > The < code class = "blue" > :< / code > symbol (colon) is the separator of the selector-cases. Note that if the value of the < em > select-expression< / em > does not match any < em > match-list< / em > , an error will be issued. Therefore, it is strongly recommended to provide a default (multi-)expression introduced by the < code class = "blue" > ::< / code > symbol (double-colon). Also note that the default expression has no < em > match-list< / em > .< / p >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "paragraph" >
2024-05-17 15:46:56 +02:00
< div class = "title" > Examples< / div >
< p > < code > > > > < / code > < code class = "blue" > 1 ? {"a"} : {"b"}< / code > < br >
2024-06-21 09:06:25 +02:00
< code class = "green" > b< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 10 ? {"a"} : {"b"} :: {"c"}< / code > < br >
< code class = "green" > c< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 10 ? {"a"} :[true, 2+8] {"b"} :: {"c"}< / code > < br >
< code class = "green" > b< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 10 ? {"a"} :[true, 2+8] {"b"} :: [10] {"c"}< / code > < br >
< code class = "red" > Parse Error: [1:34] case list in default clause< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 10 ? {"a"} :[10] {x="b" but x} :: {"c"}< / code > < br >
< code class = "green" > b< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 10 ? {"a"} :[10] {x="b"; x} :: {"c"}< / code > < br >
< code class = "green" > b< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > 10 ? {"a"} : {"b"}< / code > < br >
2024-05-17 15:46:56 +02:00
< code class = "red" > Eval Error: [1:3] no case catches the value (10) of the selection expression< / code > < / p >
< / div >
2024-05-07 07:22:32 +02:00
< / div >
2024-05-17 15:46:56 +02:00
< div class = "sect2" >
2024-09-16 06:52:29 +02:00
< h3 id = "_variable_default_value_and" > < a class = "anchor" href = "#_variable_default_value_and" > < / a > < a class = "link" href = "#_variable_default_value_and" > 4.5. Variable default value < code class = "blue" > ??< / code > , < code class = "blue" > ?=< / code > , and < code class = "blue" > ?!< / code > < / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< p > The left operand of first two operators, < code class = "blue" > ??< / code > and < code class = "blue" > ?=< / code > , must be a variable. The right operator can be any expression. They return the value of the variable if this is defined; otherwise they return the value of the right expression.< / p >
2024-05-07 07:22:32 +02:00
< / div >
2024-05-17 15:46:56 +02:00
< div class = "admonitionblock important" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-important" title = "Important" > < / i >
< / td >
< td class = "content" >
2024-06-21 09:06:25 +02:00
If the left variable is defined, the right expression is not evaluated at all.
2024-05-17 15:46:56 +02:00
< / td >
< / tr >
< / table >
< / div >
< div class = "paragraph" >
2024-06-21 09:06:25 +02:00
< p > The < code class = "blue" > ??< / code > operator do not change the status of the left variable.< / p >
2024-05-17 15:46:56 +02:00
< / div >
< div class = "paragraph" >
< p > The < code class = "blue" > ?=< / code > assigns the calculated value of the right expression to the left variable.< / p >
< / div >
< div class = "paragraph" >
2024-09-16 06:52:29 +02:00
< p > The third one, < code class = "blue" > ?!< / code > , is the alternate operator. If the variable on the left size is not defined, it returns < em class = "blue" > nil< / em > . Otherwise it returns the result of the expressione on the right side.< / p >
< / div >
< div class = "admonitionblock important" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-important" title = "Important" > < / i >
< / td >
< td class = "content" >
If the left variable is NOT defined, the right expression is not evaluated at all.
< / td >
< / tr >
< / table >
< / div >
< div class = "paragraph" >
2024-05-07 07:22:32 +02:00
< div class = "title" > Examples< / div >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > var ?? (1+2)< / code > < br >
< code class = "green" > 3< / code > < / p >
2024-06-21 09:06:25 +02:00
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > var< / code > < br >
< code class = "red" > Eval Error: undefined variable or function "var"< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > var ?= (1+2)< / code > < br >
< code class = "green" > 3< / code > < / p >
< / div >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > < code > > > > < / code > < code class = "blue" > var< / code > < br >
2024-05-17 15:46:56 +02:00
< code class = "green" > 3< / code > < / p >
2024-05-07 07:22:32 +02:00
< / div >
2024-09-18 20:48:12 +02:00
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > x ?! 5< / code > < br >
< code class = "green" > nil< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > x=1; x ?! 5< / code > < br >
< code class = "green" > 5< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < code class = "blue" > y ?! (c=5); c< / code > < br >
< code class = "red" > Eval Error: undefined variable or function "c"< / code > < / p >
< / div >
2024-05-17 15:46:56 +02:00
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-note" title = "Note" > < / i >
< / td >
< td class = "content" >
These operators have a high priority, in particular higher than the operator < code class = "blue" > =< / code > .
< / td >
< / tr >
< / table >
2024-05-07 07:22:32 +02:00
< / div >
< / div >
< / div >
< / div >
< div class = "sect1" >
2024-05-17 07:31:13 +02:00
< h2 id = "_priorities_of_operators" > < a class = "anchor" href = "#_priorities_of_operators" > < / a > < a class = "link" href = "#_priorities_of_operators" > 5. Priorities of operators< / a > < / h2 >
2024-05-07 07:22:32 +02:00
< div class = "sectionbody" >
< div class = "paragraph" >
< p > The table below shows all supported operators by decreasing priorities.< / p >
< / div >
< table class = "tableblock frame-all grid-all stretch" >
2024-05-20 06:59:49 +02:00
< caption class = "title" > Table 8. Operators priorities< / caption >
2024-05-07 07:22:32 +02:00
< colgroup >
2024-12-28 09:28:12 +01:00
< col style = "width: 16.6666%;" >
< col style = "width: 11.1111%;" >
< col style = "width: 11.1111%;" >
< col style = "width: 27.7777%;" >
< col style = "width: 33.3335%;" >
2024-05-07 07:22:32 +02:00
< / colgroup >
< thead >
< tr >
< th class = "tableblock halign-center valign-top" > Priority< / th >
2025-01-03 05:43:50 +01:00
< th class = "tableblock halign-center valign-top" > Operator< / th >
2024-05-07 07:22:32 +02:00
< th class = "tableblock halign-center valign-top" > Position< / th >
< th class = "tableblock halign-center valign-top" > Operation< / th >
< th class = "tableblock halign-center valign-top" > Operands and results< / th >
< / tr >
< / thead >
< tbody >
< tr >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-center valign-top" rowspan = "2" > < p class = "tableblock" > < strong > ITEM< / strong > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > [< / code > … ​ < code > ]< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Postfix< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > List item< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > list< / em > < code > [< / code > < em > integer< / em > < code > ]< / code > → < em > any< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< / tr >
< tr >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > [< / code > … ​ < code > ]< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Postfix< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Dict item< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > dict< / em > < code > [< / code > < em > any< / em > < code > ]< / code > → < em > any< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" rowspan = "2" > < p class = "tableblock" > < strong > INC< / strong > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ++< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Postfix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Post increment< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > integer-variable< / em > < code > ++< / code > → < em > integer< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ++< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Postfix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Next item< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > iterator< / em > < code > ++< / code > → < em > any< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2024-09-18 20:48:12 +02:00
< td class = "tableblock halign-center valign-top" rowspan = "3" > < p class = "tableblock" > < strong > DEFAULT< / strong > < / p > < / td >
2024-06-21 09:06:25 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ??< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Default value< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > variable< / em > < code > ??< / code > < em > any-expr< / em > → < em > any< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ?=< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Default/assign value< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > variable< / em > < code > ?=< / code > < em > any-expr< / em > → < em > any< / em > < / p > < / td >
< / tr >
< tr >
2024-09-18 20:48:12 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ?!< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Alternate value< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > variable< / em > < code > ?!< / code > < em > any-expr< / em > → < em > any< / em > < / p > < / td >
2024-06-21 09:06:25 +02:00
< / tr >
< tr >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < strong > FACT< / strong > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > !< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Postfix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Factorial< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > integer< / em > < code > !< / code > → < em > integer< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" rowspan = "3" > < p class = "tableblock" > < strong > SIGN< / strong > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +< / code > , < code class = "blue" > -< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Prefix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Change-sign< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > (< code > +< / code > |< code > -< / code > ) < em > number< / em > → < em > number< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > #< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Prefix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Lenght-of< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code > #< / code > < em > collection< / em > → < em > integer< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > #< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Prefix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Size-of< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code > #< / code > < em > iterator< / em > → < em > integer< / em > < / p > < / td >
< / tr >
< tr >
2025-01-03 05:43:50 +01:00
< td class = "tableblock halign-center valign-top" rowspan = "2" > < p class = "tableblock" > < strong > BIT SHIFT< / strong > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > < < < / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Left-Shift< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > integer< / em > < code > < < < / code > < em > integer< / em > → < em > integer< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > > > < / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Right-Shift< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > integer< / em > < code > > > < / code > < em > iterator< / em > → < em > integer< / em > < / p > < / td >
< / tr >
< tr >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" rowspan = "2" > < p class = "tableblock" > < strong > SELECT< / strong > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ? : ::< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Multi-Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Case-Selector< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > any-expr< / em > < code > ?< / code > < em > case-list< / em > < em > case-expr< / em > < code > :< / code > < em > case-list< / em > < em > case-expr< / em > … ​ < code > ::< / code > < em > default-expr< / em > → < em > any< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ? : ::< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Multi-Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Index-Selector< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > int-expr< / em > < code > ?< / code > < em > case-expr< / em > < code > :< / code > < em > case-expr< / em > … ​ < code > ::< / code > < em > default-expr< / em > → < em > any< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < strong > FRACT< / strong > < / p > < / td >
2024-12-25 07:43:06 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > :< / code > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Fraction< / em > < / p > < / td >
2024-12-25 07:43:06 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > integer< / em > < code > :< / code > < em > integer< / em > → < em > fraction< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2024-12-28 19:22:26 +01:00
< td class = "tableblock halign-center valign-top" rowspan = "7" > < p class = "tableblock" > < strong > PROD< / strong > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > *< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Product< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > number< / em > < code > *< / code > < em > number< / em > → < em > number< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > *< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > String-repeat< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > string< / em > < code > *< / code > < em > integer< / em > → < em > string< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > /< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Division< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > number< / em > < code > /< / code > < em > number< / em > → < em > number< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ./< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Float-division< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > number< / em > < code > ./< / code > < em > number< / em > → < em > float< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2024-12-28 19:22:26 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > /< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Split< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > string< / em > < code > /< / code > < em > string< / em > → < em > list< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > /< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Split< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > string< / em > < code > /< / code > integer → < em > list< / em > < / p > < / td >
< / tr >
< tr >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > %< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Integer-remainder< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > integer< / em > < code > %< / code > < em > integer< / em > → < em > integer< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-center valign-top" rowspan = "6" > < p class = "tableblock" > < strong > SUM< / strong > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Sum< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > number< / em > < code > +< / code > < em > number< / em > → < em > number< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > String-concat< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > (< em > string< / em > |< em > number< / em > ) < code > +< / code > (< em > string< / em > |< em > number< / em > ) → < em > string< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > List-join< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > list< / em > < code > +< / code > < em > list< / em > → < em > list< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Dict-join< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > dict< / em > < code > +< / code > < em > dict< / em > → < em > dict< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< / tr >
< tr >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > -< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Subtraction< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > number< / em > < code > -< / code > < em > number< / em > → < em > number< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > -< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > List-difference< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > list< / em > < code > -< / code > < em > list< / em > → < em > list< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2025-01-03 05:43:50 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < strong > BITWISE NOT< / strong > < / p > < / td >
2024-12-28 09:28:12 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ~< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Prefix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Binary Not< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code > ~< / code > < em > number< / em > → < em > number< / em > < / p > < / td >
< / tr >
< tr >
2025-01-03 05:43:50 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < strong > BITWISE AND< / strong > < / p > < / td >
2024-12-25 07:43:06 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > & < / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Binary And< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > number< / em > < code > & < / code > < em > number< / em > → < em > number< / em > < / p > < / td >
< / tr >
< tr >
2025-01-03 05:43:50 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < strong > BITWISE OR< / strong > < / p > < / td >
2024-12-25 07:43:06 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > |< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Binary Or< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > number< / em > < code > |< / code > < em > number< / em > → < em > number< / em > < / p > < / td >
< / tr >
< tr >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-center valign-top" rowspan = "8" > < p class = "tableblock" > < strong > RELATION< / strong > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > < < / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Less< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > comparable< / em > < code > < < / code > < em > comparable< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > < =< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > less-equal< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > comparable< / em > < code > < =< / code > < em > comparable< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > > < / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Greater< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > comparable< / em > < code > > < / code > < em > comparable< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > > =< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Greater-equal< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > comparable< / em > < code > > =< / code > < em > comparable< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ==< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Equal< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > comparable< / em > < code > ==< / code > < em > comparable< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > !=< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Not-equal< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > comparable< / em > < code > !=< / code > < em > comparable< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2024-05-20 06:59:49 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > in< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Member-of-list< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > any< / em > < code > in< / code > < em > list< / em > → < em > boolean< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > in< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Key-of-dict< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > any< / em > < code > in< / code > < em > dict< / em > → < em > boolean< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< / tr >
< tr >
2024-12-28 09:28:12 +01:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < strong > LOGIC NOT< / strong > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > not< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Prefix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Not< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code > not< / code > < em > boolean< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2024-12-28 09:28:12 +01:00
< td class = "tableblock halign-center valign-top" rowspan = "2" > < p class = "tableblock" > < strong > LOGIC AND< / strong > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > and< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > And< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > boolean< / em > < code > and< / code > < em > boolean< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > & & < / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > And< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > boolean< / em > < code > & & < / code > < em > boolean< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2024-12-28 09:28:12 +01:00
< td class = "tableblock halign-center valign-top" rowspan = "2" > < p class = "tableblock" > < strong > LOGIC OR< / strong > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > or< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Or< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > boolean< / em > < code > or< / code > < em > boolean< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > ||< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Or< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > boolean< / em > < code > ||< / code > < em > boolean< / em > → < em > boolean< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2024-12-28 09:28:12 +01:00
< td class = "tableblock halign-center valign-top" rowspan = "2" > < p class = "tableblock" > < strong > INSERT< / strong > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +> < / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Prepend< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > any< / em > < code > +> < / code > < em > list< / em > → < em > list< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > < +< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Append< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > list< / em > < code > < +< / code > < em > any< / em > → < em > list< / em > < / p > < / td >
< / tr >
< tr >
2025-01-03 05:43:50 +01:00
< td class = "tableblock halign-center valign-top" rowspan = "2" > < p class = "tableblock" > < strong > ASSIGN< / strong > < / p > < / td >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > =< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Assignment< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > identifier< / em > < code > =< / code > < em > any< / em > → < em > any< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< tr >
2025-01-03 05:43:50 +01:00
< td class = "tableblock halign-center valign-top" colspan = "4" > < p class = "tableblock" > < em > See also the special assignment operators table below< / em > < / p > < / td >
2024-05-20 06:59:49 +02:00
< / tr >
< tr >
2024-05-07 07:22:32 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < strong > BUT< / strong > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > but< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
2024-06-20 07:10:59 +02:00
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > But< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > any< / em > < code > but< / code > < em > any< / em > → < em > any< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < strong > RANGE< / strong > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > :< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Infix< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Index-range< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > integer< / em > < code > :< / code > < em > integer< / em > → < em > integer-pair< / em > < / p > < / td >
2024-05-07 07:22:32 +02:00
< / tr >
< / tbody >
< / table >
2025-01-03 05:43:50 +01:00
< table class = "tableblock frame-all grid-all stretch" >
< caption class = "title" > Table 9. Special assignment perators< / caption >
< colgroup >
< col style = "width: 14.2857%;" >
< col style = "width: 14.2857%;" >
< col style = "width: 28.5714%;" >
< col style = "width: 42.8572%;" >
< / colgroup >
< thead >
< tr >
< th class = "tableblock halign-center valign-top" > Priority< / th >
< th class = "tableblock halign-center valign-top" > Operator< / th >
< th class = "tableblock halign-center valign-top" > Operation< / th >
< th class = "tableblock halign-center valign-top" > Equivalent operation< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "tableblock halign-center valign-top" rowspan = "9" > < p class = "tableblock" > < strong > ASSIGN< / strong > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > +=< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Sum & Assign< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > var< / em > < code > +=< / code > < em > expr< / em > < br >
short for< br >
< em > var< / em > < code > =< / code > < em > value-of-var< / em > < code > +< / code > < em > expr< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > -=< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Subtract & Assign< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > var< / em > < code > -=< / code > < em > expr< / em > < br >
short for< br >
< em > var< / em > < code > =< / code > < em > value-of-var< / em > < code > -< / code > < em > expr< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > *=< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Multiply & Assign< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > var< / em > < code > *=< / code > < em > expr< / em > < br >
short for< br >
< em > var< / em > < code > =< / code > < em > value-of-var< / em > < code > *< / code > < em > expr< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > /=< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Divide & Assign< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > var< / em > < code > /=< / code > < em > expr< / em > < br >
short for< br >
< em > var< / em > < code > =< / code > < em > value-of-var< / em > < code > /< / code > < em > expr< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > %=< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Remainder & Assign< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > var< / em > < code > %=< / code > < em > expr< / em > < br >
short for< br >
< em > var< / em > < code > =< / code > < em > value-of-var< / em > < code > %< / code > < em > expr< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > & =< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Bitwise and & Assign< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > var< / em > < code > & =< / code > < em > expr< / em > < br >
short for< br >
< em > var< / em > < code > =< / code > < em > value-of-var< / em > < code > & < / code > < em > expr< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > |=< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Bitwise or & Assign< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > var< / em > < code > |=< / code > < em > expr< / em > < br >
short for< br >
< em > var< / em > < code > =< / code > < em > value-of-var< / em > < code > |< / code > < em > expr< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > < < =< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Left shift & Assign< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > var< / em > < code > < < =< / code > < em > expr< / em > < br >
short for< br >
< em > var< / em > < code > =< / code > < em > value-of-var< / em > < code > < < < / code > < em > expr< / em > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < code class = "blue" > > > =< / code > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > Right shift & Assign< / em > < / p > < / td >
< td class = "tableblock halign-center valign-top" > < p class = "tableblock" > < em > var< / em > < code > > > =< / code > < em > expr< / em > < br >
short for< br >
< em > var< / em > < code > =< / code > < em > value-of-var< / em > < code > > > < / code > < em > expr< / em > < / p > < / td >
< / tr >
< / tbody >
< / table >
2024-05-07 07:22:32 +02:00
< / div >
< / div >
< div class = "sect1" >
2024-05-17 07:31:13 +02:00
< h2 id = "_functions" > < a class = "anchor" href = "#_functions" > < / a > < a class = "link" href = "#_functions" > 6. Functions< / a > < / h2 >
2024-05-07 07:22:32 +02:00
< div class = "sectionbody" >
< div class = "paragraph" >
2024-09-12 06:57:43 +02:00
< p > Functions in < em > Expr< / em > are very similar to functions available in many programming languages. Currently, < em > Expr< / em > supports two types of function, < em > expr-functions< / em > and < em > go-functions< / em > .< / p >
2024-06-02 12:33:32 +02:00
< / div >
< div class = "ulist" >
< ul >
< li >
2024-06-03 06:27:14 +02:00
< p > < em > expr-functions< / em > are defined using < em > Expr< / em > 's syntax. They can be passed as arguments to other functions and can be returned from functions. Moreover, they bind themselves to the defining context, thus becoming closures.< / p >
2024-06-02 12:33:32 +02:00
< / li >
< li >
2024-09-12 06:57:43 +02:00
< p > < em > go-functions< / em > are regular Golang functions callable from < em > Expr< / em > expressions. They are defined in Golang source files called < em > modules< / em > and compiled within the < em > Expr< / em > package. To make Golang functions available in < em > Expr< / em > contextes, it is required to activate the builtin module or to load the plugin module in which they are defined.< / p >
2024-06-02 12:33:32 +02:00
< / li >
< / ul >
2024-05-07 07:22:32 +02:00
< / div >
2024-06-21 09:06:25 +02:00
< div class = "sect2" >
< h3 id = "_expr_function_definition" > < a class = "anchor" href = "#_expr_function_definition" > < / a > < a class = "link" href = "#_expr_function_definition" > 6.1. < em > Expr< / em > function definition< / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2024-09-18 20:48:12 +02:00
< p > A function is identified and referenced by its name. It can have zero or more parameter. < em > Expr< / em > functions also support optional parameters and passing paramters by name.< / p >
2024-06-21 09:06:25 +02:00
< / div >
< div class = "exampleblock" >
2024-09-12 06:57:43 +02:00
< div class = "title" > Example 14. Expr’ s function definition syntax< / div >
2024-06-21 09:06:25 +02:00
< div class = "content" >
< div class = "paragraph" >
2024-09-18 20:48:12 +02:00
< p > < strong > < em > function-definition< / em > < / strong > = < em > identifier< / em > "< strong > =< / strong > " "< strong > func(< / strong > " [< em > formal-param-list< / em > ] "< strong > )< / strong > " "< strong > {< / strong > " < em > multi-expression< / em > "< strong > }< / strong > "< br >
< em > formal-param_list< / em > = < em > required-param-list< / em > [ "< strong > ,< / strong > " < em > optional-param-list< / em > ]< br >
2024-09-12 06:57:43 +02:00
< em > required-param-list< / em > = < em > identifier< / em > { "< strong > ,< / strong > " < em > identifier< / em > }< br >
< em > optional-param-list< / em > = < em > optional-parm< / em > { "< strong > ,< / strong > " < em > optional-param< / em > }< br >
2024-09-18 20:48:12 +02:00
< em > optional-param< / em > = < em > param-name< / em > "< strong > =< / strong > " < em > any-expr< / em > < br >
< em > param-name< / em > = < em > identifier< / em > < / p >
2024-06-21 09:06:25 +02:00
< / div >
< / div >
< / div >
< div class = "paragraph" >
< div class = "title" > Examples< / div >
2024-09-18 20:48:12 +02:00
< p > < code > > > > < / code > < em class = "gray" > // A simple function: it takes two parameters and returns their "sum"< / em > < strong > < sup > (*)< / sup > < / strong > < br >
< code > > > > < / code > < code class = "blue" > sum = func(a, b){ a + b }< / code > < br >
< code class = "green" > sum(a, b):any{}< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < sup > (*)< / sup > Since the plus, *+*, operator is defined for multiple data-types, the < em > sum()< / em > function can be used for any pair of that types.< / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < em class = "gray" > // A more complex example: recursive calculation of the n-th value of Fibonacci’ s sequence< / em > < br >
< code > > > > < / code > < code class = "blue" > fib = func(n){ n ? [0] {0}: [1] {1} :: {fib(n-1)+fib(n-2)} }< / code > < br >
< code class = "green" > fib(n):any{}< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < em class = "gray" > // Same function fib() but entered by splitting it over mulple text lines< / em > < br >
< code > > > > < / code > < code class = "blue" > fib = func(n){ \< / code > < br >
< code > ...< / code > < code class = "blue" >     n ? \< / code > < br >
< code > ...< / code > < code class = "blue" >         [0] {0} : \< / code > < br >
< code > ...< / code > < code class = "blue" >         [1] {1} :: \< / code > < br >
< code > ...< / code > < code class = "blue" >         { \< / code > < br >
< code > ...< / code > < code class = "blue" >             fib(n-1) + fib(n-2) \< / code > < br >
< code > ...< / code > < code class = "blue" >         } \< / code > < br >
< code > ...< / code > < code class = "blue" > }< / code > < br >
< code class = "green" > fib(n):any{}< / code > < / p >
< / div >
< div class = "paragraph" >
< p > < code > > > > < / code > < em class = "gray" > // Required and optional parameters< / em > < br >
< code > > > > < / code > < code class = "blue" > measure = func(value, unit="meter"){ value + " " + unit + (value > 1) ? [true] {"s"} :: {""}}< / code > < br >
< code class = "green" > measure(value, unit="meter"):any{}< / code > < / p >
2024-06-21 09:06:25 +02:00
< / div >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "sect2" >
2024-06-21 09:06:25 +02:00
< h3 id = "_golang_function_definition" > < a class = "anchor" href = "#_golang_function_definition" > < / a > < a class = "link" href = "#_golang_function_definition" > 6.2. < em > Golang< / em > function definition< / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2025-01-03 05:43:50 +01:00
< p > Description of how to define Golang functions and how to bind them to < em > Expr< / em > are topics covered in another document that I’ ll write, one day, maybe.< / p >
2024-05-07 07:22:32 +02:00
< / div >
< / div >
< div class = "sect2" >
2024-06-21 09:06:25 +02:00
< h3 id = "_function_calls" > < a class = "anchor" href = "#_function_calls" > < / a > < a class = "link" href = "#_function_calls" > 6.3. Function calls< / a > < / h3 >
< div class = "paragraph" >
2024-09-18 20:48:12 +02:00
< p > To call a function, either Expr or Golang type, it is necessary to specify its name and, at least, its required parameters.< / p >
< / div >
< div class = "exampleblock" >
< div class = "title" > Example 15. Function invocation syntax< / div >
< div class = "content" >
< div class = "paragraph" >
< p > < strong > < em > function-call< / em > < / strong > = < em > identifier< / em > "< strong > (< / strong > " < em > actual-param-list< / em > "< strong > )< / strong > "< br >
< em > actual-param-list< / em > = [< em > positional-params< / em > ] [< em > named-parameters< / em > ]< br >
< em > positional-params< / em > = < em > any-value< / em > { "< strong > ,< / strong > " < em > any-value< / em > }< br >
< em > named-params< / em > = < em > param-name< / em > "< strong > =< / strong > " < em > any-value< / em > { "< strong > ,< / strong > " < em > param-name< / em > "< strong > =< / strong > " < em > any-value< / em > }< br >
< em > param-name< / em > = < em > identifier< / em > < / p >
< / div >
< / div >
< / div >
< div class = "paragraph" >
< div class = "title" > Examples of calling the < code > sum()< / code > functions defined above< / div >
< p > < code > > > > < / code > < em class = "gray" > // sum of two integers< / em > < br >
< code > > > > < / code > < code class = "blue" > sum(-6, 2)< / code > < br >
< code class = "green" > -4< / code > < br >
< code > > > > < / code > < em class = "gray" > // same as above but passing the parameters by name< / em > < br >
< code > > > > < / code > < code class = "blue" > sum(a=-6, b=2)< / code > < br >
< code class = "green" > -4< / code > < br >
< code > > > > < / code > < em class = "gray" > // again, but swapping parameter positions (see the diff() examples below)< / em > < br >
< code > > > > < / code > < code class = "blue" > sum(b=2, a=-6)< / code > < br >
< code class = "green" > -4< / code > < br >
< code > > > > < / code > < em class = "gray" > // sum of a fraction and an integer< / em > < br >
< code > > > > < / code > < code class = "blue" > sum(3|2, 2)< / code > < br >
< code class = "green" > 7|2< / code > < br >
< code > > > > < / code > < em class = "gray" > // sum of two strings< / em > < br >
< code > > > > < / code > < code class = "blue" > sum("bye", "-bye")< / code > < br >
< code class = "green" > "bye-bye"< / code > < br >
< code > > > > < / code > < em class = "gray" > // sum of two lists< / em > < br >
< code > > > > < / code > < code class = "blue" > sum(["one", 1], ["two", 2])< / code > < br >
< code class = "green" > ["one", 1, "two", 2]< / code > < / p >
< / div >
< div class = "paragraph" >
< div class = "title" > Examples of calling a function with parameters passed by name< / div >
< p > < code > > > > < / code > < em class = "gray" > // diff(a,b) calculates a-b< / em > < br >
< code > > > > < / code > < code class = "blue" > diff = func(a,b){a-b}< / code > < br >
< code class = "green" > diff(a, b):any{}< / code > < br >
< code > > > > < / code > < em class = "gray" > // simple invocation< / em > < br >
< code > > > > < / code > < code class = "blue" > diff(10,8)< / code > < br >
< code class = "green" > 2< / code > < br >
< code > > > > < / code > < em class = "gray" > // swapped parameters passed by name< / em > < br >
< code > > > > < / code > < code class = "blue" > diff(b=8,a=10)< / code > < br >
< code class = "green" > 2< / code > < / p >
< / div >
< div class = "paragraph" >
< div class = "title" > Examples of calling the < code > fib()< / code > function defined above< / div >
< p > < code > > > > < / code > < em class = "gray" > // Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … ​ < / em > < br >
< code > > > > < / code > < code class = "blue" > fib(6)< / code > < br >
< code class = "green" > 8< / code > < br >
< code > > > > < / code > < code class = "blue" > fib(9)< / code > < br >
< code class = "green" > 34< / code > < / p >
< / div >
< div class = "paragraph" >
< div class = "title" > Examples of calling the < code > measure()< / code > functions defined above< / div >
< p > < code > > > > < / code > < em class = "gray" > // simple call< / em > < br >
< code > > > > < / code > < code class = "blue" > measure(10,"litre")< / code > < br >
< code class = "green" > "10 litres"< / code > < br >
< code > > > > < / code > < em class = "gray" > // accept the default unit< / em > < br >
< code > > > > < / code > < code class = "blue" > measure(8)< / code > < br >
< code class = "green" > "8 meters"< / code > < br >
< code > > > > < / code > < em class = "gray" > // without the required parameter 'value'< / em > < br >
< code > > > > < / code > < code class = "blue" > measure(unit="degrees"))< / code > < br >
< code class = "red" > Eval Error: measure(): missing params  —   value< / code > < / p >
< / div >
< div class = "paragraph" >
< div class = "title" > Examples of context binding (closures)< / div >
< p > < code > > > > < / code > < code class = "blue" > factory = func(n=2){ func(x){x*n} }< / code > < br >
< code class = "green" > factory(n=2):any{}< / code > < br >
< code > > > > < / code > < code class = "blue" > double = factory()< / code > < br >
< code class = "green" > double(x):any{}< / code > < br >
< code > > > > < / code > < code class = "blue" > triple = factory(3)< / code > < br >
< code class = "green" > triple(x):any{}< / code > < br >
< code > > > > < / code > < code class = "blue" > double(5)< / code > < br >
< code class = "green" > 10< / code > < br >
< code > > > > < / code > < code class = "blue" > triple(5)< / code > < br >
< code class = "green" > 15< / code > < / p >
2024-06-21 09:06:25 +02:00
< / div >
2024-10-05 05:30:22 +02:00
< / div >
< div class = "sect2" >
< h3 id = "_function_context" > < a class = "anchor" href = "#_function_context" > < / a > < a class = "link" href = "#_function_context" > 6.4. Function context< / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
2024-10-05 05:30:22 +02:00
< p > Functions compute values in a local context (scope) that do not make effects on the calling context. This is the normal behavior. Using the < em > clone< / em > modifier < code class = "blue" > @< / code > it is possibile to export local definition to the calling context. The clone modifier must be used as prefix to variable names and it is part of the name. E.g. < code class = "blue" > @x< / code > is not the same as < code class = "blue" > x< / code > ; they are two different and un related variables.< / p >
< / div >
< div class = "paragraph" >
< p > Clone variables are normal local variables. The only diffence will appear when the defining function terminate, just before the destruction of its local context. At that point, all local clone variables are cloned in the calling context with the same names but the < code class = "blue" > @< / code > symbol.< / p >
< / div >
< div class = "paragraph" >
< div class = "title" > Example< / div >
< p > < code > > > > < / code > < code class = "blue" > f = func() { @x = 3; x = 5 }< / code > < em class = "gray" > // f() declares two < strong > different< / strong > local variables: < code > @x< / code > and < code > x< / code > < / em > < br >
< code class = "green" > f():any{}< / code > < br >
< code > > > > < / code > < code class = "blue" > f()< / code > < em class = "gray" > // The multi-expression (two) in f() is calculated and the last result is returned< / em > < br >
< code class = "green" > 5< / code > < br >
< code > > > > < / code > < code class = "blue" > x< / code > < em class = "gray" > // The < code > x< / code > variable was not defined in the main context before the f() invocation. It appears in the main context by cloning the < code > @x< / code > variable, local to f() after its termnation.< / em > < br >
< code class = "green" > 3< / code > < / p >
< / div >
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-note" title = "Note" > < / i >
< / td >
< td class = "content" >
The clone modifier < code class = "blue" > @< / code > does not make a variable a reference variable, as the ampersand character < code > & < / code > does in languages such as C and C++.
< / td >
< / tr >
< / table >
< / div >
< div class = "admonitionblock important" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-important" title = "Important" > < / i >
< / td >
< td class = "content" >
< div class = "paragraph" >
< p > The clone modifier can also be used to declare the formal parameters of functions, because they are local variables too.< / p >
< / div >
< div class = "paragraph" >
< div class = "title" > Example< / div >
< p > < code > > > > < / code > < code class = "blue" > g = func(@p) {2+@p}< / code >
g(@p):any{}`
< code > > > > < / code > < code class = "blue" > g(9)< / code >
11`
< code > > > > < / code > [blue]`p
9< / p >
< / div >
< / td >
< / tr >
< / table >
2024-05-07 07:22:32 +02:00
< / div >
< / div >
< / div >
< / div >
< div class = "sect1" >
2024-06-19 22:51:37 +02:00
< h2 id = "_iterators" > < a class = "anchor" href = "#_iterators" > < / a > < a class = "link" href = "#_iterators" > 7. Iterators< / a > < / h2 >
< div class = "sectionbody" >
< div class = "paragraph" >
< p > < mark > TODO: function calls operations< / mark > < / p >
< / div >
< / div >
< / div >
< div class = "sect1" >
< h2 id = "_builtins" > < a class = "anchor" href = "#_builtins" > < / a > < a class = "link" href = "#_builtins" > 8. Builtins< / a > < / h2 >
2024-05-07 07:22:32 +02:00
< div class = "sectionbody" >
< div class = "paragraph" >
< p > < mark > TODO: builtins< / mark > < / p >
< / div >
< div class = "sect2" >
2024-06-19 22:51:37 +02:00
< h3 id = "_builtin_functions" > < a class = "anchor" href = "#_builtin_functions" > < / a > < a class = "link" href = "#_builtin_functions" > 8.1. Builtin functions< / a > < / h3 >
2024-05-07 07:22:32 +02:00
< / div >
< div class = "sect2" >
2024-06-19 22:51:37 +02:00
< h3 id = "_import" > < a class = "anchor" href = "#_import" > < / a > < a class = "link" href = "#_import" > 8.2. < em class = "blue" > import()< / em > < / a > < / h3 >
2024-05-07 07:22:32 +02:00
< div class = "paragraph" >
< p > < em class = "blue" > import(< span class = "grey" > < source-file> < / span > )< / em > loads the multi-expression contained in the specified source and returns its value.< / p >
< / div >
< / div >
< / div >
< / div >
2024-06-19 22:51:37 +02:00
< div class = "sect1" >
< h2 id = "_plugins" > < a class = "anchor" href = "#_plugins" > < / a > < a class = "link" href = "#_plugins" > 9. Plugins< / a > < / h2 >
< div class = "sectionbody" >
< div class = "paragraph" >
< p > < mark > TODO: plugins< / mark > < / p >
< / div >
< / div >
< / div >
2024-05-07 07:22:32 +02:00
< / div >
< div id = "footer" >
< div id = "footer-text" >
2025-01-03 05:43:50 +01:00
Last updated 2025-01-03 05:42:18 +0100
2024-05-07 07:22:32 +02:00
< / div >
< / div >
< / body >
< / html >