1118 lines
95 KiB
HTML
1118 lines
95 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>The ultimate introduction</title>
|
|
<meta name="copyright"
|
|
content="Copyright © 2015 Andreas Rumpf" />
|
|
<link rel="stylesheet" type="text/css" media="screen, projection, print"
|
|
href="Slidy2/styles/slidy.css" />
|
|
<script src="Slidy2/scripts/slidy.js"
|
|
charset="utf-8" type="text/javascript"></script>
|
|
<style type="text/css">
|
|
|
|
span.DecNumber {color: blue}
|
|
span.BinNumber {color: blue}
|
|
span.HexNumber {color: blue}
|
|
span.OctNumber {color: blue}
|
|
span.FloatNumber {color: blue}
|
|
span.Identifier {color: black}
|
|
span.Keyword {font-weight: bold}
|
|
span.StringLit {color: blue}
|
|
span.LongStringLit {color: blue}
|
|
span.CharLit {color: blue}
|
|
span.EscapeSequence {color: black}
|
|
span.Operator {color: black}
|
|
span.Punctation {color: black}
|
|
span.Comment, span.LongComment {font-style:italic; color: green}
|
|
span.RegularExpression {color: DarkViolet}
|
|
span.TagStart {color: DarkViolet}
|
|
span.TagEnd {color: DarkViolet}
|
|
span.Key {color: blue}
|
|
span.Value {color: black}
|
|
span.RawData {color: blue}
|
|
span.Assembler {color: blue}
|
|
span.Preprocessor {color: DarkViolet}
|
|
span.Directive {color: DarkViolet}
|
|
span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference,
|
|
span.Other {color: black}
|
|
|
|
div.navigation {
|
|
-moz-border-radius: 5px 5px 5px 5px;
|
|
float: left;
|
|
width: 30%;
|
|
margin: 0; padding: 0;
|
|
border: 3px outset #7F7F7F;
|
|
background-color: #7F7F7F;
|
|
}
|
|
|
|
div.navigation ul {
|
|
list-style-type: none;
|
|
padding-left: 1em;
|
|
}
|
|
div.navigation ul li a, div.navigation ul li a:visited {
|
|
font-weight: bold;
|
|
color: #FFFFFF;
|
|
text-decoration: none;
|
|
}
|
|
div.navigation ul li a:hover {
|
|
font-weight: bold;
|
|
text-decoration: none;
|
|
color: gold;
|
|
}
|
|
|
|
div.content {
|
|
margin-left: 30%;
|
|
padding: 0 1em;
|
|
border-left: 4em;
|
|
}
|
|
|
|
dl.item dd, dl.item dd p {
|
|
margin-top:3px;
|
|
}
|
|
dl.item dd pre {
|
|
margin-left: 15pt;
|
|
border: 0px;
|
|
}
|
|
dl.item dt, dl.item dt pre {
|
|
margin: 20pt 0 0 5pt;
|
|
}
|
|
|
|
pre, span.tok {
|
|
background-color: #F9F9F9;
|
|
border-color: #C4C4C4;
|
|
border-style: solid;
|
|
border-width: 1px 1px 1px 2px;
|
|
color: black;
|
|
line-spacing: 110%;
|
|
font-weight: normal;
|
|
padding: 2px;
|
|
}
|
|
|
|
span.red {
|
|
color: #A80000;
|
|
}
|
|
|
|
hr {background-color:#9D9D9D; border:0 none; color:#9D9D9D; height:1px; width:100%;}
|
|
|
|
/*
|
|
:Author: David Goodger
|
|
:Contact: goodger@python.org
|
|
:Date: Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006)
|
|
:Revision: Revision: 4564
|
|
:Copyright: This stylesheet has been placed in the public domain.
|
|
|
|
Default cascading style sheet for the HTML output of Docutils.
|
|
|
|
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
|
customize this style sheet.
|
|
*/
|
|
/* used to remove borders from tables and images */
|
|
.borderless, table.borderless td, table.borderless th { border: 0 }
|
|
|
|
table.borderless td, table.borderless th {
|
|
/* Override padding for "table.docutils td" with "! important".
|
|
The right padding separates the table cells. */
|
|
padding: 0 0.5em 0 0 ! important }
|
|
|
|
.first { margin-top: 0 ! important }
|
|
.last, .with-subtitle { margin-bottom: 0 ! important }
|
|
.hidden { display: none }
|
|
a.toc-backref { text-decoration: none ; color: black }
|
|
blockquote.epigraph { margin: 2em 5em ; }
|
|
dl.docutils dd { margin-bottom: 0.5em }
|
|
div.abstract { margin: 2em 5em }
|
|
div.abstract p.topic-title { font-weight: bold ; text-align: center }
|
|
div.admonition, div.attention, div.caution, div.danger, div.error,
|
|
div.hint, div.important, div.note, div.tip, div.warning {
|
|
margin: 2em ; border: medium outset ; padding: 1em }
|
|
div.admonition p.admonition-title, div.hint p.admonition-title,
|
|
div.important p.admonition-title, div.note p.admonition-title,
|
|
div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif }
|
|
|
|
div.attention p.admonition-title, div.caution p.admonition-title,
|
|
div.danger p.admonition-title, div.error p.admonition-title,
|
|
div.warning p.admonition-title { color: red ; font-weight: bold ;
|
|
font-family: sans-serif }
|
|
|
|
/* Uncomment (and remove this text!) to get reduced vertical space in
|
|
compound paragraphs.
|
|
div.compound .compound-first, div.compound .compound-middle {
|
|
margin-bottom: 0.5em }
|
|
|
|
div.compound .compound-last, div.compound .compound-middle {
|
|
margin-top: 0.5em }
|
|
*/
|
|
|
|
div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic }
|
|
div.dedication p.topic-title { font-weight: bold ; font-style: normal }
|
|
div.figure { margin-left: 2em ; margin-right: 2em }
|
|
div.footer, div.header { clear: both; font-size: smaller }
|
|
div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em }
|
|
div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ;
|
|
margin-left: 1.5em }
|
|
div.sidebar { margin-left: 1em ; border: medium outset ;
|
|
padding: 1em ; background-color: #ffffee ; /*width: 40% ;*/ float: right ;
|
|
clear: right }
|
|
|
|
div.sidebar p.rubric { font-family: sans-serif ; font-size: medium }
|
|
div.system-messages { margin: 5em }
|
|
div.system-messages h1 { color: red }
|
|
div.system-message { border: medium outset ; padding: 1em }
|
|
div.system-message p.system-message-title { color: red ; font-weight: bold }
|
|
div.topic { margin: 2em;}
|
|
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
|
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
|
margin-top: 0.4em }
|
|
h1.title { text-align: center }
|
|
h2.subtitle { text-align: center }
|
|
/* hr.docutils { width: 75% } */
|
|
img.align-left { clear: left }
|
|
img.align-right { clear: right }
|
|
ol.simple, ul.simple { margin-bottom: 1em }
|
|
ol.arabic { list-style: decimal }
|
|
ol.loweralpha { list-style: lower-alpha }
|
|
ol.upperalpha { list-style: upper-alpha }
|
|
ol.lowerroman { list-style: lower-roman }
|
|
ol.upperroman { list-style: upper-roman }
|
|
p.attribution { text-align: right ; margin-left: 50% }
|
|
p.caption { font-style: italic }
|
|
p.credits { font-style: italic ; font-size: smaller }
|
|
p.label { white-space: nowrap }
|
|
p.rubric { font-weight:bold;font-size:larger;color:maroon;text-align:center}
|
|
p.sidebar-title {font-family: sans-serif ;font-weight: bold ;font-size: larger }
|
|
p.sidebar-subtitle {font-family: sans-serif ; font-weight: bold }
|
|
p.topic-title {
|
|
font-weight: bold;
|
|
background-color: #6D6D6D;
|
|
border-bottom: 1px solid #000000;
|
|
border-top: 1px solid black;
|
|
color: white;
|
|
text-align: center;
|
|
margin: 0;
|
|
}
|
|
pre.address { margin-bottom: 0;margin-top:0;font-family:serif;font-size:100% }
|
|
pre.literal-block, pre.doctest-block {margin-left: 2em ;margin-right: 2em }
|
|
span.classifier {font-family: sans-serif;font-style: oblique }
|
|
span.classifier-delimiter {font-family: sans-serif;font-weight: bold }
|
|
span.interpreted {font-family: sans-serif }
|
|
span.option {white-space: nowrap }
|
|
span.pre {white-space: pre }
|
|
span.problematic {color: red }
|
|
span.section-subtitle {
|
|
/* font-size relative to parent (h1..h6 element) */
|
|
font-size: 80% }
|
|
|
|
table.citation { border-left: solid 1px gray; margin-left: 1px }
|
|
table.docinfo {margin: 2em 4em }
|
|
table.docutils {margin-top: 0.5em;margin-bottom: 0.5em; border: 0 solid #9d9d9d; border-collapse: collapse; }
|
|
table.footnote {border-left: solid 1px black;margin-left: 1px }
|
|
|
|
table.docutils td, table.docutils th,
|
|
table.docinfo td, table.docinfo th {padding-left: 0.5em;padding-right: 0.5em;
|
|
vertical-align: top;}
|
|
|
|
table.docutils td, table.docutils th { border-bottom:1px solid #9D9D9D; }
|
|
/* color: #4d4d4d} */
|
|
|
|
/* table.docutils td:hover, table.docinfo td:hover {color: #000000} */
|
|
|
|
|
|
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
|
font-weight: bold;text-align: left;white-space: nowrap;padding-left: 0 }
|
|
|
|
table.docutils th
|
|
{
|
|
color: black;
|
|
font-weight:normal;
|
|
background-color: #E3E3E3;
|
|
border-top: 1px solid #1d1d1d;
|
|
border-bottom: 1px solid #1d1d1d;
|
|
}
|
|
|
|
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
|
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {font-size: 100% }
|
|
ul.auto-toc { list-style-type: none }
|
|
/*a.reference { color: #E00000; font-weight:bold;}
|
|
a.reference:hover {color: #E00000;background-color: #ffff00;display: margin;
|
|
font-weight:bold;}*/
|
|
|
|
p.pic {
|
|
width: 1040px;
|
|
margin: 0 auto;
|
|
}
|
|
|
|
</style>
|
|
|
|
<link rel="stylesheet" type="text/css" media="screen, projection, print"
|
|
href="Slidy2/styles/w3c-blue.css" />
|
|
|
|
</head>
|
|
<body>
|
|
<div class="background">
|
|
<img id="head-icon" alt="Nimrod logo"
|
|
src="logo2.png" />
|
|
</div>
|
|
|
|
<div class="slide">
|
|
<h1 class="title">The ultimate introduction</h1>
|
|
<br />
|
|
<br />
|
|
<br />
|
|
<br />
|
|
<br />
|
|
<br />
|
|
<br />
|
|
<br />
|
|
<center><big><big>Slides</big></big></center>
|
|
<br />
|
|
<center><big><big><big><big>git clone https://github.com/Araq/oscon2015</big></big></big></big></center>
|
|
<br />
|
|
<br />
|
|
<br />
|
|
<center><big><big>Download</big></big></center>
|
|
<br />
|
|
<center><big><big><big><big><a href="http://nim-lang.org/download.html">http://nim-lang.org/download.html</a></big></big></big></big></center>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="installation">Installation</h1><pre>git clone -b devel git://github.com/nim-lang/Nim.git
|
|
cd Nim
|
|
git clone -b devel --depth 1 git://github.com/nim-lang/csources
|
|
cd csources && sh build.sh
|
|
cd ..
|
|
bin/nim c koch
|
|
./koch boot -d:release</pre>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="what-is-nim">What is Nim?</h1><ul class="simple"><li>new <strong>systems</strong> programming language</li>
|
|
<li>compiles to C</li>
|
|
<li>garbage collection + manual memory management</li>
|
|
<li>thread local garbage collection</li>
|
|
<li>design goals: efficient, expressive, elegant</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="philosophy">Philosophy</h1><ul class="simple"><li>power</li>
|
|
<li>efficiency</li>
|
|
<li>fun</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="why-nim">Why Nim?</h1><ul class="simple"><li>Major influences: Modula 3, Delphi, Ada, C++, Python, Lisp, Oberon.</li>
|
|
<li>Development started in 2006</li>
|
|
<li>First successful bootstrapping in 2008<ul class="simple"><li>compiler written in Delphi</li>
|
|
<li>converted to Nim via "pas2nim"</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="uses-of-nim">Uses of Nim</h1><ul class="simple"><li>games</li>
|
|
<li>compilers</li>
|
|
<li>operating system development</li>
|
|
<li>scientific computing</li>
|
|
<li>scripting</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="nim-at-3dicc">Nim at 3dicc</h1><img src="busyteam2.png" />
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="urls">URLs</h1><table border="1" class="docutils"><tr><td>Website</td><td><a class="reference external" href="http://nim-lang.org">http://nim-lang.org</a></td></tr>
|
|
<tr><td>Mailing list</td><td><a class="reference external" href="http://www.freelists.org/list/nim-dev">http://www.freelists.org/list/nim-dev</a></td></tr>
|
|
<tr><td>Forum</td><td><a class="reference external" href="http://forum.nim-lang.org">http://forum.nim-lang.org</a></td></tr>
|
|
<tr><td>Github</td><td><a class="reference external" href="https://github.com/Araq/Nim">https://github.com/Araq/Nim</a></td></tr>
|
|
<tr><td>IRC</td><td>irc.freenode.net/nim</td></tr>
|
|
</table>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="hello-world">Hello World</h1><pre id="listing_1" class="listing"><span class="Identifier">echo</span> <span class="StringLit">"hello world!"</span></pre>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="hello-world">Hello World</h1><pre id="listing_2" class="listing"><span class="Identifier">echo</span> <span class="StringLit">"hello world!"</span></pre><pre>nim c -r hello.nim</pre>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="more-code">More Code!</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
15
|
|
</pre></td><td><pre id="listing_3" class="listing"><span class="Keyword">proc</span> <span class="Identifier">decimalToRoman</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">number</span><span class="Punctuation">:</span> <span class="Identifier">range</span><span class="Punctuation">[</span><span class="FloatNumber">1.</span><span class="Operator">.</span><span class="DecNumber">3_999</span><span class="Punctuation">]</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">string</span> <span class="Operator">=</span>
|
|
<span class="Comment">## Converts a number to a Roman numeral.</span>
|
|
<span class="Keyword">const</span> <span class="Identifier">romanComposites</span> <span class="Operator">=</span> <span class="Punctuation">{</span>
|
|
<span class="StringLit">"M"</span><span class="Punctuation">:</span> <span class="DecNumber">1000</span><span class="Punctuation">,</span> <span class="StringLit">"CM"</span><span class="Punctuation">:</span> <span class="DecNumber">900</span><span class="Punctuation">,</span>
|
|
<span class="StringLit">"D"</span><span class="Punctuation">:</span> <span class="DecNumber">500</span><span class="Punctuation">,</span> <span class="StringLit">"CD"</span><span class="Punctuation">:</span> <span class="DecNumber">400</span><span class="Punctuation">,</span> <span class="StringLit">"C"</span><span class="Punctuation">:</span> <span class="DecNumber">100</span><span class="Punctuation">,</span>
|
|
<span class="StringLit">"XC"</span><span class="Punctuation">:</span> <span class="DecNumber">90</span><span class="Punctuation">,</span> <span class="StringLit">"L"</span><span class="Punctuation">:</span> <span class="DecNumber">50</span><span class="Punctuation">,</span> <span class="StringLit">"XL"</span><span class="Punctuation">:</span> <span class="DecNumber">40</span><span class="Punctuation">,</span> <span class="StringLit">"X"</span><span class="Punctuation">:</span> <span class="DecNumber">10</span><span class="Punctuation">,</span> <span class="StringLit">"IX"</span><span class="Punctuation">:</span> <span class="DecNumber">9</span><span class="Punctuation">,</span>
|
|
<span class="StringLit">"V"</span><span class="Punctuation">:</span> <span class="DecNumber">5</span><span class="Punctuation">,</span> <span class="StringLit">"IV"</span><span class="Punctuation">:</span> <span class="DecNumber">4</span><span class="Punctuation">,</span> <span class="StringLit">"I"</span><span class="Punctuation">:</span> <span class="DecNumber">1</span><span class="Punctuation">}</span>
|
|
<span class="Identifier">result</span> <span class="Operator">=</span> <span class="StringLit">""</span>
|
|
<span class="Keyword">var</span> <span class="Identifier">decVal</span> <span class="Operator">=</span> <span class="Identifier">number</span><span class="Operator">.</span><span class="Identifier">int</span>
|
|
<span class="Keyword">for</span> <span class="Identifier">key</span><span class="Punctuation">,</span> <span class="Identifier">val</span> <span class="Keyword">in</span> <span class="Identifier">items</span><span class="Punctuation">(</span><span class="Identifier">romanComposites</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">while</span> <span class="Identifier">decVal</span> <span class="Operator">>=</span> <span class="Identifier">val</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">decVal</span> <span class="Operator">-=</span> <span class="Identifier">val</span>
|
|
<span class="Identifier">result</span><span class="Operator">.</span><span class="Identifier">add</span><span class="Punctuation">(</span><span class="Identifier">key</span><span class="Punctuation">)</span>
|
|
|
|
<span class="Identifier">echo</span> <span class="Identifier">decimalToRoman</span><span class="Punctuation">(</span><span class="DecNumber">1009</span><span class="Punctuation">)</span> <span class="Comment"># MIX</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_3')">Select</button><ul class="simple"><li><tt class="docutils literal"><span class="pre">{"M": 1000, "CM": 900}</span></tt> sugar for <tt class="docutils literal"><span class="pre">[("M": 1000), ("CM": 900)]</span></tt></li>
|
|
<li><tt class="docutils literal"><span class="pre">result</span></tt> implicitly available</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="nimble">Nimble</h1><ul class="simple"><li>Live demo.</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="function-application">Function application</h1><p>Function application is <tt class="docutils literal"><span class="pre">f()</span></tt>, <tt class="docutils literal"><span class="pre">f(a)</span></tt>, <tt class="docutils literal"><span class="pre">f(a, b)</span></tt>.</p>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="function-application">Function application</h1><p>Function application is <tt class="docutils literal"><span class="pre">f()</span></tt>, <tt class="docutils literal"><span class="pre">f(a)</span></tt>, <tt class="docutils literal"><span class="pre">f(a, b)</span></tt>.</p>
|
|
<p>And here is the sugar:</p>
|
|
<table border="1" class="docutils"><tr><th>Sugar</th><th>Meaning</th><th>Example</th></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">f a</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a)</span></tt></td><td><tt class="docutils literal"><span class="pre">spawn log("some message")</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">a.f()</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a)</span></tt></td><td><tt class="docutils literal"><span class="pre">db.fetchRow()</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">a.f</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a)</span></tt></td><td><tt class="docutils literal"><span class="pre">mystring.len</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">f a, b</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a, b)</span></tt></td><td><tt class="docutils literal"><span class="pre">echo "hello ", "world"</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">a.f(b)</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a, b)</span></tt></td><td><tt class="docutils literal"><span class="pre">myarray.map(f)</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">a.f b</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a, b)</span></tt></td><td><tt class="docutils literal"><span class="pre">db.fetchRow 1</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">f"\n"</span></tt></td><td><tt class="docutils literal"><span class="pre">f(r"\n")</span></tt></td><td><tt class="docutils literal"><span class="pre">re"\b[a-z*]\b"</span></tt></td></tr>
|
|
</table>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="function-application">Function application</h1><p>Function application is <tt class="docutils literal"><span class="pre">f()</span></tt>, <tt class="docutils literal"><span class="pre">f(a)</span></tt>, <tt class="docutils literal"><span class="pre">f(a, b)</span></tt>.</p>
|
|
<p>And here is the sugar:</p>
|
|
<table border="1" class="docutils"><tr><th>Sugar</th><th>Meaning</th><th>Example</th></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">f a</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a)</span></tt></td><td><tt class="docutils literal"><span class="pre">spawn log("some message")</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">a.f()</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a)</span></tt></td><td><tt class="docutils literal"><span class="pre">db.fetchRow()</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">a.f</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a)</span></tt></td><td><tt class="docutils literal"><span class="pre">mystring.len</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">f a, b</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a, b)</span></tt></td><td><tt class="docutils literal"><span class="pre">echo "hello ", "world"</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">a.f(b)</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a, b)</span></tt></td><td><tt class="docutils literal"><span class="pre">myarray.map(f)</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">a.f b</span></tt></td><td><tt class="docutils literal"><span class="pre">f(a, b)</span></tt></td><td><tt class="docutils literal"><span class="pre">db.fetchRow 1</span></tt></td></tr>
|
|
<tr><td><tt class="docutils literal"><span class="pre">f"\n"</span></tt></td><td><tt class="docutils literal"><span class="pre">f(r"\n")</span></tt></td><td><tt class="docutils literal"><span class="pre">re"\b[a-z*]\b"</span></tt></td></tr>
|
|
</table><p><strong>BUT</strong>: <tt class="docutils literal"><span class="pre">f</span></tt> does not mean <tt class="docutils literal"><span class="pre">f()</span></tt>; <tt class="docutils literal"><span class="pre">myarray.map(f)</span></tt> passes <tt class="docutils literal"><span class="pre">f</span></tt> to <tt class="docutils literal"><span class="pre">map</span></tt></p>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="operators">Operators</h1><ul class="simple"><li>operators are simply sugar for functions</li>
|
|
<li>operator in backticks is treated like an identifier<pre>`@`(x, y)
|
|
x.`@`(y)
|
|
`@`(x)
|
|
x.`@`()
|
|
x.`@`</pre>
|
|
</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="operators">Operators</h1><ul class="simple"><li>Of course, most of the time binary operators are simply invoked as <tt class="docutils literal"><span class="pre">x @ y</span></tt> and unary operators as <tt class="docutils literal"><span class="pre">@x</span></tt>.</li>
|
|
<li>No explicit distinction between binary and unary operators:</li>
|
|
</ul>
|
|
<pre id="listing_4" class="listing"><span class="Keyword">proc</span> <span class="Punctuation">`</span><span class="Operator">++</span><span class="Punctuation">`</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">int</span><span class="Punctuation">;</span> <span class="Identifier">y</span><span class="Punctuation">:</span> <span class="Identifier">int</span> <span class="Operator">=</span> <span class="DecNumber">1</span><span class="Punctuation">;</span> <span class="Identifier">z</span><span class="Punctuation">:</span> <span class="Identifier">int</span> <span class="Operator">=</span> <span class="DecNumber">0</span><span class="Punctuation">)</span> <span class="Operator">=</span>
|
|
<span class="Identifier">x</span> <span class="Operator">=</span> <span class="Identifier">x</span> <span class="Operator">+</span> <span class="Identifier">y</span> <span class="Operator">+</span> <span class="Identifier">z</span>
|
|
|
|
<span class="Keyword">var</span> <span class="Identifier">g</span> <span class="Operator">=</span> <span class="DecNumber">70</span>
|
|
<span class="Operator">++</span><span class="Identifier">g</span>
|
|
<span class="Identifier">g</span> <span class="Operator">++</span> <span class="DecNumber">7</span>
|
|
<span class="Identifier">g</span><span class="Operator">.</span><span class="Punctuation">`</span><span class="Operator">++</span><span class="Punctuation">`</span><span class="Punctuation">(</span><span class="DecNumber">10</span><span class="Punctuation">,</span> <span class="DecNumber">20</span><span class="Punctuation">)</span>
|
|
<span class="Identifier">echo</span> <span class="Identifier">g</span> <span class="Comment"># writes 108</span></pre><ul class="simple"><li>parameters are readonly unless declared as <tt class="docutils literal"><span class="pre">var</span></tt></li>
|
|
<li><tt class="docutils literal"><span class="pre">var</span></tt> means "pass by reference" (implemented with a hidden pointer)</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="control-flow">Control flow</h1><ul class="simple"><li>The usual control flow statements are available:<ul class="simple"><li>if</li>
|
|
<li>case</li>
|
|
<li>when</li>
|
|
<li>while</li>
|
|
<li>for</li>
|
|
<li>try</li>
|
|
<li>defer</li>
|
|
<li>return</li>
|
|
<li>yield</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="if-vs-when">If vs when</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
</pre></td><td><pre id="listing_5" class="listing"><span class="Keyword">when</span> <span class="Identifier">defined</span><span class="Punctuation">(</span><span class="Identifier">posix</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">proc</span> <span class="Identifier">getCreationTime</span><span class="Punctuation">(</span><span class="Identifier">file</span><span class="Punctuation">:</span> <span class="Identifier">string</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">Time</span> <span class="Operator">=</span>
|
|
<span class="Keyword">var</span> <span class="Identifier">res</span><span class="Punctuation">:</span> <span class="Identifier">Stat</span>
|
|
<span class="Keyword">if</span> <span class="Identifier">stat</span><span class="Punctuation">(</span><span class="Identifier">file</span><span class="Punctuation">,</span> <span class="Identifier">res</span><span class="Punctuation">)</span> <span class="Operator"><</span> <span class="DecNumber">0'i32</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">let</span> <span class="Identifier">error</span> <span class="Operator">=</span> <span class="Identifier">osLastError</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
|
|
<span class="Identifier">raiseOSError</span><span class="Punctuation">(</span><span class="Identifier">error</span><span class="Punctuation">)</span>
|
|
<span class="Keyword">return</span> <span class="Identifier">res</span><span class="Operator">.</span><span class="Identifier">st_ctime</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_5')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="statements-vs-expressions">Statements vs expressions</h1><p>Statements require indentation:</p>
|
|
<pre id="listing_6" class="listing"><span class="Comment"># no indentation needed for single assignment statement:</span>
|
|
<span class="Keyword">if</span> <span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">x</span> <span class="Operator">=</span> <span class="Identifier">false</span>
|
|
|
|
<span class="Comment"># indentation needed for nested if statement:</span>
|
|
<span class="Keyword">if</span> <span class="Identifier">x</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">if</span> <span class="Identifier">y</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">y</span> <span class="Operator">=</span> <span class="Identifier">false</span>
|
|
<span class="Keyword">else</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">y</span> <span class="Operator">=</span> <span class="Identifier">true</span>
|
|
|
|
<span class="Comment"># indentation needed, because two statements follow the condition:</span>
|
|
<span class="Keyword">if</span> <span class="Identifier">x</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">x</span> <span class="Operator">=</span> <span class="Identifier">false</span>
|
|
<span class="Identifier">y</span> <span class="Operator">=</span> <span class="Identifier">false</span></pre>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="statements-vs-expressions">Statements vs expressions</h1><p>Expressions do not:</p>
|
|
<pre id="listing_7" class="listing"><span class="Keyword">if</span> <span class="Identifier">thisIsaLongCondition</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Keyword">and</span>
|
|
<span class="Identifier">thisIsAnotherLongCondition</span><span class="Punctuation">(</span><span class="DecNumber">1</span><span class="Punctuation">,</span>
|
|
<span class="DecNumber">2</span><span class="Punctuation">,</span> <span class="DecNumber">3</span><span class="Punctuation">,</span> <span class="DecNumber">4</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">x</span> <span class="Operator">=</span> <span class="Identifier">true</span></pre><ul class="simple"><li>Rule of thumb: optional indentation after operators, <tt class="docutils literal"><span class="pre">(</span></tt> and <tt class="docutils literal"><span class="pre">,</span></tt></li>
|
|
<li><tt class="docutils literal"><span class="pre">if</span></tt>, <tt class="docutils literal"><span class="pre">case</span></tt> etc also available as expressions</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="builtin-types">Builtin types</h1><ul class="simple"><li><tt class="docutils literal"><span class="pre">int</span></tt> -- platform dependent (16) 32 or 64 bit signed number<ul class="simple"><li>overflows produce an exception in debug mode; wrap around in release mode</li>
|
|
</ul>
|
|
</li>
|
|
<li><tt class="docutils literal"><span class="pre">float</span></tt> -- 64 bit floating point number<ul class="simple"><li>float64 an alias for float</li>
|
|
<li>float32 32 bit floating point number</li>
|
|
</ul>
|
|
</li>
|
|
<li><tt class="docutils literal"><span class="pre">int8</span></tt> / <tt class="docutils literal"><span class="pre">int16</span></tt> / <tt class="docutils literal"><span class="pre">int32</span></tt> / <tt class="docutils literal"><span class="pre">int64</span></tt><ul class="simple"><li>integer types with a platform independent size</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="builtin-types">Builtin types</h1><ul class="simple"><li><tt class="docutils literal"><span class="pre">uint</span></tt> / <tt class="docutils literal"><span class="pre">uint8</span></tt> / <tt class="docutils literal"><span class="pre">uint16</span></tt> / <tt class="docutils literal"><span class="pre">uint32</span></tt> / <tt class="docutils literal"><span class="pre">uint64</span></tt><ul class="simple"><li>like in C, always wrap around; modulo arithmetic</li>
|
|
<li>heavily discouraged: <tt class="docutils literal"><span class="pre">for in 0 .. x.len - 3</span></tt> should iterate 0 times when <tt class="docutils literal"><span class="pre">x.len == 0</span></tt>, not 4294967293 times!</li>
|
|
<li>instead: use <tt class="docutils literal"><span class="pre">Natural</span></tt></li>
|
|
</ul>
|
|
</li>
|
|
<li><tt class="docutils literal"><span class="pre">range[T]</span></tt><ul class="simple"><li>subrange type; quite heavily used in Nim (<tt class="docutils literal"><span class="pre">type Natural = range[0..high(int)]</span></tt>)</li>
|
|
</ul>
|
|
</li>
|
|
<li><tt class="docutils literal"><span class="pre">bool</span></tt></li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="builtin-types">Builtin types</h1><ul class="simple"><li><tt class="docutils literal"><span class="pre">array[FixedSize, T]</span></tt><ul class="simple"><li>fixed size in Nim</li>
|
|
<li>value based datatypes</li>
|
|
<li>layout is compatible to C</li>
|
|
<li>create via <tt class="docutils literal"><span class="pre">[1, 2, 3]</span></tt> construction</li>
|
|
</ul>
|
|
</li>
|
|
<li><tt class="docutils literal"><span class="pre">seq[T]</span></tt><ul class="simple"><li>dynamically resizable at runtime</li>
|
|
<li>grow with <tt class="docutils literal"><span class="pre">add</span></tt>, resize with <tt class="docutils literal"><span class="pre">setLen</span></tt></li>
|
|
<li>create via <tt class="docutils literal"><span class="pre">@</span></tt> or <tt class="docutils literal"><span class="pre">newSeq</span></tt>: <tt class="docutils literal"><span class="pre">@[1, 2, 3]</span></tt></li>
|
|
<li>allocated on the heap and GC'ed</li>
|
|
</ul>
|
|
</li>
|
|
<li><tt class="docutils literal"><span class="pre">openArray[T]</span></tt><ul class="simple"><li>allows to pass <tt class="docutils literal"><span class="pre">seq</span></tt> or <tt class="docutils literal"><span class="pre">array</span></tt> to a routine</li>
|
|
<li>internally a (pointer, length) pair</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="builtin-types">Builtin types</h1><ul class="simple"><li><tt class="docutils literal"><span class="pre">proc (a, b: string) {.closure.}</span></tt><ul class="simple"><li>functions are first class in Nim</li>
|
|
<li>"calling convention" affects type compatibility</li>
|
|
<li><tt class="docutils literal"><span class="pre">closure</span></tt> is a special calling convention (closures are GC'ed)</li>
|
|
</ul>
|
|
</li>
|
|
<li><tt class="docutils literal"><span class="pre">char</span></tt> / <tt class="docutils literal"><span class="pre">string</span></tt> / <tt class="docutils literal"><span class="pre">cstring</span></tt><ul class="simple"><li><tt class="docutils literal"><span class="pre">char</span></tt> is simply an octet, <tt class="docutils literal"><span class="pre">string</span></tt> is almost a <tt class="docutils literal"><span class="pre">seq[char]</span></tt>.</li>
|
|
<li><tt class="docutils literal"><span class="pre">string</span></tt> is (usually) allocated on the heap and GC'ed</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="builtin-types">Builtin types</h1><p><tt class="docutils literal"><span class="pre">tuple</span></tt></p>
|
|
<ul class="simple"><li>value based datatypes</li>
|
|
<li>structural typing</li>
|
|
<li>optional field names</li>
|
|
<li>construct with <tt class="docutils literal"><span class="pre">()</span></tt></li>
|
|
</ul>
|
|
<table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
</pre></td><td><pre id="listing_8" class="listing"><span class="Keyword">proc</span> <span class="Punctuation">`</span><span class="Operator">+-</span><span class="Punctuation">`</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">,</span> <span class="Identifier">y</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Punctuation">(</span><span class="Identifier">int</span><span class="Punctuation">,</span> <span class="Identifier">int</span><span class="Punctuation">)</span> <span class="Operator">=</span> <span class="Punctuation">(</span><span class="Identifier">x</span> <span class="Operator">-</span> <span class="Identifier">y</span><span class="Punctuation">,</span> <span class="Identifier">x</span> <span class="Operator">+</span> <span class="Identifier">y</span><span class="Punctuation">)</span>
|
|
<span class="Comment"># alternatively</span>
|
|
<span class="Keyword">proc</span> <span class="Punctuation">`</span><span class="Operator">+-</span><span class="Punctuation">`</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">,</span> <span class="Identifier">y</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">tuple</span><span class="Punctuation">[</span><span class="Identifier">lowerBound</span><span class="Punctuation">,</span> <span class="Identifier">upperBound</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">]</span> <span class="Operator">=</span> <span class="Punctuation">(</span><span class="Identifier">x</span> <span class="Operator">-</span> <span class="Identifier">y</span><span class="Punctuation">,</span> <span class="Identifier">x</span> <span class="Operator">+</span> <span class="Identifier">y</span><span class="Punctuation">)</span>
|
|
|
|
<span class="Keyword">let</span> <span class="Identifier">tup</span> <span class="Operator">=</span> <span class="DecNumber">100</span> <span class="Operator">+-</span> <span class="DecNumber">10</span>
|
|
<span class="Identifier">echo</span> <span class="Identifier">tup</span><span class="Punctuation">[</span><span class="DecNumber">0</span><span class="Punctuation">]</span><span class="Punctuation">,</span> <span class="StringLit">" "</span><span class="Punctuation">,</span> <span class="Identifier">tup</span><span class="Operator">.</span><span class="Identifier">upperBound</span>
|
|
|
|
<span class="Comment"># tuple unpacking</span>
|
|
<span class="Keyword">let</span> <span class="Punctuation">(</span><span class="Identifier">lower</span><span class="Punctuation">,</span> <span class="Identifier">_</span><span class="Punctuation">)</span> <span class="Operator">=</span> <span class="DecNumber">100</span> <span class="Operator">+-</span> <span class="DecNumber">10</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_8')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="builtin-types">Builtin types</h1><p><tt class="docutils literal"><span class="pre">object</span></tt></p>
|
|
<ul class="simple"><li>value based datatypes</li>
|
|
</ul>
|
|
<table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
</pre></td><td><pre id="listing_9" class="listing"><span class="Keyword">type</span>
|
|
<span class="Identifier">Rect</span> <span class="Operator">=</span> <span class="Keyword">object</span>
|
|
<span class="Identifier">x</span><span class="Punctuation">,</span> <span class="Identifier">y</span><span class="Punctuation">,</span> <span class="Identifier">w</span><span class="Punctuation">,</span> <span class="Identifier">h</span><span class="Punctuation">:</span> <span class="Identifier">int</span>
|
|
|
|
<span class="Comment"># construction:</span>
|
|
<span class="Keyword">let</span> <span class="Identifier">r</span> <span class="Operator">=</span> <span class="Identifier">Rect</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="DecNumber">12</span><span class="Punctuation">,</span> <span class="Identifier">y</span><span class="Punctuation">:</span> <span class="DecNumber">22</span><span class="Punctuation">,</span> <span class="Identifier">w</span><span class="Punctuation">:</span> <span class="DecNumber">40</span><span class="Punctuation">,</span> <span class="Identifier">h</span><span class="Punctuation">:</span> <span class="DecNumber">80</span><span class="Punctuation">)</span>
|
|
|
|
<span class="Comment"># field access:</span>
|
|
<span class="Identifier">echo</span> <span class="Identifier">r</span><span class="Operator">.</span><span class="Identifier">x</span><span class="Punctuation">,</span> <span class="StringLit">" "</span><span class="Punctuation">,</span> <span class="Identifier">r</span><span class="Operator">.</span><span class="Identifier">y</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_9')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="builtin-types">Builtin types</h1><p>enums & sets</p>
|
|
<table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
</pre></td><td><pre id="listing_10" class="listing"><span class="Keyword">type</span>
|
|
<span class="Identifier">SandboxFlag</span><span class="Operator">*</span> <span class="Operator">=</span> <span class="Keyword">enum</span> <span class="Comment">## what the interpreter should allow</span>
|
|
<span class="Identifier">allowCast</span><span class="Punctuation">,</span> <span class="Comment">## allow unsafe language feature: 'cast'</span>
|
|
<span class="Identifier">allowFFI</span><span class="Punctuation">,</span> <span class="Comment">## allow the FFI</span>
|
|
<span class="Identifier">allowInfiniteLoops</span> <span class="Comment">## allow endless loops</span>
|
|
<span class="Identifier">SandboxFlags</span><span class="Operator">*</span> <span class="Operator">=</span> <span class="Identifier">set</span><span class="Punctuation">[</span><span class="Identifier">SandboxFlag</span><span class="Punctuation">]</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">runNimCode</span><span class="Punctuation">(</span><span class="Identifier">code</span><span class="Punctuation">:</span> <span class="Identifier">string</span><span class="Punctuation">;</span> <span class="Identifier">flags</span><span class="Punctuation">:</span> <span class="Identifier">SandboxFlags</span> <span class="Operator">=</span> <span class="Punctuation">{</span><span class="Identifier">allowCast</span><span class="Punctuation">,</span> <span class="Identifier">allowFFI</span><span class="Punctuation">}</span><span class="Punctuation">)</span> <span class="Operator">=</span>
|
|
<span class="Operator">...</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_10')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="builtin-types">Builtin types</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
</pre></td><td><pre id="listing_11" class="listing"><span class="Preprocessor">#define</span> <span class="Identifier">allowCast</span> <span class="Punctuation">(</span><span class="DecNumber">1</span> <span class="Operator"><<</span> <span class="DecNumber">0</span><span class="Punctuation">)</span>
|
|
<span class="Preprocessor">#define</span> <span class="Identifier">allowFFI</span> <span class="Punctuation">(</span><span class="DecNumber">1</span> <span class="Operator"><<</span> <span class="DecNumber">1</span><span class="Punctuation">)</span>
|
|
<span class="Preprocessor">#define</span> <span class="Identifier">allowInfiniteLoops</span> <span class="Punctuation">(</span><span class="DecNumber">1</span> <span class="Operator"><<</span> <span class="DecNumber">1</span><span class="Punctuation">)</span>
|
|
|
|
<span class="Keyword">void</span> <span class="Identifier">runNimCode</span><span class="Punctuation">(</span><span class="Keyword">char</span><span class="Operator">*</span> <span class="Identifier">code</span><span class="Punctuation">,</span> <span class="Keyword">unsigned</span> <span class="Keyword">int</span> <span class="Identifier">flags</span> <span class="Operator">=</span> <span class="Identifier">allowCast</span><span class="Operator">|</span><span class="Identifier">allowFFI</span><span class="Punctuation">)</span><span class="Punctuation">;</span>
|
|
|
|
<span class="Identifier">runNimCode</span><span class="Punctuation">(</span><span class="StringLit">"4+5"</span><span class="Punctuation">,</span> <span class="DecNumber">700</span><span class="Punctuation">)</span><span class="Punctuation">;</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_11')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="builtin-types">Builtin types</h1><p><tt class="docutils literal"><span class="pre">ref</span></tt> and <tt class="docutils literal"><span class="pre">ptr</span></tt></p>
|
|
<ul class="simple"><li>pointers; <tt class="docutils literal"><span class="pre">ref</span></tt> is a "traced" pointer, <tt class="docutils literal"><span class="pre">ptr</span></tt> is an "untraced" pointer</li>
|
|
<li><tt class="docutils literal"><span class="pre">string</span></tt>, <tt class="docutils literal"><span class="pre">seq</span></tt>, <tt class="docutils literal"><span class="pre">ref</span></tt> and <tt class="docutils literal"><span class="pre">closure</span></tt> are GC'ed, nothing else</li>
|
|
<li><tt class="docutils literal"><span class="pre">ref object</span></tt> an idiom to get reference semantics out of objects</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="regular-expressions">Regular expressions</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
15
|
|
16
|
|
17
|
|
18
|
|
19
|
|
20
|
|
21
|
|
22
|
|
23
|
|
</pre></td><td><pre id="listing_12" class="listing"><span class="Comment"># Model a regular expression</span>
|
|
<span class="Keyword">type</span>
|
|
<span class="Identifier">RegexKind</span> <span class="Operator">=</span> <span class="Keyword">enum</span> <span class="Comment">## the regex AST's kind</span>
|
|
<span class="Identifier">reChar</span><span class="Punctuation">,</span> <span class="Comment">## character node "c"</span>
|
|
<span class="Identifier">reCClass</span><span class="Punctuation">,</span> <span class="Comment">## character class node "[a-z]"</span>
|
|
<span class="Identifier">reStar</span><span class="Punctuation">,</span> <span class="Comment">## star node "r*"</span>
|
|
<span class="Identifier">rePlus</span><span class="Punctuation">,</span> <span class="Comment">## plus node "r+"</span>
|
|
<span class="Identifier">reOpt</span><span class="Punctuation">,</span> <span class="Comment">## option node "r?"</span>
|
|
<span class="Identifier">reCat</span><span class="Punctuation">,</span> <span class="Comment">## concatenation node "ab"</span>
|
|
<span class="Identifier">reAlt</span><span class="Punctuation">,</span> <span class="Comment">## alternatives node "a|b"</span>
|
|
<span class="Identifier">reWordBoundary</span> <span class="Comment">## "\b"</span>
|
|
|
|
<span class="Identifier">RegExpr</span> <span class="Operator">=</span> <span class="Keyword">ref</span> <span class="Keyword">object</span>
|
|
<span class="Keyword">case</span> <span class="Identifier">kind</span><span class="Punctuation">:</span> <span class="Identifier">RegexKind</span>
|
|
<span class="Keyword">of</span> <span class="Identifier">reWordBoundary</span><span class="Punctuation">:</span> <span class="Keyword">discard</span>
|
|
<span class="Keyword">of</span> <span class="Identifier">reChar</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">c</span><span class="Punctuation">:</span> <span class="Identifier">char</span>
|
|
<span class="Keyword">of</span> <span class="Identifier">reCClass</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">cc</span><span class="Punctuation">:</span> <span class="Identifier">set</span><span class="Punctuation">[</span><span class="Identifier">char</span><span class="Punctuation">]</span>
|
|
<span class="Keyword">of</span> <span class="Identifier">reStar</span><span class="Punctuation">,</span> <span class="Identifier">rePlus</span><span class="Punctuation">,</span> <span class="Identifier">reOpt</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">child0</span><span class="Punctuation">:</span> <span class="Identifier">RegExpr</span>
|
|
<span class="Keyword">of</span> <span class="Identifier">reCat</span><span class="Punctuation">,</span> <span class="Identifier">reAlt</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">child1</span><span class="Punctuation">,</span> <span class="Identifier">child2</span><span class="Punctuation">:</span> <span class="Identifier">RegExpr</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_12')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="equality">Equality</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
</pre></td><td><pre id="listing_13" class="listing"><span class="Keyword">proc</span> <span class="Punctuation">`</span><span class="Operator">==</span><span class="Punctuation">`</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Punctuation">,</span> <span class="Identifier">b</span><span class="Punctuation">:</span> <span class="Identifier">RegExpr</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">bool</span> <span class="Operator">=</span>
|
|
<span class="Keyword">if</span> <span class="Identifier">a</span><span class="Operator">.</span><span class="Identifier">kind</span> <span class="Operator">==</span> <span class="Identifier">b</span><span class="Operator">.</span><span class="Identifier">kind</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">case</span> <span class="Identifier">a</span><span class="Operator">.</span><span class="Identifier">kind</span>
|
|
<span class="Keyword">of</span> <span class="Identifier">reWordBoundary</span><span class="Punctuation">:</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="Identifier">true</span>
|
|
<span class="Keyword">of</span> <span class="Identifier">reChar</span><span class="Punctuation">:</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="Identifier">a</span><span class="Operator">.</span><span class="Identifier">c</span> <span class="Operator">==</span> <span class="Identifier">b</span><span class="Operator">.</span><span class="Identifier">c</span>
|
|
<span class="Keyword">of</span> <span class="Identifier">reCClass</span><span class="Punctuation">:</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="Identifier">a</span><span class="Operator">.</span><span class="Identifier">cc</span> <span class="Operator">==</span> <span class="Identifier">b</span><span class="Operator">.</span><span class="Identifier">cc</span>
|
|
<span class="Keyword">of</span> <span class="Identifier">reStar</span><span class="Punctuation">,</span> <span class="Identifier">rePlus</span><span class="Punctuation">,</span> <span class="Identifier">reOpt</span><span class="Punctuation">:</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="Punctuation">`</span><span class="Operator">==</span><span class="Punctuation">`</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Operator">.</span><span class="Identifier">child0</span><span class="Punctuation">,</span> <span class="Identifier">b</span><span class="Operator">.</span><span class="Identifier">child0</span><span class="Punctuation">)</span>
|
|
<span class="Keyword">of</span> <span class="Identifier">reCat</span><span class="Punctuation">,</span> <span class="Identifier">reAlt</span><span class="Punctuation">:</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="Punctuation">`</span><span class="Operator">==</span><span class="Punctuation">`</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Operator">.</span><span class="Identifier">child1</span><span class="Punctuation">,</span> <span class="Identifier">b</span><span class="Operator">.</span><span class="Identifier">child1</span><span class="Punctuation">)</span> <span class="Keyword">and</span>
|
|
<span class="Punctuation">`</span><span class="Operator">==</span><span class="Punctuation">`</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Operator">.</span><span class="Identifier">child2</span><span class="Punctuation">,</span> <span class="Identifier">b</span><span class="Operator">.</span><span class="Identifier">child2</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_13')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="accessors">Accessors</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
15
|
|
16
|
|
17
|
|
18
|
|
19
|
|
20
|
|
</pre></td><td><pre id="listing_14" class="listing"><span class="Keyword">type</span>
|
|
<span class="Identifier">HashTable</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span> <span class="Operator">=</span> <span class="Keyword">object</span>
|
|
<span class="Identifier">data</span><span class="Punctuation">:</span> <span class="Identifier">seq</span><span class="Punctuation">[</span><span class="Punctuation">(</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">)</span><span class="Punctuation">]</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">hash</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Identifier">k</span><span class="Punctuation">:</span> <span class="Identifier">K</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">int</span> <span class="Operator">=</span> <span class="DecNumber">0</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Punctuation">`</span><span class="Punctuation">[</span><span class="Punctuation">]</span><span class="Punctuation">`</span><span class="Operator">*</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">HashTable</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span><span class="Punctuation">;</span> <span class="Identifier">k</span><span class="Punctuation">:</span> <span class="Identifier">K</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">V</span> <span class="Operator">=</span>
|
|
<span class="Identifier">result</span> <span class="Operator">=</span> <span class="Identifier">x</span><span class="Operator">.</span><span class="Identifier">data</span><span class="Punctuation">[</span><span class="Identifier">hash</span><span class="Punctuation">(</span><span class="Identifier">k</span><span class="Punctuation">)</span><span class="Punctuation">]</span><span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Punctuation">]</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Punctuation">`</span><span class="Punctuation">[</span><span class="Punctuation">]</span><span class="Operator">=</span><span class="Punctuation">`</span><span class="Operator">*</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">HashTable</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span><span class="Punctuation">;</span> <span class="Identifier">k</span><span class="Punctuation">:</span> <span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">v</span><span class="Punctuation">:</span> <span class="Identifier">V</span><span class="Punctuation">)</span> <span class="Operator">=</span>
|
|
<span class="Identifier">x</span><span class="Operator">.</span><span class="Identifier">data</span><span class="Punctuation">[</span><span class="Identifier">hash</span><span class="Punctuation">(</span><span class="Identifier">k</span><span class="Punctuation">)</span><span class="Punctuation">]</span><span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Punctuation">]</span> <span class="Operator">=</span> <span class="Identifier">v</span>
|
|
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">initHashTable</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">HashTable</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span> <span class="Operator">=</span>
|
|
<span class="Identifier">result</span><span class="Operator">.</span><span class="Identifier">data</span> <span class="Operator">=</span> <span class="Operator">@</span><span class="Punctuation">[</span><span class="Punctuation">]</span>
|
|
|
|
<span class="Keyword">var</span> <span class="Identifier">tab</span> <span class="Operator">=</span> <span class="Identifier">initHashTable</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">,</span> <span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
|
|
<span class="Identifier">tab</span><span class="Punctuation">[</span><span class="StringLit">"key"</span><span class="Punctuation">]</span> <span class="Operator">=</span> <span class="StringLit">"abc"</span> <span class="Comment"># calls '[]=' accessor</span>
|
|
|
|
<span class="Identifier">echo</span> <span class="Identifier">tab</span><span class="Punctuation">[</span><span class="StringLit">"key"</span><span class="Punctuation">]</span> <span class="Comment"># calls '[]' accessor</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_14')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="accessors">Accessors</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
15
|
|
16
|
|
17
|
|
18
|
|
19
|
|
20
|
|
21
|
|
22
|
|
23
|
|
</pre></td><td><pre id="listing_15" class="listing"><span class="Keyword">type</span>
|
|
<span class="Identifier">HashTable</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span> <span class="Operator">=</span> <span class="Keyword">object</span>
|
|
<span class="Identifier">data</span><span class="Punctuation">:</span> <span class="Identifier">seq</span><span class="Punctuation">[</span><span class="Punctuation">(</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">)</span><span class="Punctuation">]</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">hash</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Identifier">k</span><span class="Punctuation">:</span> <span class="Identifier">K</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">int</span> <span class="Operator">=</span> <span class="DecNumber">0</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Punctuation">`</span><span class="Punctuation">[</span><span class="Punctuation">]</span><span class="Punctuation">`</span><span class="Operator">*</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">HashTable</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span><span class="Punctuation">;</span> <span class="Identifier">k</span><span class="Punctuation">:</span> <span class="Identifier">K</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">V</span> <span class="Operator">=</span>
|
|
<span class="Identifier">result</span> <span class="Operator">=</span> <span class="Identifier">x</span><span class="Operator">.</span><span class="Identifier">data</span><span class="Punctuation">[</span><span class="Identifier">hash</span><span class="Punctuation">(</span><span class="Identifier">k</span><span class="Punctuation">)</span><span class="Punctuation">]</span><span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Punctuation">]</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Punctuation">`</span><span class="Punctuation">[</span><span class="Punctuation">]</span><span class="Operator">=</span><span class="Punctuation">`</span><span class="Operator">*</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">HashTable</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span><span class="Punctuation">;</span> <span class="Identifier">k</span><span class="Punctuation">:</span> <span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">v</span><span class="Punctuation">:</span> <span class="Identifier">V</span><span class="Punctuation">)</span> <span class="Operator">=</span>
|
|
<span class="Identifier">x</span><span class="Operator">.</span><span class="Identifier">data</span><span class="Punctuation">[</span><span class="Identifier">hash</span><span class="Punctuation">(</span><span class="Identifier">k</span><span class="Punctuation">)</span><span class="Punctuation">]</span><span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Punctuation">]</span> <span class="Operator">=</span> <span class="Identifier">v</span>
|
|
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">initHashTable</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">HashTable</span><span class="Punctuation">[</span><span class="Identifier">K</span><span class="Punctuation">,</span> <span class="Identifier">V</span><span class="Punctuation">]</span> <span class="Operator">=</span>
|
|
<span class="Identifier">result</span><span class="Operator">.</span><span class="Identifier">data</span> <span class="Operator">=</span> <span class="Operator">@</span><span class="Punctuation">[</span><span class="Punctuation">]</span>
|
|
|
|
<span class="Keyword">var</span> <span class="Identifier">tab</span> <span class="Operator">=</span> <span class="Identifier">initHashTable</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">,</span> <span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
|
|
<span class="Identifier">tab</span><span class="Punctuation">[</span><span class="StringLit">"key"</span><span class="Punctuation">]</span> <span class="Operator">=</span> <span class="StringLit">"abc"</span> <span class="Comment"># calls '[]=' accessor</span>
|
|
|
|
<span class="Identifier">echo</span> <span class="Identifier">tab</span><span class="Punctuation">[</span><span class="StringLit">"key"</span><span class="Punctuation">]</span> <span class="Comment"># calls '[]' accessor</span>
|
|
|
|
<span class="Comment"># ouch:</span>
|
|
<span class="Identifier">tab</span><span class="Punctuation">[</span><span class="StringLit">"key"</span><span class="Punctuation">]</span><span class="Operator">.</span><span class="Identifier">add</span> <span class="StringLit">"xyz"</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_15')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="accessors">Accessors</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
</pre></td><td><pre id="listing_16" class="listing"><span class="Keyword">proc</span> <span class="Punctuation">`</span><span class="Punctuation">[</span><span class="Punctuation">]</span><span class="Punctuation">`</span><span class="Operator">*</span><span class="Punctuation">[</span><span class="Identifier">Key</span><span class="Punctuation">,</span> <span class="Identifier">Value</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">HashTable</span><span class="Punctuation">[</span><span class="Identifier">Key</span><span class="Punctuation">,</span> <span class="Identifier">Value</span><span class="Punctuation">]</span><span class="Punctuation">;</span> <span class="Identifier">k</span><span class="Punctuation">:</span> <span class="Identifier">Key</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">Value</span> <span class="Operator">=</span>
|
|
<span class="Identifier">result</span> <span class="Operator">=</span> <span class="Identifier">x</span><span class="Operator">.</span><span class="Identifier">data</span><span class="Punctuation">[</span><span class="Identifier">hash</span><span class="Punctuation">(</span><span class="Identifier">key</span><span class="Punctuation">)</span><span class="Punctuation">]</span>
|
|
|
|
|
|
<span class="Keyword">var</span>
|
|
<span class="Identifier">tab</span> <span class="Operator">=</span> <span class="Identifier">initHashTable</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">,</span> <span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
|
|
|
|
<span class="Comment"># compiles :-)</span>
|
|
<span class="Identifier">tab</span><span class="Punctuation">[</span><span class="StringLit">"key"</span><span class="Punctuation">]</span><span class="Operator">.</span><span class="Identifier">add</span> <span class="StringLit">"xyz"</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_16')">Select</button><ul class="simple"><li><tt class="docutils literal"><span class="pre">var</span></tt> "pass by reference" for parameters</li>
|
|
<li>can also by used for return values</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="distinct">Distinct</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
</pre></td><td><pre id="listing_17" class="listing"><span class="Comment"># Taken from system.nim</span>
|
|
<span class="Keyword">const</span> <span class="Identifier">taintMode</span> <span class="Operator">=</span> <span class="Identifier">compileOption</span><span class="Punctuation">(</span><span class="StringLit">"taintmode"</span><span class="Punctuation">)</span>
|
|
|
|
<span class="Keyword">when</span> <span class="Identifier">taintMode</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">type</span> <span class="Identifier">TaintedString</span><span class="Operator">*</span> <span class="Operator">=</span> <span class="Keyword">distinct</span> <span class="Identifier">string</span>
|
|
<span class="Keyword">proc</span> <span class="Identifier">len</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">s</span><span class="Punctuation">:</span> <span class="Identifier">TaintedString</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">int</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">borrow</span><span class="Operator">.</span><span class="Punctuation">}</span>
|
|
<span class="Keyword">else</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">type</span> <span class="Identifier">TaintedString</span><span class="Operator">*</span> <span class="Operator">=</span> <span class="Identifier">string</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">readLine</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">f</span><span class="Punctuation">:</span> <span class="Identifier">File</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">TaintedString</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">tags</span><span class="Punctuation">:</span> <span class="Punctuation">[</span><span class="Identifier">ReadIOEffect</span><span class="Punctuation">]</span><span class="Punctuation">,</span> <span class="Identifier">benign</span><span class="Operator">.</span><span class="Punctuation">}</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_17')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="distinct">Distinct</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
</pre></td><td><pre id="listing_18" class="listing"><span class="Comment"># taintmode_ex</span>
|
|
|
|
<span class="Identifier">echo</span> <span class="Identifier">readLine</span><span class="Punctuation">(</span><span class="Identifier">stdin</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_18')">Select</button><pre>nim c -r --taintMode:on taintmode_ex</pre>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="distinct">Distinct</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
</pre></td><td><pre id="listing_19" class="listing"><span class="Comment"># taintmode_ex</span>
|
|
|
|
<span class="Identifier">echo</span> <span class="Identifier">readLine</span><span class="Punctuation">(</span><span class="Identifier">stdin</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">string</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_19')">Select</button><pre>nim c -r --taintMode:on taintmode_ex</pre>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="distinct">Distinct</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
</pre></td><td><pre id="listing_20" class="listing"><span class="Comment"># taintmode_ex</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Punctuation">`</span><span class="Operator">$</span><span class="Punctuation">`</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">TaintedString</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">string</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">borrow</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Comment"># but: defeats the purpose</span>
|
|
|
|
<span class="Identifier">echo</span> <span class="Identifier">readLine</span><span class="Punctuation">(</span><span class="Identifier">stdin</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_20')">Select</button><pre>nim c -r --taintMode:on taintmode_ex</pre>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="module-system">Module system</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
</pre></td><td><pre id="listing_21" class="listing"><span class="Comment"># Module A</span>
|
|
<span class="Keyword">var</span>
|
|
<span class="Identifier">global</span><span class="Operator">*:</span> <span class="Identifier">string</span> <span class="Operator">=</span> <span class="StringLit">"A.global"</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">p</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">string</span><span class="Punctuation">)</span> <span class="Operator">=</span> <span class="Identifier">echo</span> <span class="StringLit">"exported "</span><span class="Punctuation">,</span> <span class="Identifier">x</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_21')">Select</button><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
</pre></td><td><pre id="listing_22" class="listing"><span class="Comment"># Module B</span>
|
|
<span class="Keyword">import</span> <span class="Identifier">A</span>
|
|
|
|
<span class="Identifier">echo</span> <span class="Identifier">p</span><span class="Punctuation">(</span><span class="Identifier">global</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_22')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="module-system">Module system</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
</pre></td><td><pre id="listing_23" class="listing"><span class="Comment"># Module A</span>
|
|
<span class="Keyword">var</span>
|
|
<span class="Identifier">global</span><span class="Operator">*:</span> <span class="Identifier">string</span> <span class="Operator">=</span> <span class="StringLit">"A.global"</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">p</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">string</span><span class="Punctuation">)</span> <span class="Operator">=</span> <span class="Identifier">echo</span> <span class="StringLit">"exported "</span><span class="Punctuation">,</span> <span class="Identifier">x</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_23')">Select</button><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
</pre></td><td><pre id="listing_24" class="listing"><span class="Comment"># Module B</span>
|
|
<span class="Keyword">from</span> <span class="Identifier">A</span> <span class="Keyword">import</span> <span class="Identifier">p</span>
|
|
|
|
<span class="Identifier">echo</span> <span class="Identifier">p</span><span class="Punctuation">(</span><span class="Identifier">A</span><span class="Operator">.</span><span class="Identifier">global</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_24')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="module-system">Module system</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
</pre></td><td><pre id="listing_25" class="listing"><span class="Comment"># Module A</span>
|
|
<span class="Keyword">var</span>
|
|
<span class="Identifier">global</span><span class="Operator">*:</span> <span class="Identifier">string</span> <span class="Operator">=</span> <span class="StringLit">"A.global"</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">p</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">string</span><span class="Punctuation">)</span> <span class="Operator">=</span> <span class="Identifier">echo</span> <span class="StringLit">"exported "</span><span class="Punctuation">,</span> <span class="Identifier">x</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_25')">Select</button><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
</pre></td><td><pre id="listing_26" class="listing"><span class="Comment"># Module B</span>
|
|
<span class="Keyword">import</span> <span class="Identifier">A</span> <span class="Keyword">except</span> <span class="Identifier">global</span>
|
|
|
|
<span class="Identifier">echo</span> <span class="Identifier">p</span><span class="Punctuation">(</span><span class="Identifier">A</span><span class="Operator">.</span><span class="Identifier">global</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_26')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="routines">Routines</h1><ul class="simple"><li><tt class="docutils literal"><span class="pre">proc</span></tt></li>
|
|
<li><tt class="docutils literal"><span class="pre">iterator</span></tt></li>
|
|
<li><tt class="docutils literal"><span class="pre">template</span></tt></li>
|
|
<li><tt class="docutils literal"><span class="pre">macro</span></tt></li>
|
|
<li><tt class="docutils literal"><span class="pre">method</span></tt></li>
|
|
<li><tt class="docutils literal"><span class="pre">converter</span></tt></li>
|
|
<li>(<tt class="docutils literal"><span class="pre">func</span></tt>)</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="iterators">Iterators</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
</pre></td><td><pre id="listing_27" class="listing"><span class="Keyword">iterator</span> <span class="Punctuation">`</span><span class="Operator">..<</span><span class="Punctuation">`</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Punctuation">,</span> <span class="Identifier">b</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">int</span> <span class="Operator">=</span>
|
|
<span class="Keyword">var</span> <span class="Identifier">i</span> <span class="Operator">=</span> <span class="Identifier">a</span>
|
|
<span class="Keyword">while</span> <span class="Identifier">i</span> <span class="Operator"><</span> <span class="Identifier">b</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">yield</span> <span class="Identifier">i</span>
|
|
<span class="Identifier">i</span> <span class="Operator">+=</span> <span class="DecNumber">1</span>
|
|
|
|
<span class="Keyword">for</span> <span class="Identifier">i</span> <span class="Keyword">in</span> <span class="FloatNumber">0.</span><span class="Operator">.<</span><span class="DecNumber">10</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">echo</span> <span class="Identifier">i</span><span class="Operator">+</span><span class="DecNumber">1</span><span class="Punctuation">,</span> <span class="StringLit">"-th iteration"</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_27')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="iterators">Iterators</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
</pre></td><td><pre id="listing_28" class="listing"><span class="Keyword">for</span> <span class="Identifier">x</span> <span class="Keyword">in</span> <span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Punctuation">,</span> <span class="DecNumber">2</span><span class="Punctuation">,</span> <span class="DecNumber">3</span><span class="Punctuation">]</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">echo</span> <span class="Identifier">x</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_28')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="iterators">Iterators</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
</pre></td><td><pre id="listing_29" class="listing"><span class="Keyword">for</span> <span class="Identifier">x</span> <span class="Keyword">in</span> <span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Punctuation">,</span> <span class="DecNumber">2</span><span class="Punctuation">,</span> <span class="DecNumber">3</span><span class="Punctuation">]</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">echo</span> <span class="Identifier">x</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_29')">Select</button><p>Rewritten to:</p>
|
|
<table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
</pre></td><td><pre id="listing_30" class="listing"><span class="Keyword">for</span> <span class="Identifier">x</span> <span class="Keyword">in</span> <span class="Identifier">items</span><span class="Punctuation">(</span><span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Punctuation">,</span> <span class="DecNumber">2</span><span class="Punctuation">,</span> <span class="DecNumber">3</span><span class="Punctuation">]</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">echo</span> <span class="Identifier">x</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_30')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="iterators">Iterators</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
</pre></td><td><pre id="listing_31" class="listing"><span class="Keyword">iterator</span> <span class="Identifier">items</span><span class="Operator">*</span><span class="Punctuation">[</span><span class="Identifier">IX</span><span class="Punctuation">,</span> <span class="Identifier">T</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Punctuation">:</span> <span class="Identifier">array</span><span class="Punctuation">[</span><span class="Identifier">IX</span><span class="Punctuation">,</span> <span class="Identifier">T</span><span class="Punctuation">]</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">T</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">inline</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span>
|
|
<span class="Keyword">var</span> <span class="Identifier">i</span> <span class="Operator">=</span> <span class="Identifier">low</span><span class="Punctuation">(</span><span class="Identifier">IX</span><span class="Punctuation">)</span>
|
|
<span class="Keyword">while</span> <span class="Identifier">i</span> <span class="Operator"><=</span> <span class="Identifier">high</span><span class="Punctuation">(</span><span class="Identifier">IX</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">yield</span> <span class="Identifier">a</span><span class="Punctuation">[</span><span class="Identifier">i</span><span class="Punctuation">]</span>
|
|
<span class="Identifier">i</span> <span class="Operator">+=</span> <span class="DecNumber">1</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_31')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="iterators">Iterators</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
</pre></td><td><pre id="listing_32" class="listing"><span class="Keyword">for</span> <span class="Identifier">x</span> <span class="Keyword">in</span> <span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Punctuation">,</span> <span class="DecNumber">2</span><span class="Punctuation">,</span> <span class="DecNumber">3</span><span class="Punctuation">]</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">x</span> <span class="Operator">=</span> <span class="DecNumber">0</span> <span class="Comment"># doesn't compile</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_32')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="iterators">Iterators</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
</pre></td><td><pre id="listing_33" class="listing"><span class="Keyword">var</span> <span class="Identifier">a</span> <span class="Operator">=</span> <span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Punctuation">,</span> <span class="DecNumber">2</span><span class="Punctuation">,</span> <span class="DecNumber">3</span><span class="Punctuation">]</span>
|
|
<span class="Keyword">for</span> <span class="Identifier">x</span> <span class="Keyword">in</span> <span class="Identifier">a</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">x</span> <span class="Operator">=</span> <span class="DecNumber">0</span> <span class="Comment"># doesn't compile</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_33')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="iterators">Iterators</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
</pre></td><td><pre id="listing_34" class="listing"><span class="Keyword">iterator</span> <span class="Identifier">mitems</span><span class="Operator">*</span><span class="Punctuation">[</span><span class="Identifier">IX</span><span class="Punctuation">,</span> <span class="Identifier">T</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">array</span><span class="Punctuation">[</span><span class="Identifier">IX</span><span class="Punctuation">,</span> <span class="Identifier">T</span><span class="Punctuation">]</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">T</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">inline</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span>
|
|
<span class="Keyword">var</span> <span class="Identifier">i</span> <span class="Operator">=</span> <span class="Identifier">low</span><span class="Punctuation">(</span><span class="Identifier">IX</span><span class="Punctuation">)</span>
|
|
<span class="Keyword">if</span> <span class="Identifier">i</span> <span class="Operator"><=</span> <span class="Identifier">high</span><span class="Punctuation">(</span><span class="Identifier">IX</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">while</span> <span class="Identifier">true</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">yield</span> <span class="Identifier">a</span><span class="Punctuation">[</span><span class="Identifier">i</span><span class="Punctuation">]</span>
|
|
<span class="Keyword">if</span> <span class="Identifier">i</span> <span class="Operator">>=</span> <span class="Identifier">high</span><span class="Punctuation">(</span><span class="Identifier">IX</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">break</span>
|
|
<span class="Identifier">i</span> <span class="Operator">+=</span> <span class="DecNumber">1</span>
|
|
|
|
<span class="Keyword">var</span> <span class="Identifier">a</span> <span class="Operator">=</span> <span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Punctuation">,</span> <span class="DecNumber">2</span><span class="Punctuation">,</span> <span class="DecNumber">3</span><span class="Punctuation">]</span>
|
|
<span class="Keyword">for</span> <span class="Identifier">x</span> <span class="Keyword">in</span> <span class="Identifier">mitems</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">x</span> <span class="Operator">=</span> <span class="DecNumber">0</span> <span class="Comment"># compiles</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_34')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="parallelism">Parallelism</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
</pre></td><td><pre id="listing_35" class="listing"><span class="Keyword">import</span> <span class="Identifier">tables</span><span class="Punctuation">,</span> <span class="Identifier">strutils</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">countWords</span><span class="Punctuation">(</span><span class="Identifier">filename</span><span class="Punctuation">:</span> <span class="Identifier">string</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">CountTableRef</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span> <span class="Operator">=</span>
|
|
<span class="Comment">## Counts all the words in the file.</span>
|
|
<span class="Identifier">result</span> <span class="Operator">=</span> <span class="Identifier">newCountTable</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
|
|
<span class="Keyword">for</span> <span class="Identifier">word</span> <span class="Keyword">in</span> <span class="Identifier">readFile</span><span class="Punctuation">(</span><span class="Identifier">filename</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">split</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">result</span><span class="Operator">.</span><span class="Identifier">inc</span> <span class="Identifier">word</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_35')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="parallelism">Parallelism</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
</pre></td><td><pre id="listing_36" class="listing"><span class="Comment">#</span>
|
|
<span class="Comment">#</span>
|
|
<span class="Keyword">const</span>
|
|
<span class="Identifier">files</span> <span class="Operator">=</span> <span class="Punctuation">[</span><span class="StringLit">"data1.txt"</span><span class="Punctuation">,</span> <span class="StringLit">"data2.txt"</span><span class="Punctuation">,</span> <span class="StringLit">"data3.txt"</span><span class="Punctuation">,</span> <span class="StringLit">"data4.txt"</span><span class="Punctuation">]</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">main</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Operator">=</span>
|
|
<span class="Keyword">var</span> <span class="Identifier">tab</span> <span class="Operator">=</span> <span class="Identifier">newCountTable</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
|
|
<span class="Keyword">for</span> <span class="Identifier">f</span> <span class="Keyword">in</span> <span class="Identifier">files</span><span class="Punctuation">:</span>
|
|
<span class="Keyword">let</span> <span class="Identifier">tab2</span> <span class="Operator">=</span> <span class="Identifier">countWords</span><span class="Punctuation">(</span><span class="Identifier">f</span><span class="Punctuation">)</span>
|
|
<span class="Identifier">tab</span><span class="Operator">.</span><span class="Identifier">merge</span><span class="Punctuation">(</span><span class="Identifier">tab2</span><span class="Punctuation">)</span>
|
|
<span class="Identifier">tab</span><span class="Operator">.</span><span class="Identifier">sort</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
|
|
<span class="Identifier">echo</span> <span class="Identifier">tab</span><span class="Operator">.</span><span class="Identifier">largest</span>
|
|
|
|
<span class="Identifier">main</span><span class="Punctuation">(</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_36')">Select</button>
|
|
</div>
|
|
<div class="slide">
|
|
<h1 id="parallelism">Parallelism</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
15
|
|
16
|
|
</pre></td><td><pre id="listing_37" class="listing"><span class="Keyword">import</span> <span class="Identifier">threadpool</span>
|
|
|
|
<span class="Keyword">const</span>
|
|
<span class="Identifier">files</span> <span class="Operator">=</span> <span class="Punctuation">[</span><span class="StringLit">"data1.txt"</span><span class="Punctuation">,</span> <span class="StringLit">"data2.txt"</span><span class="Punctuation">,</span> <span class="StringLit">"data3.txt"</span><span class="Punctuation">,</span> <span class="StringLit">"data4.txt"</span><span class="Punctuation">]</span>
|
|
|
|
<span class="Keyword">proc</span> <span class="Identifier">main</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Operator">=</span>
|
|
<span class="Keyword">var</span> <span class="Identifier">tab</span> <span class="Operator">=</span> <span class="Identifier">newCountTable</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
|
|
<span class="Keyword">var</span> <span class="Identifier">results</span><span class="Punctuation">:</span> <span class="Identifier">array</span><span class="Punctuation">[</span><span class="Identifier">files</span><span class="Operator">.</span><span class="Identifier">len</span><span class="Punctuation">,</span> <span style="background-color:#FF7700"><span class="Identifier">FlowVar</span><span class="Punctuation">[</span><span class="Identifier">CountTableRef</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">]</span></span><span class="Punctuation">]</span>
|
|
<span class="Keyword">for</span> <span class="Identifier">i</span><span class="Punctuation">,</span> <span class="Identifier">f</span> <span class="Keyword">in</span> <span class="Identifier">files</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">results</span><span class="Punctuation">[</span><span class="Identifier">i</span><span class="Punctuation">]</span> <span class="Operator">=</span> <span style="background-color:#FF7700"><span class="Identifier">spawn</span></span> <span class="Identifier">countWords</span><span class="Punctuation">(</span><span class="Identifier">f</span><span class="Punctuation">)</span>
|
|
<span class="Keyword">for</span> <span class="Identifier">i</span> <span class="Keyword">in</span> <span class="FloatNumber">0.</span><span class="Operator">.</span><span class="Identifier">high</span><span class="Punctuation">(</span><span class="Identifier">results</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
|
|
<span class="Identifier">tab</span><span class="Operator">.</span><span class="Identifier">merge</span><span class="Punctuation">(</span><span style="background-color:#FF7700"> <span class="Operator">^</span><span class="Identifier">results</span><span class="Punctuation">[</span><span class="Identifier">i</span><span class="Punctuation">]</span> </span><span class="Punctuation">)</span>
|
|
<span class="Identifier">tab</span><span class="Operator">.</span><span class="Identifier">sort</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
|
|
<span class="Identifier">echo</span> <span class="Identifier">tab</span><span class="Operator">.</span><span class="Identifier">largest</span>
|
|
|
|
<span class="Identifier">main</span><span class="Punctuation">(</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_37')">Select</button>
|
|
|
|
|
|
</body>
|
|
</div>
|
|
</html>
|