oscon2015/4_cppinterop.html
2015-07-17 10:22:09 +02:00

576 lines
49 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>Interfacing with C/C++</title>
<meta name="copyright"
content="Copyright &#169; 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">Interfacing with C/C++</h1>
</div>
<div class="slide">
<h1 id="interfacing-with-c">Interfacing with C</h1><p>2 options</p>
<ul class="simple"><li>via <tt class="docutils literal"><span class="pre">dynlib</span></tt></li>
<li>via <tt class="docutils literal"><span class="pre">header</span></tt></li>
</ul>
</div>
<div class="slide">
<h1 id="dynlib-import">Dynlib import</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_1" class="listing"><span class="Keyword">type</span>
<span class="Identifier">GtkWidget</span> <span class="Operator">=</span> <span class="Keyword">object</span>
<span class="Identifier">data</span><span class="Punctuation">:</span> <span class="Identifier">cint</span>
<span class="Identifier">binary</span><span class="Punctuation">:</span> <span class="Identifier">cfloat</span>
<span class="Identifier">compatible</span><span class="Punctuation">:</span> <span class="Identifier">char</span>
<span class="Keyword">proc</span> <span class="Identifier">gtk_image_new</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">ptr</span> <span class="Identifier">GtkWidget</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">cdecl</span><span class="Punctuation">,</span> <span class="Identifier">dynlib</span><span class="Punctuation">:</span> <span class="StringLit">&quot;libgtk-x11-2.0.so&quot;</span><span class="Punctuation">,</span> <span class="Identifier">importc</span><span class="Operator">.</span><span class="Punctuation">}</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_1')">Select</button>
</div>
<div class="slide">
<h1 id="header-import">Header import</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_2" class="listing"><span class="Keyword">type</span>
<span class="Identifier">GtkWidget</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importc</span><span class="Punctuation">:</span> <span class="StringLit">&quot;GtkWidget_t&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;&lt;gtk.h&gt;&quot;</span><span class="Operator">.</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="Operator">.</span><span class="Identifier">importc</span><span class="Punctuation">:</span> <span class="StringLit">&quot;Data&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span><span class="Punctuation">:</span> <span class="Identifier">cint</span>
<span class="Identifier">binary</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importc</span><span class="Punctuation">:</span> <span class="StringLit">&quot;Binary&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span><span class="Punctuation">:</span> <span class="Identifier">cfloat</span>
<span class="Identifier">compatible</span><span class="Punctuation">:</span> <span class="Identifier">char</span>
<span class="Keyword">proc</span> <span class="Identifier">gtk_image_new</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">ptr</span> <span class="Identifier">GtkWidget</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">cdecl</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;&lt;gtk.h&gt;&quot;</span><span class="Punctuation">,</span> <span class="Identifier">importc</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">passC</span><span class="Punctuation">:</span> <span class="Identifier">staticExec</span><span class="Punctuation">(</span><span class="StringLit">&quot;pkg-config --cflags gtk&quot;</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">passL</span><span class="Punctuation">:</span> <span class="Identifier">staticExec</span><span class="Punctuation">(</span><span class="StringLit">&quot;pkg-config --libs gtk&quot;</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Punctuation">}</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_2')">Select</button>
</div>
<div class="slide">
<h1 id="header-import">Header import</h1><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_3" class="listing"><span class="Keyword">proc</span> <span class="Identifier">printf</span><span class="Punctuation">(</span><span class="Identifier">formatstr</span><span class="Punctuation">:</span> <span class="Identifier">cstring</span><span class="Punctuation">)</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;&lt;stdio.h&gt;&quot;</span><span class="Punctuation">,</span> <span class="Identifier">importc</span><span class="Punctuation">:</span> <span class="StringLit">&quot;printf&quot;</span><span class="Punctuation">,</span> <span class="Identifier">varargs</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Identifier">printf</span><span class="Punctuation">(</span><span class="StringLit">&quot;%s%s&quot;</span><span class="Punctuation">,</span> <span class="StringLit">&quot;Nim strings &quot;</span><span class="Punctuation">,</span> <span class="StringLit">&quot;converted to cstring for you&quot;</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_3')">Select</button>
</div>
<div class="slide">
<h1 id="data-exchange-with-c">Data exchange with C</h1><table border="1" class="docutils"><tr><th>C type</th><th>Nim type</th></tr>
<tr><td><tt class="docutils literal"><span class="pre">int</span></tt></td><td><tt class="docutils literal"><span class="pre">cint</span></tt></td></tr>
<tr><td><tt class="docutils literal"><span class="pre">unsigned long</span></tt></td><td><tt class="docutils literal"><span class="pre">culong</span></tt></td></tr>
<tr><td><tt class="docutils literal"><span class="pre">float</span></tt></td><td><tt class="docutils literal"><span class="pre">cfloat</span></tt></td></tr>
<tr><td><tt class="docutils literal"><span class="pre">int x[4]</span></tt></td><td><tt class="docutils literal"><span class="pre">array[4, cint]</span></tt></td></tr>
<tr><td><tt class="docutils literal"><span class="pre">int*</span></tt></td><td><tt class="docutils literal"><span class="pre">ptr int</span></tt></td></tr>
<tr><td><tt class="docutils literal"><span class="pre">char*</span></tt></td><td><tt class="docutils literal"><span class="pre">cstring</span></tt></td></tr>
<tr><td><tt class="docutils literal"><span class="pre">char**</span></tt></td><td><tt class="docutils literal"><span class="pre">cstringArray = ptr array [0..ArrayDummySize, cstring]</span></tt></td></tr>
</table>
</div>
<div class="slide">
<h1 id="data-exchange-with-c">Data exchange with C</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
2
3
4
5
6
</pre></td><td><pre id="listing_4" class="listing"><span class="Keyword">int</span> <span class="Identifier">sum</span><span class="Punctuation">(</span><span class="Keyword">int</span><span class="Operator">*</span> <span class="Identifier">x</span><span class="Punctuation">,</span> <span class="Identifier">size_t</span> <span class="Identifier">len</span><span class="Punctuation">)</span> <span class="Punctuation">{</span>
<span class="Keyword">int</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="DecNumber">0</span><span class="Punctuation">;</span>
<span class="Keyword">for</span> <span class="Punctuation">(</span><span class="Identifier">size_t</span> <span class="Identifier">i</span> <span class="Operator">=</span> <span class="DecNumber">0</span><span class="Punctuation">;</span> <span class="Identifier">i</span> <span class="Operator">&lt;</span> <span class="Identifier">len</span><span class="Punctuation">;</span> <span class="Identifier">i</span><span class="Operator">++</span><span class="Punctuation">)</span>
<span class="Identifier">result</span> <span class="Operator">+=</span> <span class="Identifier">x</span><span class="Punctuation">[</span><span class="Identifier">i</span><span class="Punctuation">]</span><span class="Punctuation">;</span>
<span class="Keyword">return</span> <span class="Identifier">result</span><span class="Punctuation">;</span>
<span class="Punctuation">}</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_4')">Select</button>
</div>
<div class="slide">
<h1 id="data-exchange-with-c">Data exchange with C</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
2
3
4
5
6
</pre></td><td><pre id="listing_5" class="listing"><span class="Keyword">int</span> <span class="Identifier">sum</span><span class="Punctuation">(</span><span class="Keyword">int</span><span class="Operator">*</span> <span class="Identifier">x</span><span class="Punctuation">,</span> <span class="Identifier">size_t</span> <span class="Identifier">len</span><span class="Punctuation">)</span> <span class="Punctuation">{</span>
<span class="Keyword">int</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="DecNumber">0</span><span class="Punctuation">;</span>
<span class="Keyword">for</span> <span class="Punctuation">(</span><span class="Identifier">size_t</span> <span class="Identifier">i</span> <span class="Operator">=</span> <span class="DecNumber">0</span><span class="Punctuation">;</span> <span class="Identifier">i</span> <span class="Operator">&lt;</span> <span class="Identifier">len</span><span class="Punctuation">;</span> <span class="Identifier">i</span><span class="Operator">++</span><span class="Punctuation">)</span>
<span class="Identifier">result</span> <span class="Operator">+=</span> <span class="Identifier">x</span><span class="Punctuation">[</span><span class="Identifier">i</span><span class="Punctuation">]</span><span class="Punctuation">;</span>
<span class="Keyword">return</span> <span class="Identifier">result</span><span class="Punctuation">;</span>
<span class="Punctuation">}</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_5')">Select</button><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_6" class="listing"><span class="Keyword">proc</span> <span class="Identifier">sum</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Keyword">ptr</span> <span class="Identifier">cint</span><span class="Punctuation">;</span> <span class="Identifier">len</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">cint</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importc</span><span class="Punctuation">:</span> <span class="StringLit">&quot;sum&quot;</span><span class="Punctuation">,</span> <span class="Identifier">cdecl</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;foo.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Keyword">proc</span> <span class="Identifier">callSum</span> <span class="Operator">=</span>
<span class="Keyword">var</span> <span class="Identifier">x</span> <span class="Operator">=</span> <span class="Operator">@</span><span class="Punctuation">[</span><span class="FloatNumber">1.</span><span class="Identifier">cint</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="Identifier">echo</span> <span class="Identifier">sum</span><span class="Punctuation">(</span><span class="Keyword">addr</span> <span class="Identifier">x</span><span class="Punctuation">[</span><span class="DecNumber">0</span><span class="Punctuation">]</span><span class="Punctuation">,</span> <span class="Identifier">x</span><span class="Operator">.</span><span class="Identifier">len</span><span class="Punctuation">)</span>
<span class="Keyword">var</span> <span class="Identifier">y</span> <span class="Operator">=</span> <span class="Punctuation">[</span><span class="FloatNumber">1.</span><span class="Identifier">cint</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="Identifier">echo</span> <span class="Identifier">sum</span><span class="Punctuation">(</span><span class="Keyword">addr</span> <span class="Identifier">y</span><span class="Punctuation">[</span><span class="DecNumber">0</span><span class="Punctuation">]</span><span class="Punctuation">,</span> <span class="Identifier">y</span><span class="Operator">.</span><span class="Identifier">len</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_6')">Select</button>
</div>
<div class="slide">
<h1 id="codegendecl-pragma">CodegenDecl pragma</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_7" class="listing"><span class="Keyword">var</span>
<span class="Identifier">a</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">codegenDecl</span><span class="Punctuation">:</span> <span class="StringLit">&quot;$# progmem $#&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span><span class="Punctuation">:</span> <span class="Identifier">int</span>
<span class="Keyword">proc</span> <span class="Identifier">myinterrupt</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">codegenDecl</span><span class="Punctuation">:</span> <span class="StringLit">&quot;__interrupt $# $#$#&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span>
<span class="Identifier">echo</span> <span class="StringLit">&quot;realistic interrupt handler&quot;</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_7')">Select</button>
</div>
<div class="slide">
<h1 id="wrapping-c">Wrapping C++</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
2
3
4
5
6
</pre></td><td><pre id="listing_8" class="listing"><span class="Keyword">class</span> <span class="Identifier">Foo</span> <span class="Punctuation">{</span>
<span class="Keyword">public</span><span class="Punctuation">:</span>
<span class="Keyword">int</span> <span class="Identifier">value</span><span class="Punctuation">;</span>
<span class="Keyword">int</span> <span class="Identifier">GetValue</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Punctuation">{</span> <span class="Keyword">return</span> <span class="Identifier">value</span><span class="Punctuation">;</span> <span class="Punctuation">}</span>
<span class="Keyword">int</span><span class="Operator">&amp;</span> <span class="Identifier">SetValue</span><span class="Punctuation">(</span><span class="Keyword">int</span> <span class="Identifier">x</span><span class="Punctuation">)</span> <span class="Punctuation">{</span> <span class="Identifier">field</span> <span class="Operator">=</span> <span class="Identifier">x</span><span class="Punctuation">;</span> <span class="Keyword">return</span> <span class="Operator">&amp;</span><span class="Identifier">field</span><span class="Punctuation">;</span> <span class="Punctuation">}</span>
<span class="Punctuation">}</span><span class="Punctuation">;</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_8')">Select</button><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_9" class="listing"><span class="Keyword">type</span>
<span class="Identifier">Foo</span><span class="Operator">*</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;Foo&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span> <span class="Keyword">object</span>
<span class="Identifier">value</span><span class="Operator">*:</span> <span class="Identifier">cint</span>
<span class="Keyword">proc</span> <span class="Identifier">getValue</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">this</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">Foo</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">cint</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;GetValue&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Keyword">proc</span> <span class="Identifier">setValue</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">this</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">Foo</span><span class="Punctuation">;</span> <span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">cint</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">cint</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;SetValue&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_9')">Select</button>
</div>
<div class="slide">
<h1 id="wrapping-c">Wrapping C++</h1><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
2
3
4
5
6
</pre></td><td><pre id="listing_10" class="listing"><span class="Keyword">class</span> <span class="Identifier">Foo</span> <span class="Punctuation">{</span>
<span class="Keyword">public</span><span class="Punctuation">:</span>
<span class="Keyword">int</span> <span class="Identifier">value</span><span class="Punctuation">;</span>
<span class="Keyword">int</span> <span class="Identifier">GetValue</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Punctuation">{</span> <span class="Keyword">return</span> <span class="Identifier">value</span><span class="Punctuation">;</span> <span class="Punctuation">}</span>
<span class="Keyword">int</span><span class="Operator">&amp;</span> <span class="Identifier">SetValue</span><span class="Punctuation">(</span><span class="Keyword">int</span> <span class="Identifier">x</span><span class="Punctuation">)</span> <span class="Punctuation">{</span> <span class="Identifier">field</span> <span class="Operator">=</span> <span class="Identifier">x</span><span class="Punctuation">;</span> <span class="Keyword">return</span> <span class="Operator">&amp;</span><span class="Identifier">field</span><span class="Punctuation">;</span> <span class="Punctuation">}</span>
<span class="Punctuation">}</span><span class="Punctuation">;</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_10')">Select</button><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_11" class="listing"><span class="Keyword">type</span>
<span class="Identifier">Foo</span><span class="Operator">*</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;Foo&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span> <span class="Keyword">object</span>
<span class="Identifier">value</span><span class="Operator">*:</span> <span class="Identifier">cint</span>
<span class="Keyword">proc</span> <span class="Identifier">getValue</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">this</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">Foo</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">cint</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;#.GetValue(@)&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Keyword">proc</span> <span class="Identifier">setValue</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">this</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">Foo</span><span class="Punctuation">;</span> <span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">cint</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">cint</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;#.SetValue(@)&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_11')">Select</button>
</div>
<div class="slide">
<h1 id="constructors">Constructors</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_12" class="listing"><span class="Keyword">class</span> <span class="Identifier">Foo</span> <span class="Punctuation">{</span>
<span class="Keyword">public</span><span class="Punctuation">:</span>
<span class="Keyword">int</span> <span class="Identifier">value</span><span class="Punctuation">;</span>
<span class="Keyword">int</span> <span class="Identifier">GetValue</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Punctuation">{</span> <span class="Keyword">return</span> <span class="Identifier">value</span><span class="Punctuation">;</span> <span class="Punctuation">}</span>
<span class="Keyword">int</span><span class="Operator">&amp;</span> <span class="Identifier">SetValue</span><span class="Punctuation">(</span><span class="Keyword">int</span> <span class="Identifier">x</span><span class="Punctuation">)</span> <span class="Punctuation">{</span> <span class="Identifier">field</span> <span class="Operator">=</span> <span class="Identifier">x</span><span class="Punctuation">;</span> <span class="Keyword">return</span> <span class="Operator">&amp;</span><span class="Identifier">field</span><span class="Punctuation">;</span> <span class="Punctuation">}</span>
<span class="Identifier">Foo</span><span class="Punctuation">(</span><span class="Keyword">int</span> <span class="Identifier">x</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">field</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">)</span> <span class="Punctuation">{</span><span class="Punctuation">}</span>
<span class="Punctuation">}</span><span class="Punctuation">;</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_12')">Select</button><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_13" class="listing"><span class="Keyword">type</span>
<span class="Identifier">Foo</span><span class="Operator">*</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;Foo&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span> <span class="Keyword">object</span>
<span class="Identifier">value</span><span class="Operator">*:</span> <span class="Identifier">cint</span>
<span class="Keyword">proc</span> <span class="Identifier">getValue</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">this</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">Foo</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">cint</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;#.GetValue(@)&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Keyword">proc</span> <span class="Identifier">setValue</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">this</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">Foo</span><span class="Punctuation">;</span> <span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">cint</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">var</span> <span class="Identifier">cint</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;#.SetValue(@)&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Keyword">proc</span> <span class="Identifier">constructFoo</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">cint</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">Foo</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;Foo(@)&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_13')">Select</button>
</div>
<div class="slide">
<h1 id="constructors">Constructors</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_14" class="listing"><span class="Identifier">Foo</span> <span class="Identifier">foo</span> <span class="Operator">=</span> <span class="Identifier">Foo</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="Keyword">auto</span> <span class="Identifier">foo</span> <span class="Operator">=</span> <span class="Identifier">Foo</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></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_14')">Select</button>
</div>
<div class="slide">
<h1 id="constructors">Constructors</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_15" class="listing"><span class="Identifier">Foo</span> <span class="Identifier">foo</span> <span class="Operator">=</span> <span class="Identifier">Foo</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="Comment">// Calls copy constructor!</span>
<span class="Keyword">auto</span> <span class="Identifier">foo</span> <span class="Operator">=</span> <span class="Identifier">Foo</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></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_15')">Select</button>
</div>
<div class="slide">
<h1 id="constructors">Constructors</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_16" class="listing"><span class="Identifier">Foo</span> <span class="Identifier">foo</span> <span class="Operator">=</span> <span class="Identifier">Foo</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="Comment">// Calls copy constructor!</span>
<span class="Keyword">auto</span> <span class="Identifier">foo</span> <span class="Operator">=</span> <span class="Identifier">Foo</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">Foo</span> <span class="Identifier">foo</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></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_16')">Select</button>
</div>
<div class="slide">
<h1 id="constructors">Constructors</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_17" class="listing"><span class="Keyword">proc</span> <span class="Identifier">constructFoo</span><span class="Operator">*</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">cint</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">Foo</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;Foo(@)&quot;</span><span class="Punctuation">,</span> <span class="Identifier">header</span><span class="Punctuation">:</span> <span class="StringLit">&quot;file.h&quot;</span><span class="Punctuation">,</span> <span class="Identifier">constructor</span><span class="Operator">.</span><span class="Punctuation">}</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_17')">Select</button><table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
2
3
4
5
6
</pre></td><td><pre id="listing_18" class="listing"><span class="Keyword">proc</span> <span class="Identifier">newFoo</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">cint</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">ptr</span> <span class="Identifier">Foo</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;new Foo(@)&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Keyword">let</span> <span class="Identifier">x</span> <span class="Operator">=</span> <span class="Identifier">newFoo</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="Keyword">proc</span> <span class="Identifier">cnew</span><span class="Operator">*</span><span class="Punctuation">[</span><span class="Identifier">T</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Identifier">T</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">ptr</span> <span class="Identifier">T</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;(new '*0#@)&quot;</span><span class="Punctuation">,</span> <span class="Identifier">nodecl</span><span class="Operator">.</span><span class="Punctuation">}</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_18')">Select</button>
</div>
<div class="slide">
<h1 id="generics">Generics</h1><p>For example:</p>
<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_19" class="listing"><span class="Keyword">type</span> <span class="Identifier">Input</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;System::Input&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span> <span class="Keyword">object</span>
<span class="Keyword">proc</span> <span class="Identifier">getSubsystem</span><span class="Operator">*</span><span class="Punctuation">[</span><span class="Identifier">T</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Keyword">ptr</span> <span class="Identifier">T</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">importcpp</span><span class="Punctuation">:</span> <span class="StringLit">&quot;SystemManager::getSubsystem&lt;'*0&gt;()&quot;</span><span class="Punctuation">,</span> <span class="Identifier">nodecl</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Keyword">let</span> <span class="Identifier">x</span><span class="Punctuation">:</span> <span class="Keyword">ptr</span> <span class="Identifier">Input</span> <span class="Operator">=</span> <span class="Identifier">getSubsystem</span><span class="Punctuation">[</span><span class="Identifier">Input</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_19')">Select</button><p>Produces:</p>
<table class="line-nums-table"><tbody><tr><td class="blob-line-nums"><pre class="line-nums">1
</pre></td><td><pre id="listing_20" class="listing"><span class="Identifier">x</span> <span class="Operator">=</span> <span class="Identifier">SystemManager</span><span class="Punctuation">:</span><span class="Punctuation">:</span><span class="Identifier">getSubsystem</span><span class="Operator">&lt;</span><span class="Identifier">System</span><span class="Punctuation">:</span><span class="Punctuation">:</span><span class="Identifier">Input</span><span class="Operator">&gt;</span><span class="Punctuation">(</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_20')">Select</button>
</div>
<div class="slide">
<h1 id="emit-pragma">Emit pragma</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
</pre></td><td><pre id="listing_21" class="listing"><span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">emit</span><span class="Punctuation">:</span> <span class="LongStringLit">&quot;&quot;&quot;
static int cvariable = 420;
&quot;&quot;&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">push</span> <span class="Identifier">stackTrace</span><span class="Punctuation">:</span><span class="Identifier">off</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Keyword">proc</span> <span class="Identifier">embedsC</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Operator">=</span>
<span class="Keyword">var</span> <span class="Identifier">nimVar</span> <span class="Operator">=</span> <span class="DecNumber">89</span>
<span class="Comment"># use backticks to access Nim symbols within an emit section:</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">emit</span><span class="Punctuation">:</span> <span class="LongStringLit">&quot;&quot;&quot;fprintf(stdout, &quot;%d\n&quot;, cvariable + (int)`nimVar`);&quot;&quot;&quot;</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">pop</span><span class="Operator">.</span><span class="Punctuation">}</span>
<span class="Identifier">embedsC</span><span class="Punctuation">(</span><span class="Punctuation">)</span></pre></td></tr></tbody></table><button onclick="copyToClipboard('listing_21')">Select</button>
</div>
<div class="slide">
<h1 id="questions">Questions?</h1>
</body>
</div>
</html>