<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>list on
A Scripter's Notes</title><link>https://scripter.co/tags/list/</link><description>Recent content in list
on A Scripter's Notes</description><language>en-us</language><managingEditor>kaushal.modi@gmail.com (Kaushal Modi)</managingEditor><webMaster>kaushal.modi@gmail.com (Kaushal Modi)</webMaster><lastBuildDate>Wed, 22 Apr 2026 08:24:58 -0400</lastBuildDate><generator>Hugo -- gohugo.io</generator><docs>https://validator.w3.org/feed/docs/rss2.html</docs><atom:link href="https://scripter.co/tags/list/index.xml" rel="self" type="application/rss+xml"/><item><title>Binding Nim to C++ std::list</title><link>https://scripter.co/binding-nim-to-c-plus-plus-std-list/</link><description>&lt;blockquote>How to use the Nim &lt;code>importcpp&lt;/code> pragma to bind to C++ Standard Template
Libraries like &lt;code>std::list&lt;/code>.&lt;/blockquote>&lt;div class="ox-hugo-toc toc">
&lt;div class="heading">Table of Contents&lt;/div>
&lt;ul>
&lt;li>&lt;a href="#nim-cpp-bindings-goal">Goal: Be able to easily access C++ &lt;code>std::list&lt;/code> elements&lt;/a>&lt;/li>
&lt;li>&lt;a href="#importcpp-pragma">&lt;code>importcpp&lt;/code> pragma&lt;/a>&lt;/li>
&lt;li>&lt;a href="#bindings-to-the-c-plus-plus-list-header">Bindings to the C++ &lt;code>&amp;lt;list&amp;gt;&lt;/code> header&lt;/a>&lt;/li>
&lt;li>&lt;a href="#test-c-plus-plus-code">Test C++ code&lt;/a>&lt;/li>
&lt;li>&lt;a href="#test-nim-code">Test Nim code&lt;/a>&lt;/li>
&lt;li>&lt;a href="#extending-the-std-list-api-in-nim">Extending the &lt;code>std::list&lt;/code> API in Nim&lt;/a>&lt;/li>
&lt;li>&lt;a href="#final-code">Final Code&lt;/a>&lt;/li>
&lt;li>&lt;a href="#summary">Summary&lt;/a>&lt;/li>
&lt;li>&lt;a href="#references">References&lt;/a>&lt;/li>
&lt;/ul>
&lt;/div>
&lt;!--endtoc-->
&lt;p>I like ❤️ using &lt;a href="https://nim-lang.org/">Nim&lt;/a> as my go-to programming language &amp;ndash; be it for
scripting, some CLI tool or any &lt;a href="https://scripter.co/tags/nim">other application&lt;/a>. The nice thing when
using Nim is that you don&amp;rsquo;t have to throw away any of the past work
done in C or C++, because it is pretty easy to bind those C/C++
libraries and extend their functionality in Nim.&lt;/p>
&lt;p>To demonstrate that extensibility, in this post, I will add some new
API in Nim that builds on top of the &lt;code>std::list&lt;/code> &lt;abbr aria-label="Standard Template Library" tabindex=0>STL&lt;/abbr>
&lt;span class="sidenote-number">&lt;small class="sidenote">
The C++ STL is a set of template classes to provide common programming
data structures and functions such as lists, stacks, arrays, etc.
&lt;/small>&lt;/span>
library. I won&amp;rsquo;t be re-writing any of the &lt;code>std::list&lt;/code> methods in Nim
&amp;mdash; No need to re-invent the &lt;code>std::list&lt;/code> wheel in Nim! &amp;mdash; I will
directly use the C++ &lt;code>std::list&lt;/code> methods to build new API functions in
Nim. 🤯&lt;/p>
&lt;h2 id="nim-cpp-bindings-goal">Goal: Be able to easily access C++ &lt;code>std::list&lt;/code> elements&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#nim-cpp-bindings-goal">#&lt;/a>&lt;/h2>
&lt;p>From the &lt;a href="https://en.cppreference.com/w/cpp/container/list">&lt;em>std::list&lt;/em> reference&lt;/a>, we can see that we cannot access a
&lt;em>list&lt;/em> element by index using syntax like &lt;code>list_obj[index]&lt;/code>. At the
end of this post, you will be able to convert C++ &lt;em>list&lt;/em> objects to
Nim &lt;em>sequences&lt;/em> and make the &lt;em>list&lt;/em> data super-accessible &amp;mdash; You can
print them using &lt;code>echo&lt;/code>, use built-in libraries like &lt;a href="https://nim-lang.github.io/Nim/sequtils">&lt;code>sequtils&lt;/code>&lt;/a>, and
more.&lt;/p>
&lt;h2 id="importcpp-pragma">&lt;code>importcpp&lt;/code> pragma&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#importcpp-pragma">#&lt;/a>&lt;/h2>
&lt;p>The first thing we&amp;rsquo;ll need is to be able to call the C++ &lt;em>list&lt;/em>
methods directly in Nim, and we will need the &lt;code>importcpp&lt;/code> pragma
&lt;span class="sidenote-number">&lt;small class="sidenote">
This post will highlight some key features of this pragma. For full
details, check out this section in the Nim Manual &lt;a href="#ref-importcpp">linked&lt;/a> in
References.
&lt;/small>&lt;/span>
for that. This pragma is used to import a C++ &lt;em>method&lt;/em> or &lt;em>type&lt;/em> into
the Nim space.&lt;/p>
&lt;p>This pragma is typically used like this:&lt;/p>
&lt;p>&lt;a id="code-snippet--nim-bindings-importcpp">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nim" data-lang="nim">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{.&lt;/span>&lt;span class="n">link&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;/path/to/libCppCode.so&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">type&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MyNimType&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;MyCppType&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;libCppCode.hpp&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">object&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">myNimProc&lt;/span>&lt;span class="p">():&lt;/span> &lt;span class="n">MyNimType&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;myCppMethod&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;libCppCode.hpp&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">foo&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">MyNimProc&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--nim-bindings-importcpp">Code Snippet 1&lt;/a>:&lt;/span>
General use of &lt;code>importcpp&lt;/code> pragma
&lt;/div>
&lt;ul>
&lt;li>&lt;code>MyCppType&lt;/code> type from the C++ library is mapped to &lt;code>MyNimType&lt;/code>
&lt;span class="sidenote-number">&lt;small class="sidenote">
You would typically name the type and method identifiers same same
when binding external libraries to Nim, just to prevent any
confusion. You can name them differently if you want to though.
&lt;/small>&lt;/span>
in the Nim code.&lt;/li>
&lt;li>&lt;code>myCppMethod&lt;/code> from C++ is mapped to &lt;code>myNimProc&lt;/code>.&lt;/li>
&lt;li>Then the code can call that &lt;code>myNimProc&lt;/code> in the Nim code along with
other Nim stuff.&lt;/li>
&lt;li>The &lt;a href="https://nim-lang.github.io/Nim/manual.html#noalias-pragma-link-pragma">&lt;code>link&lt;/code> pragma&lt;/a> is needed if we need to tell the Nim compiler
where to find the implementation
&lt;span class="sidenote-number">&lt;small class="sidenote">
For the case of linking to the C++ STL &lt;code>&amp;lt;list&amp;gt;&lt;/code> header, we do not
need to provide the &lt;code>std::list&lt;/code> implementation because the GNU GCC
compiler provides that.
&lt;/small>&lt;/span>
of linked methods.&lt;/li>
&lt;/ul>
&lt;h2 id="bindings-to-the-c-plus-plus-list-header">Bindings to the C++ &lt;code>&amp;lt;list&amp;gt;&lt;/code> header&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#bindings-to-the-c-plus-plus-list-header">#&lt;/a>&lt;/h2>
&lt;p>Below code snippet shows us all the &lt;code>&amp;lt;list&amp;gt;&lt;/code> header bindings we will
need to meet the &lt;a href="#nim-cpp-bindings-goal">goal&lt;/a> of this post.&lt;/p>
&lt;p>&lt;a id="code-snippet--nim-std-list-bindings">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt" id="org-coderef--045394-1">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--045394-1">1&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--045394-2">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--045394-2">2&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--045394-3">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--045394-3">3&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--045394-4">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--045394-4">4&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--045394-5">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--045394-5">5&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--045394-6">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--045394-6">6&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--045394-7">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--045394-7">7&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--045394-8">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--045394-8">8&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-nim" data-lang="nim">&lt;span class="line">&lt;span class="cl">&lt;span class="k">type&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">List&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;std::list&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">object&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ListIter&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;std::list&amp;lt;&amp;#39;0&amp;gt;::iterator&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">object&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">initList&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">():&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;std::list&amp;lt;&amp;#39;*0&amp;gt;()&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">constructor&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">size&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">csize_t&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;size&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">begin&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">ListIter&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;begin&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">`[]`&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">it&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ListIter&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;*#&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--nim-std-list-bindings">Code Snippet 2&lt;/a>:&lt;/span>
Nim bindings for basic &lt;code>std::list&lt;/code> object types and methods
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="#org-coderef--045394-2">Line 2&lt;/a> binds the C++ &lt;code>std::list&lt;/code> type with the Nim
&lt;code>List&lt;/code> type. So, a &lt;code class="code-inline language-nim">&lt;span class="n">List&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">cint&lt;/span>&lt;span class="o">]&lt;/span>&lt;/code> type in Nim
get mapped to &lt;code class="code-inline language-cpp">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">list&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;/code> in C++.&lt;/li>
&lt;li>&lt;a href="#org-coderef--045394-3">Line 3&lt;/a> binds the C++ &lt;code>iterator&lt;/code> type from
&lt;code>std::list&lt;/code> with the Nim type &lt;code>ListIter&lt;/code>.
&lt;ul>
&lt;li>Note special pattern &lt;code>&amp;lt;'0&amp;gt;&lt;/code>
&lt;span class="sidenote-number">&lt;small class="sidenote">
See &lt;a href="https://nim-lang.github.io/Nim/manual.html#importcpp-pragma-importcpp-for-procs">📖 &lt;code>importcpp&lt;/code> for procs&lt;/a> for details on such special
patterns.
&lt;/small>&lt;/span>
in the &lt;code>importcpp&lt;/code> argument for this binding. The apostrophe
followed by an integer &lt;em>i&lt;/em> is replaced by the &lt;em>i&amp;rsquo;th&lt;/em> parameter in
the &lt;code>ListIter[T]&lt;/code> type i.e. the &lt;code>T&lt;/code> type. So, &lt;code class="code-inline language-nim">&lt;span class="n">ListIter&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">cint&lt;/span>&lt;span class="o">]&lt;/span>&lt;/code> in Nim gets mapped to &lt;code class="code-inline language-cpp">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">list&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;::&lt;/span>&lt;span class="n">iterator&lt;/span>&lt;/code> in C++.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#org-coderef--045394-5">Line 5&lt;/a> binds the &lt;em>list&lt;/em> constructor &lt;code>()&lt;/code> with
the Nim proc &lt;code>initList[T]()&lt;/code>. As the constructor returns a &lt;em>list&lt;/em>
type, the return type on the Nim side set to the equivalent
&lt;code>List[T]&lt;/code>.
&lt;ul>
&lt;li>Note the slightly different pattern in the &lt;code>importcpp&lt;/code> argument
for this binding: &lt;code>&amp;lt;'*​0&amp;gt;&lt;/code>. If we had &lt;strong>not&lt;/strong> used that &lt;em>asterisk&lt;/em>
there, that would have mapped to the proc&amp;rsquo;s return type,
&lt;code>List[T]&lt;/code>. But we want the C++ mapped constructor to look like
&lt;code class="code-inline language-cpp">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">list&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">()&lt;/span>&lt;/code> i.e. we need &lt;code>T&lt;/code> and not
&lt;code>List[T]&lt;/code> in the C++ template type. The &lt;code>*&lt;/code> does the job of
deriving &lt;code>T&lt;/code> from its &amp;ldquo;container&amp;rdquo; type &lt;code>List[T]&lt;/code>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>In lines &lt;a href="#org-coderef--045394-6">6&lt;/a> and &lt;a href="#org-coderef--045394-7">7&lt;/a>, &lt;code>size&lt;/code> and
&lt;code>begin&lt;/code> on C++ get mapped to same named procs on the Nim side, with
the correct return types.
&lt;ul>
&lt;li>&lt;a href="https://nim-lang.github.io/Nim/system.html#csize_t">&lt;code>csize_t&lt;/code>&lt;/a> is a Nim type that maps to the C &lt;code>size_t&lt;/code> type.&lt;/li>
&lt;li>As &lt;a href="https://en.cppreference.com/w/cpp/container/list/begin">&lt;code>begin&lt;/code>&lt;/a> returns an &lt;em>iterator&lt;/em> handle, the return type of
&lt;code>begin&lt;/code> is &lt;code>ListIter[T]&lt;/code>.&lt;/li>
&lt;li>Note that I did not use the &lt;code>std::list&lt;/code> prefix for these mappings,
because these procs will always be called in context of their
arguments. For example, &lt;code class="code-inline language-nim">&lt;span class="n">listIterVar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">()&lt;/span>&lt;/code>
in Nim will map to &lt;code class="code-inline language-cpp">&lt;span class="n">listIterVar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">()&lt;/span>&lt;/code> in
C++..&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#org-coderef--045394-8">Line 8&lt;/a> maps the C/C++ &lt;em>indirection operator &lt;code>*&lt;/code>&lt;/em>
with Nim &lt;em>dereferencing operator &lt;code>[]&lt;/code>&lt;/em>. The input argument type is
an &lt;em>iterator&lt;/em>. So if &lt;code>iter&lt;/code> is a variable of type &lt;code>ListIter[cint]&lt;/code>,
&lt;code class="code-inline language-nim">&lt;span class="n">iter&lt;/span>&lt;span class="o">[]&lt;/span>&lt;/code> will return the value of type &lt;code>cint&lt;/code>
pointed to by that iterator.
&lt;ul>
&lt;li>The &lt;code>importcpp&lt;/code> argument for this mapping has a different pattern:
&lt;code>*#&lt;/code>. The &lt;code>#&lt;/code> is replaced by the first argument of the proc:
&lt;code>iter&lt;/code>. So &lt;code class="code-inline language-nim">&lt;span class="n">iter&lt;/span>&lt;span class="o">[]&lt;/span>&lt;/code> in Nim code
&lt;span class="sidenote-number">&lt;small class="sidenote">
&lt;code>iter[]&lt;/code> is same as writing &lt;code>`[]`(iter)&lt;/code>, but one might agree that the
former style is better and more readable.
&lt;/small>&lt;/span>
will translate to &lt;code class="code-inline language-cpp">&lt;span class="o">*&lt;/span>&lt;span class="err">​&lt;/span>&lt;span class="n">iter&lt;/span>&lt;/code>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> on the C++
side.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="test-c-plus-plus-code">Test C++ code&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#test-c-plus-plus-code">#&lt;/a>&lt;/h2>
&lt;p>We have the &lt;code>&amp;lt;list&amp;gt;&lt;/code> bindings ready, but now we need some test C++
code which will be our &amp;ldquo;library&amp;rdquo; for use in the Nim code.&lt;/p>
&lt;p>So here it is:&lt;/p>
&lt;p>&lt;a id="code-snippet--nim-bindings-cpp-test-code">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">generateList&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">num&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">list&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">retList&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">num&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">retList&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--nim-bindings-cpp-test-code">Code Snippet 3&lt;/a>:&lt;/span>
Dummy C++ "library" that we will extend in Nim
&lt;/div>
&lt;p>The C++ &amp;ldquo;library&amp;rdquo; here has a &lt;code>generateList&lt;/code> API with expects an
integer &lt;code>num&lt;/code> as the first arg, and it save a &lt;code>num&lt;/code> element
&lt;code>std::list&amp;lt;int&amp;gt;&lt;/code> object to the pointer passed as its second arg.&lt;/p>
&lt;p>Now, we can either go the conventional route of compiling this code to
a shared object (&lt;code>.so&lt;/code> or &lt;code>.dll&lt;/code>) and then linking it to the Nim code
using the &lt;a href="https://nim-lang.github.io/Nim/manual.html#noalias-pragma-link-pragma">&lt;code>link&lt;/code> pragma&lt;/a>.&lt;/p>
&lt;div class="verse">
&lt;p>    But.. that is boring 💤&lt;br />&lt;/p>
&lt;/div>
&lt;p>We will do something cooler.. we will inline that C++ code in Nim
using the &lt;a href="https://nim-lang.github.io/Nim/manual.html#noalias-pragma-emit-pragma">&lt;code>emit&lt;/code> pragma&lt;/a> and bind to it using &lt;code>importcpp&lt;/code> just as we
did for the &lt;code>&amp;lt;list&amp;gt;&lt;/code> methods! 😎&lt;/p>
&lt;p>&lt;a id="code-snippet--nim-bindings-emit">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nim" data-lang="nim">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{.&lt;/span>&lt;span class="n">emit&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">void generateList(int num, std::list&amp;lt;int&amp;gt; *retList)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> for (int i = 0; i &amp;lt; num; ++i) {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> retList-&amp;gt;push_back(i * 2);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">&amp;#34;&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">generateList&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">cint&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">lPtr&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="k">ptr&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">cint&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;generateList(@)&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--nim-bindings-emit">Code Snippet 4&lt;/a>:&lt;/span>
Inlining C++ code in Nim using the &lt;code>emit&lt;/code> pragma and then binding to it using &lt;code>importcpp&lt;/code>
&lt;/div>
&lt;p>Here, I also introduce you readers to a new &lt;code>importcpp&lt;/code> pattern:
&lt;code>@&lt;/code>. The &lt;code>@&lt;/code> expands to comma-separated arguments passed on the Nim
side.&lt;/p>
&lt;p>Note the equivalence between the C++ function signature
&lt;code class="code-inline language-cpp">&lt;span class="kt">void&lt;/span> &lt;span class="n">generateList&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">num&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">list&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="err">​&lt;/span>&lt;span class="n">retList&lt;/span>&lt;span class="p">)&lt;/span>&lt;/code> and Nim proc signature &lt;code class="code-inline language-nim">&lt;span class="k">proc &lt;/span>&lt;span class="nf">generateList&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">cint&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">lPtr&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="k">ptr&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">cint&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">)&lt;/span>&lt;/code>.&lt;/p>
&lt;h2 id="test-nim-code">Test Nim code&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#test-nim-code">#&lt;/a>&lt;/h2>
&lt;p>Below Nim code will call the test C++ &lt;code>generateList&lt;/code> method defined
above and then print the whole &lt;em>list&lt;/em> object after converting it to a
Nim sequence.&lt;/p>
&lt;p>&lt;a id="code-snippet--nim-bindings-test-nim-code">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nim" data-lang="nim">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">l&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">initList&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">cint&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">generateList&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">addr&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">toSeq&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">echo&lt;/span> &lt;span class="s">&amp;#34;sequence = &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">s&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--nim-bindings-test-nim-code">Code Snippet 5&lt;/a>:&lt;/span>
Test Nim code that will call the &lt;code>generateList&lt;/code> method implemented in C++
&lt;/div>
&lt;ul>
&lt;li>In above snippet, &lt;a href="#org-coderef--045394-5">&lt;code>initList&lt;/code>&lt;/a> bindings defined in
&lt;a href="#code-snippet--nim-std-list-bindings">Code Snippet 2&lt;/a> is used to initialize the &lt;em>list&lt;/em> object
&lt;code>l&lt;/code>.&lt;/li>
&lt;li>Its address or pointer is passed to &lt;code>generateList&lt;/code> which will
populate the Nim allocated memory with 10 elements.&lt;/li>
&lt;li>Then we call a &lt;code>toSeq&lt;/code> proc (that we will define in the next
section) to convert that &lt;em>list&lt;/em> to a Nim sequence.&lt;/li>
&lt;li>Now that the &lt;em>list&lt;/em> object is converted to a Nim sequence, printing
it out as easy as you see above 😄.&lt;/li>
&lt;/ul>
&lt;h2 id="extending-the-std-list-api-in-nim">Extending the &lt;code>std::list&lt;/code> API in Nim&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#extending-the-std-list-api-in-nim">#&lt;/a>&lt;/h2>
&lt;p>The &lt;a href="#nim-cpp-bindings-goal">end goal&lt;/a> is to be able to write a &lt;code>toSeq&lt;/code> proc that can convert a
&lt;code>std::list&lt;/code> object to a Nim sequence. Here&amp;rsquo;s a psuedo-code I began
before it evolved into &lt;a href="#code-snippet--nim-bindings-toSeq">Code Snippet 7&lt;/a>.&lt;/p>
&lt;p>&lt;a id="code-snippet--nim-bindings-toSeq-pseudo">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">proc toSeq (l: list_obj): sequence
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> lBegin = handle to the iterator for the beginning of list_obj; use `begin`
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> lSize = number of elements in list_obj; use `size`
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> lIter = lBegin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for idx in 0 ..&amp;lt; lSize:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sequence[idx] = *lIter; use the `[]` dereferencing operator
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> lIter = pointer to the next element; use `next` from &amp;lt;iterator&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--nim-bindings-toSeq-pseudo">Code Snippet 6&lt;/a>:&lt;/span>
Pseudocode on how I plan to implement &lt;code>toSeq&lt;/code>
&lt;/div>
&lt;p>As it turned out, the real Nim code wasn&amp;rsquo;t longer or more complicated
than the pseudocode 😆.&lt;/p>
&lt;p>&lt;a id="code-snippet--nim-bindings-toSeq">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt" id="org-coderef--7ad52f-1">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--7ad52f-1">1&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--7ad52f-2">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--7ad52f-2">2&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--7ad52f-3">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--7ad52f-3">3&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--7ad52f-4">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--7ad52f-4">4&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--7ad52f-5">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--7ad52f-5">5&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--7ad52f-6">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--7ad52f-6">6&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--7ad52f-7">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--7ad52f-7">7&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--7ad52f-8">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--7ad52f-8">8&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--7ad52f-9">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--7ad52f-9">9&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-nim" data-lang="nim">&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">next&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">it&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ListIter&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">ListIter&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;next(@)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;iterator&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">toSeq&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="kt">seq&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="o">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">newSeq&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">it&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">begin&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="p">..&lt;/span>&lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">it&lt;/span>&lt;span class="o">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">it&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">it&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">next&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--nim-bindings-toSeq">Code Snippet 7&lt;/a>:&lt;/span>
Adding new API &lt;code>toSeq&lt;/code> for &lt;code>std::list&lt;/code> objects
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="#org-coderef--7ad52f-1">Line 1&lt;/a> - We needed a binding to the &lt;a href="https://en.cppreference.com/w/cpp/iterator/next">&lt;code>std::next&lt;/code>&lt;/a>
method from iterator so that we can increment the iterator starting
from the &lt;code>begin()&lt;/code> returned value.&lt;/li>
&lt;li>&lt;a href="#org-coderef--7ad52f-4">Line 4&lt;/a> - We already know the size of the &lt;em>list&lt;/em>
object, so we pre-allocated the Nim sequence to the same size by
using the &lt;a href="https://nim-lang.github.io/Nim/system.html#newSeq">&lt;code>newSeq&lt;/code>&lt;/a> proc.&lt;/li>
&lt;li>Then rest of the code follows the idea presented in the pseudocode
above.&lt;/li>
&lt;/ul>
&lt;h2 id="final-code">Final Code&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#final-code">#&lt;/a>&lt;/h2>
&lt;p>The final code to (i) wrap the &lt;code>&amp;lt;list&amp;gt;&lt;/code> types and methods and (ii) one
method from &lt;code>&amp;lt;iterator&amp;gt;&lt;/code>, and (iii) define a proc for converting
&lt;code>std::list&lt;/code> objects to Nim sequences was only 22 lines! (including
comments and blank lines)&lt;/p>
&lt;details>
&lt;summary>Click here to see the full code + output&lt;/summary>
&lt;div class="details">
&lt;p>&lt;a id="code-snippet--nim-bindings-full-code">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-nim" data-lang="nim">&lt;span class="line">&lt;span class="cl">&lt;span class="k">when&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">defined&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">error&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;This file needs to be compiled with cpp backend: Run &amp;#39;nim -b:cpp r &amp;lt;file&amp;gt;&amp;#39;.&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd">## &amp;lt;list&amp;gt; bindings -- https://en.cppreference.com/w/cpp/container/list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">type&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">List&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;std::list&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">object&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ListIter&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;std::list&amp;lt;&amp;#39;0&amp;gt;::iterator&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">object&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">initList&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">():&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;std::list&amp;lt;&amp;#39;*0&amp;gt;()&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">constructor&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">size&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">csize_t&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;size&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">begin&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">ListIter&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;begin&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">`[]`&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">it&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ListIter&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;*#&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;list&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd">## std::list processing procs and iterators&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">next&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">it&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ListIter&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">ListIter&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;next(@)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">header&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;lt;iterator&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">toSeq&lt;/span>&lt;span class="o">*[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="kt">seq&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="o">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">newSeq&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">it&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">begin&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="p">..&lt;/span>&lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">it&lt;/span>&lt;span class="o">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">it&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">it&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">next&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd">## Test&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">when&lt;/span> &lt;span class="n">isMainModule&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{.&lt;/span>&lt;span class="n">emit&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> void generateList(int num, std::list&amp;lt;int&amp;gt; *retList)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> for (int i = 0; i &amp;lt; num; ++i) {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> retList-&amp;gt;push_back(i * 2);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">proc &lt;/span>&lt;span class="nf">generateList&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">cint&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">lPtr&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="k">ptr&lt;/span> &lt;span class="n">List&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">cint&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{.&lt;/span>&lt;span class="n">importcpp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;generateList(@)&amp;#34;&lt;/span>&lt;span class="p">.}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">l&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">initList&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">cint&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">generateList&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">addr&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">toSeq&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">echo&lt;/span> &lt;span class="s">&amp;#34;sequence = &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">s&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">echo&lt;/span> &lt;span class="s">&amp;#34;first elem = &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">echo&lt;/span> &lt;span class="s">&amp;#34;elem 5 = &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">echo&lt;/span> &lt;span class="s">&amp;#34;last elem = &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="p">^&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--nim-bindings-full-code">Code Snippet 8&lt;/a>:&lt;/span>
Full Nim solution for converting &lt;code>std::list&lt;/code> to a Nim sequence, with test C++ code
&lt;/div>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">sequence = @[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">first elem = 0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">elem 5 = 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">last elem = 18
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
&lt;/details>
&lt;p>You can try this code by saving to a &lt;code>list_to_seq.nim&lt;/code> file and
running &lt;code>nim -b:cpp r list_to_seq.nim&lt;/code>.&lt;/p>
&lt;p>Alternatively, you can paste this code on &lt;a href="https://play.nim-lang.org/">https://play.nim-lang.org/&lt;/a>,
set the &amp;lsquo;Compilation target&amp;rsquo; to &lt;strong>C++&lt;/strong> and hit the yellow &amp;lsquo;Run!&amp;rsquo;
button.&lt;/p>
&lt;h2 id="summary">Summary&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#summary">#&lt;/a>&lt;/h2>
&lt;p>It becomes fairly easy to map any C++ (or C) library to Nim. Once that
it done, you can leverage the power of Nim to extend that mapped
library or manipulate data generated by that library. And you do not
need to be a C++ programmer to do so (I am not).&lt;/p>
&lt;p>The folks on &lt;a href="https://forum.nim-lang.org/">Nim Forum&lt;/a>, &lt;a href="https://discord.gg/nim">Discord&lt;/a> and elsewhere have been very generous
with their help and support, and that&amp;rsquo;s one of the main reasons it&amp;rsquo;s a
joy to use Nim. 🙏&lt;/p>
&lt;h2 id="references">References&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#references">#&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>&lt;span class="org-target" id="ref-importcpp">&lt;/span>📖 &lt;a href="https://nim-lang.github.io/Nim/manual.html#noalias-pragma-importcpp-pragma">Nim Manual &amp;ndash; &lt;code>importcpp&lt;/code> pragma&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.cppreference.com/w/cpp/container/list">C++ &lt;code>std::list&lt;/code> reference&lt;/a>&lt;/li>
&lt;li>Nim &lt;a href="https://github.com/Clonkk/nim-cppstl">&lt;code>cppstl&lt;/code>&lt;/a>
&lt;span class="sidenote-number">&lt;small class="sidenote">
This package contains bindings to &lt;code>std::string&lt;/code>, &lt;code>std::vector&lt;/code> and
&lt;code>std::complex&lt;/code> as of &lt;span class="timestamp-wrapper">&lt;span class="timestamp">&amp;lt;2022-03-10 Thu&amp;gt;&lt;/span>&lt;/span>.
&lt;/small>&lt;/span>
package &amp;ndash; can be installed using &lt;code>nimble install cppstl&lt;/code>&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>I have almost no experience with coding in C++; I got help with
this &lt;code>importcpp: *#&lt;/code> binding from user &lt;em>sls1005&lt;/em> on &lt;a href="https://forum.nim-lang.org/t/8994">this Nim Forums
thread&lt;/a>. Thank you!&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description><author>Kaushal.Modi@fakeEmailToMakeValidatorHappy.com (Kaushal Modi)</author><category domain="https://scripter.co/categories/programming">programming</category><category domain="https://scripter.co/tags/nim">nim</category><category domain="https://scripter.co/tags/binding">binding</category><category domain="https://scripter.co/tags/cpp">cpp</category><category domain="https://scripter.co/tags/stl">stl</category><category domain="https://scripter.co/tags/list">list</category><category domain="https://scripter.co/tags/100daystooffload">100DaysToOffload</category><guid>https://scripter.co/binding-nim-to-c-plus-plus-std-list/</guid><pubDate>Mon, 14 Mar 2022 01:49:00 -0400</pubDate></item></channel></rss>