<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: ringabout</title>
    <description>The latest articles on Forem by ringabout (@ringabout).</description>
    <link>https://forem.com/ringabout</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F332324%2Fb22e6114-6f61-48f6-bf34-567dfce0df05.jpeg</url>
      <title>Forem: ringabout</title>
      <link>https://forem.com/ringabout</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ringabout"/>
    <language>en</language>
    <item>
      <title>Contribute to the Python-like Nim language</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Mon, 03 Apr 2023 14:49:37 +0000</pubDate>
      <link>https://forem.com/ringabout/contribute-to-the-python-like-nim-language-36b2</link>
      <guid>https://forem.com/ringabout/contribute-to-the-python-like-nim-language-36b2</guid>
      <description>&lt;h2&gt;
  
  
  Progress
&lt;/h2&gt;

&lt;h3&gt;
  
  
  chores
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21590"&gt;fixes changelog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21583"&gt;fixes booting warnings&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  create type bound operations for calls in the method dispatcher for ORC
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21594"&gt;fixes #21592; create type bound operations for calls in the method dispatcher for ORC&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;
  &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;RootObj&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;

&lt;span class="k"&gt;method&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"not impl"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It now works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write an RFC for adding compiler support for object construction shorthand
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/RFCs/issues/517"&gt;compiler support for object construction shorthand&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  [PR] disable BareExcept warning in panics:on mode
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21605"&gt;disable BareExcept warning in panics:on mode&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;newException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CatchableError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"catched"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;discard&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;--panics:on&lt;/code&gt;, the compiler does not give &lt;code&gt;BareExcept&lt;/code&gt; warnings.&lt;/p&gt;

&lt;h3&gt;
  
  
  [PR] warn on overloaded =copy with refc
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21606"&gt;fixes #20846; fixes #21427; warn on overloaded =copy with refc&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  [PR] implement =dup hook eliminating wasMoved and =copy pairs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21586"&gt;implement =dup hook eliminating wasMoved and =copy pairs&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;`=dup`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nimIncRef&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;=dup&lt;/code&gt; hook is for optimization. The compiler sometimes generates &lt;code&gt;=wasMoved(x); =copy(x, y)&lt;/code&gt;. But &lt;code&gt;=wasMoved&lt;/code&gt; is unnecessary in this case since it is going to be rewritten for sure. It should be replaced by &lt;code&gt;x = =dup(y)&lt;/code&gt; instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weekly collection
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9908"&gt;https://forum.nim-lang.org/t/9908&lt;/a&gt; (2/19)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9940"&gt;https://forum.nim-lang.org/t/9940&lt;/a&gt; (2/26)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9970"&gt;https://forum.nim-lang.org/t/9970&lt;/a&gt; (3/5)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9989"&gt;https://forum.nim-lang.org/t/9989&lt;/a&gt; (3/12)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/10024"&gt;https://forum.nim-lang.org/t/10024&lt;/a&gt; (3/19)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/10040"&gt;https://forum.nim-lang.org/t/10040&lt;/a&gt; (3/26)&lt;/p&gt;

&lt;h2&gt;
  
  
  Participating in contributions
&lt;/h2&gt;

&lt;p&gt;Following &lt;a href="https://github.com/nim-lang/RFCs/issues/513"&gt;The Roadmap 2023 for community building &lt;/a&gt;, you could join us in &lt;a href="https://matrix.to/#/!ZmWXggMgfkKpcLbQkB:matrix.org?via=matrix.org"&gt;the matrix space&lt;/a&gt; where we discuss how to build a community. We appreciate doable suggestions and helps, such as improving the workflow, implementing the roadmap, suggesting doable tasks, reviewing code from contributors. United we stand. We shall work together to make the community thrive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsorship
&lt;/h2&gt;

&lt;p&gt;Many thanks to Yepoleb, lenis0012, pietroppeter, Clonkk, mode80, Phil, CxPlanner, shirleyquirk, elcritch, geotre, thinkwelltwd, xrfez, enthus1ast, piertoni, Dnanilem, gemath for &lt;a href="https://github.com/sponsors/planety"&gt;sponsoring me on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>opensource</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Contribute to the Python-like Nim language</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Mon, 27 Mar 2023 15:43:30 +0000</pubDate>
      <link>https://forem.com/ringabout/contribute-to-the-python-like-nim-language-4i5e</link>
      <guid>https://forem.com/ringabout/contribute-to-the-python-like-nim-language-4i5e</guid>
      <description>&lt;h2&gt;
  
  
  Progress
&lt;/h2&gt;

&lt;h3&gt;
  
  
  fixes the documentation of typeclasses
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21552"&gt;closes #21536; fixes manual&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The parser has been changed, now you need to use &lt;code&gt;type RecordType = (tuple or object)&lt;/code&gt; ro declare types classes starting with tuple or object instead of &lt;code&gt;type RecordType = tuple or object&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  forbids using &lt;code&gt;system.any&lt;/code&gt; for type conversions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21562"&gt;fixes #14255; Crash in compiler when using system.any by accident&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newSeq&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s"&gt;"ok?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it gives proper an error message =&amp;gt; "Error: illegal type conversion to 'any'".&lt;/p&gt;

&lt;h3&gt;
  
  
  fixes templates with untyped parameters resolve private fields wrongly in generics
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21554"&gt;fixes #3770; templates with untyped parameters resolve private fields wrongly in generics&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;
  &lt;span class="n"&gt;Noice&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;
    &lt;span class="n"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;

&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="n"&gt;jjj&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Noice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;Noice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="c"&gt;# bug #3770&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;m3770&lt;/span&gt;

&lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;jjj&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"(hidden: 15)"&lt;/span&gt;  &lt;span class="c"&gt;# works&lt;/span&gt;

&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;someGeneric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;_: type) =&lt;/span&gt;
  &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;jjj&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"(hidden: 15)"&lt;/span&gt;

&lt;span class="n"&gt;someGeneric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the example compiles.&lt;/p&gt;

&lt;h3&gt;
  
  
  (WIP) adds compiler support for object construction shorthand
&lt;/h3&gt;

&lt;p&gt;WIP &lt;a href="https://github.com/nim-lang/Nim/pull/21559"&gt;adds compiler support for object construction shorthand&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;
  &lt;span class="n"&gt;Vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;999&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;

&lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c"&gt;# positional construction&lt;/span&gt;
  &lt;span class="sd"&gt;## It specifies all the unnamed fields&lt;/span&gt;
  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="sd"&gt;## unnamed fields can be mixed with named fields&lt;/span&gt;
  &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="sd"&gt;## Object variants support unnamed fields for tags, which should be known at the compile time.&lt;/span&gt;
  &lt;span class="k"&gt;type&lt;/span&gt;
    &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt;
      &lt;span class="n"&gt;Red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Yellow&lt;/span&gt;
    &lt;span class="n"&gt;Factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;
      &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;
      &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;Red&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
      &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;Blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Yellow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
      &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;

  &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Factor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"1314"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

  &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Factor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"1314"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;

  &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Factor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Yellow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"1314"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;


  &lt;span class="k"&gt;type&lt;/span&gt;
    &lt;span class="n"&gt;Ciao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;
      &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
      &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
      &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
      &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;

  &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Ciao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"123"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;

  &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Ciao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"123"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Weekly collection
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9908"&gt;https://forum.nim-lang.org/t/9908&lt;/a&gt; (2/19)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9940"&gt;https://forum.nim-lang.org/t/9940&lt;/a&gt; (2/26)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9970"&gt;https://forum.nim-lang.org/t/9970&lt;/a&gt; (3/5)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9989"&gt;https://forum.nim-lang.org/t/9989&lt;/a&gt; (3/12)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/10024"&gt;https://forum.nim-lang.org/t/10024&lt;/a&gt; (3/19)&lt;/p&gt;

&lt;h2&gt;
  
  
  Participating in contributions
&lt;/h2&gt;

&lt;p&gt;Following &lt;a href="https://github.com/nim-lang/RFCs/issues/513"&gt;The Roadmap 2023 for community building &lt;/a&gt;, you could join us in &lt;a href="https://matrix.to/#/!ZmWXggMgfkKpcLbQkB:matrix.org?via=matrix.org"&gt;the matrix space&lt;/a&gt; where we discuss how to build a community. We appreciate doable suggestions and helps, such as improving the workflow, implementing the roadmap, suggesting doable tasks, reviewing code from contributors. United we stand. We shall work together to make the community thrive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsorship
&lt;/h2&gt;

&lt;p&gt;Many thanks to Yepoleb, lenis0012, pietroppeter, Clonkk, mode80, Phil, CxPlanner, shirleyquirk, elcritch, geotre, thinkwelltwd, xrfez, enthus1ast, piertoni, Dnanilem, gemath for &lt;a href="https://github.com/sponsors/planety"&gt;sponsoring me on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nim</category>
      <category>opensource</category>
      <category>contributorswanted</category>
      <category>programming</category>
    </item>
    <item>
      <title>My Nim Development Weekly Report (3/19)</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Mon, 20 Mar 2023 04:21:06 +0000</pubDate>
      <link>https://forem.com/ringabout/my-nim-development-weekly-report-319-he5</link>
      <guid>https://forem.com/ringabout/my-nim-development-weekly-report-319-he5</guid>
      <description>&lt;h2&gt;
  
  
  Progress
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Checks the potential errors with closure calls
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21530"&gt;fixes #19857; Exception raised in closure may be "skipped" in ORC&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adds a prepass for codeReordering
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21513"&gt;add a prepass for codeReordering&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To keep backwards compatibility. It adds a prepass for &lt;code&gt;codeReordering&lt;/code&gt;. Before processing all the source code, it iterates all the nodes and looks for &lt;code&gt;{.experimental: "codeReordering"}&lt;/code&gt;. If the flag is found, it will enter the processing in the codeReordering mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Forbids changing branch of an object variant in ORC
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21526"&gt;fix #18977; disallow change branch of an object variant in ORC&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;
  &lt;span class="n"&gt;E&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
  &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;
    &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
  &lt;span class="n"&gt;O&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;E&lt;/span&gt;
    &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
      &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;

&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;`=destroy`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s"&gt;"x destroyed"&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12345&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;12345&lt;/span&gt;

&lt;span class="n"&gt;doAssertRaises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FieldDefect&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You cannot change the branch of &lt;code&gt;o&lt;/code&gt; anymore unless you assign to it the same kind or use &lt;code&gt;{.cast(uncheckedAssign).}&lt;/code&gt; to permit the operation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
&lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="k"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uncheckedAssign&lt;/span&gt;&lt;span class="p"&gt;).}:&lt;/span&gt;
  &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Weekly collection
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9908"&gt;https://forum.nim-lang.org/t/9908&lt;/a&gt; (2/19)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9940"&gt;https://forum.nim-lang.org/t/9940&lt;/a&gt; (2/26)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9970"&gt;https://forum.nim-lang.org/t/9970&lt;/a&gt; (3/5)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9989"&gt;https://forum.nim-lang.org/t/9989&lt;/a&gt; (3/12)&lt;/p&gt;

&lt;h2&gt;
  
  
  Participating in contributions
&lt;/h2&gt;

&lt;p&gt;Following &lt;a href="https://github.com/nim-lang/RFCs/issues/513"&gt;The Roadmap 2023 for community building &lt;/a&gt;, you could join us in &lt;a href="https://matrix.to/#/!ZmWXggMgfkKpcLbQkB:matrix.org?via=matrix.org"&gt;the matrix space&lt;/a&gt; where we discuss how to build a community. We appreciate doable suggestions and helps, such as improving the workflow, implementing the roadmap, suggesting doable tasks, reviewing code from contributors. United we stand. We shall work together to make the community thrive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsorship
&lt;/h2&gt;

&lt;p&gt;Many thanks to @Yepoleb, @lenis0012, &lt;a class="mentioned-user" href="https://dev.to/pietroppeter"&gt;@pietroppeter&lt;/a&gt;, @Clonkk, @mode80, &lt;a class="mentioned-user" href="https://dev.to/phil"&gt;@phil&lt;/a&gt;, @CxPlanner, &lt;a class="mentioned-user" href="https://dev.to/shirleyquirk"&gt;@shirleyquirk&lt;/a&gt;, @elcritch, @geotre, @thinkwelltwd, @xrfez, &lt;a class="mentioned-user" href="https://dev.to/enthus1ast"&gt;@enthus1ast&lt;/a&gt;, @piertoni, @Dnanilem for &lt;a href="https://github.com/sponsors/planety"&gt;sponsoring me on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nim</category>
      <category>opensource</category>
      <category>contributorswanted</category>
      <category>programming</category>
    </item>
    <item>
      <title>My Nim Development Weekly Report (3/12)</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Mon, 13 Mar 2023 03:28:03 +0000</pubDate>
      <link>https://forem.com/ringabout/my-nim-development-weekly-report-312-1343</link>
      <guid>https://forem.com/ringabout/my-nim-development-weekly-report-312-1343</guid>
      <description>&lt;h2&gt;
  
  
  Progress
&lt;/h2&gt;

&lt;h3&gt;
  
  
  chores
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21478"&gt;closes #16654; add a test case&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21480"&gt;closes #20704; add a test case&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21485"&gt;closes #6231; add a test case&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21486"&gt;closes #8295; add a test case&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21470"&gt;fixes sinkinference documentation, which has been disabled&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  following up PRs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21493"&gt;fixes quoted variables with typedesc types&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21502"&gt;fixes explicit globals in macros&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  fixes @[] and {} type inference as returns in generics
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21475"&gt;fixes #21377; fixes @[] and {} type inference as returns in generics&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;  &lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;b&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="o"&gt;@[]&lt;/span&gt;

  &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;@[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The type of &lt;code&gt;@[]&lt;/code&gt; is incomplete, which is of &lt;code&gt;seq[empty]&lt;/code&gt; type. By means of the return type of the generics, we could infer its type. Using top down type inference, we pass the expected type, namely &lt;code&gt;seq[int]&lt;/code&gt;, to the return expression. Finally, the return type is passed to the magic &lt;code&gt;mArrToSeq&lt;/code&gt;, where we replace the incomplete type with &lt;code&gt;seq[int]&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Initialize all the missing fields when discriminator is assigned
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21497"&gt;fixes #21023; Segfault when mixing seqs, orc, variants and futures&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;
  &lt;span class="n"&gt;Result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;var x = Result(o: true)&lt;/code&gt; is now equal to &lt;code&gt;var x = Result(o: true, v: 0.0)&lt;/code&gt;. The &lt;code&gt;v&lt;/code&gt; field is initialized to &lt;code&gt;0.0&lt;/code&gt; so that it won't cause problems for ARC/ORC.&lt;/p&gt;

&lt;h3&gt;
  
  
  don't transform yields in the var section when introducing new local vars
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21489"&gt;fixes #21306; fixes #20485; don't transform yields in the var section when introducing new local vars&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  fixes ambiguous calls compiles when module name are equal
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21500"&gt;fixes #21496; fixes ambiguous calls compiles when module name are equal&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- a
   - def.nim
- b
   - def.nim
- project.nimble
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;a/def&lt;/code&gt; and &lt;code&gt;b/def&lt;/code&gt; shares the same owner, namely &lt;code&gt;project&lt;/code&gt; which is the name of the nimble file. We cannot distinguish them by their owners.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;skModule&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;conflict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;skModule&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;conflict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, we need to use &lt;code&gt;sym.position&lt;/code&gt; which stands for an unique index corresponding to the module's fileIdx for symbols with a &lt;code&gt;skModule&lt;/code&gt; kind.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;skModule&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;conflict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;skModule&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;conflict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Weekly collection
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9908"&gt;https://forum.nim-lang.org/t/9908&lt;/a&gt; (2/19)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9940"&gt;https://forum.nim-lang.org/t/9940&lt;/a&gt; (2/26)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9970"&gt;https://forum.nim-lang.org/t/9970&lt;/a&gt; (3/5)&lt;/p&gt;

&lt;h2&gt;
  
  
  Participating in contributions
&lt;/h2&gt;

&lt;p&gt;Following &lt;a href="https://github.com/nim-lang/RFCs/issues/513"&gt;The Roadmap 2023 for community building &lt;/a&gt;, you could join us in &lt;a href="https://matrix.to/#/!ZmWXggMgfkKpcLbQkB:matrix.org?via=matrix.org"&gt;the matrix space&lt;/a&gt; where we discuss how to build a community. We appreciate doable suggestions and helps, such as improving the workflow, implementing the roadmap, suggesting doable tasks, reviewing code from contributors. United we stand. We shall work together to make the community thrive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsorship
&lt;/h2&gt;

&lt;p&gt;Many thanks to Yepoleb, lenis0012, pietroppeter, Clonkk, mode80, Phil, CxPlanner, shirleyquirk, elcritch, geotre, thinkwelltwd, xrfez, enthus1ast, piertoni, Dnanilem for &lt;a href="https://github.com/sponsors/planety"&gt;sponsoring me on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nim</category>
      <category>opensource</category>
      <category>contributorswanted</category>
    </item>
    <item>
      <title>My Nim Development Weekly Report (3/5)</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Mon, 06 Mar 2023 02:54:38 +0000</pubDate>
      <link>https://forem.com/ringabout/my-nim-development-weekly-report-35-12hd</link>
      <guid>https://forem.com/ringabout/my-nim-development-weekly-report-35-12hd</guid>
      <description>&lt;h2&gt;
  
  
  Progress
&lt;/h2&gt;

&lt;h3&gt;
  
  
  chores
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21469"&gt;remove nosinks hacks from compiler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21445"&gt;test DLL generation with ORC&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21470"&gt;fixes sinkinference documentation, which has been disabled&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  implements wasMoved hook
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21303"&gt;fixes #19291; implements wasMoved hook&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can now register a &lt;code&gt;wasMoved&lt;/code&gt; hook.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;
  &lt;span class="n"&gt;Game&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;

&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;`=wasMoved`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  hash types based on custom paths
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21274"&gt;fixes #20139; hash types based on custom paths&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now the object type with the same name in the same file name but resides in different directories won't conflict with each other anymore. The PR takes the path of the type into consideration, which prevents conflicts.&lt;/p&gt;

&lt;h3&gt;
  
  
  fixes top level variables inside loops are not reset in VM
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21351"&gt;fixes #10938; fixes #13312; fixes #13918; fixes #20985; always initializes global variables with null values in VM&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="sc"&gt;'1'&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="sc"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;set&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;incl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The variable &lt;code&gt;s&lt;/code&gt; wasn't initialized properly in the loop. It caused &lt;code&gt;s&lt;/code&gt; to keep the old value after the first iteration. My solution is to initialize &lt;code&gt;s&lt;/code&gt; each time the var section is executed, which is reset for every iteration.&lt;/p&gt;

&lt;h3&gt;
  
  
  fixes type erasures for quoted variables
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21433"&gt;fixes #21326; fixes #7375; fixes #11986; fixes #9607; rework quote do; getAst uses type info to annotate the type of quoted variables; no more type erasures for quoted variables&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;macros&lt;/span&gt;

&lt;span class="k"&gt;macro&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;untyped&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;untyped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lineInfoObj&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt;

&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The VM is an untyped executor, which erases types of expressions after execution. In this case, &lt;code&gt;a&lt;/code&gt; is evaluated in the VM, which loses its type, namely &lt;code&gt;LineInfo&lt;/code&gt; after evaluation. So we should collect the type information and annotate the type of &lt;code&gt;a&lt;/code&gt; when expanding &lt;code&gt;quote do&lt;/code&gt;. I store the type information in the parameters of the dummy templates used by &lt;code&gt;quote do&lt;/code&gt;, which is used to restore the type of quoted variables.&lt;/p&gt;

&lt;h3&gt;
  
  
  replaces implicit passes array registered at runtime with explicit function calls; simplify compilation pipeline
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21444"&gt;replaces implicit passes array registered at runtime with explicit function calls; simplify compilation pipeline&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;processPipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ModuleGraph&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;semNode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;bModule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PPassContext&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;PNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pipelinePass&lt;/span&gt;
  &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;CgenPass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;semNode&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;bModule&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;genTopLevelStmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BModule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bModule&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;JSgenPass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leanCompiler&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processJSCodeGen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;semNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;GenDependPass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;addDotDependency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;semNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;SemPass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emptyNode&lt;/span&gt;
  &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;Docgen2Pass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Docgen2TexPass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leanCompiler&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;semNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;Docgen2JsonPass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leanCompiler&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processNodeJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;semNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;EvalPass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterpreterPass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;interpreterCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;semNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;NonePass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"use setPipeLinePass to set a proper PipelinePass"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;processPipeline&lt;/code&gt; explicitly calls the code generator, which makes the code more clear. It is the second step towards to remove forward declaration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weekly collection
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9908"&gt;https://forum.nim-lang.org/t/9908&lt;/a&gt; (2/19)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9940"&gt;https://forum.nim-lang.org/t/9940&lt;/a&gt; (2/26)&lt;/p&gt;

&lt;h2&gt;
  
  
  Participating in contributions
&lt;/h2&gt;

&lt;p&gt;I have created &lt;a href="https://matrix.to/#/!TqycJdaMxeCOkccTqa:matrix.org?via=matrix.org"&gt;a matrix space&lt;/a&gt; for contributions to the official Nim projects. If you are already a contributor of the official Nim projects, welcome to this space to discuss contributions. If you are willing to take up some quests for fun, I have prepared &lt;a href="https://github.com/orgs/nim-lang/projects/8"&gt;a list&lt;/a&gt; for you, which contains a few contribution-friendly issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsorship
&lt;/h2&gt;

&lt;p&gt;Many thanks to @Yepoleb, @lenis0012, &lt;a class="mentioned-user" href="https://dev.to/pietroppeter"&gt;@pietroppeter&lt;/a&gt;, @Clonkk, @mode80, &lt;a class="mentioned-user" href="https://dev.to/phil"&gt;@phil&lt;/a&gt;, @CxPlanner, &lt;a class="mentioned-user" href="https://dev.to/shirleyquirk"&gt;@shirleyquirk&lt;/a&gt;, @elcritch, @geotre, @thinkwelltwd, @xrfez, &lt;a class="mentioned-user" href="https://dev.to/enthus1ast"&gt;@enthus1ast&lt;/a&gt; for &lt;a href="https://github.com/sponsors/planety"&gt;sponsoring me on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nim</category>
    </item>
    <item>
      <title>My Nim Development Weekly Report (2/26)</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Fri, 03 Mar 2023 10:17:41 +0000</pubDate>
      <link>https://forem.com/ringabout/my-nim-development-weekly-report-226-47ai</link>
      <guid>https://forem.com/ringabout/my-nim-development-weekly-report-226-47ai</guid>
      <description>&lt;h2&gt;
  
  
  Progress
&lt;/h2&gt;

&lt;h3&gt;
  
  
  chores
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21412"&gt;invalid module names errors have been improved&lt;/a&gt;, it now says that a module name must be a valid Nim identifier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21292"&gt;fixes the linkerexe of riscv64 in config&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21292"&gt;csources_v2 can build the ORC-booted compiler; building now uses strict mode&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21413"&gt;saves one unnecessary compare which is also a small regression&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21434"&gt;closes #17864; add a test case&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21390"&gt;use {.push warning[BareExcept]:off.} to override settings temporarily&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nim now parses the whole module at one time
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21379"&gt;fixes #19795; fixes #11852; fixes #19974; remove parsing pipeline, Nim now parses the whole module at one time&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  destructor analysis
&lt;/h4&gt;

&lt;p&gt;Now the destructor analysis can analyze the whole module at one time, which means the declarations won't affect the analysis of global variables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;vect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newSeq&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;vect&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;@[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;vectCopy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vect&lt;/span&gt;
&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;p&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;vect&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;@[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't need to put the global statements to a function anymore. It can be run with ARC/ORC as it is.&lt;/p&gt;

&lt;h4&gt;
  
  
  push pragmas
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;push&lt;/code&gt; pragmas now work within functions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;checks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;ptr&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unsafeAddr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;51&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;

&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  fixes object with distinct defaults or &lt;code&gt;initTable&lt;/code&gt; defaults
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21428"&gt;fixes #20695; fixes object with distinct defaults and tables&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;/[&lt;/span&gt;&lt;span class="n"&gt;tables&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;type&lt;/span&gt;
      &lt;span class="n"&gt;Default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;
        &lt;span class="n"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Table&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;initTable&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

  &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;DjangoDateTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;distinct&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;

    &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;
      &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DjangoDateTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DjangoDateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;DjangoDateTime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of them now works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Work in progress
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21417"&gt;Overrides =copy for PackedSets&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21402"&gt;abolish using passes in the compiler; simplify compilation pipeline&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21433"&gt;fixes #21326; fixes #7375; fixes #11986; fixes #9607; &lt;code&gt;getAst&lt;/code&gt; uses type info to annotate the type of quoted variables; no more type erasures for quoted variables&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weekly collection
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://forum.nim-lang.org/t/9908"&gt;https://forum.nim-lang.org/t/9908&lt;/a&gt; (2/19)&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsorship
&lt;/h2&gt;

&lt;p&gt;Many thanks to @Yepoleb, @lenis0012, &lt;a class="mentioned-user" href="https://dev.to/pietroppeter"&gt;@pietroppeter&lt;/a&gt;, @Clonkk, @mode80 for &lt;a href="https://github.com/sponsors/planety"&gt;sponsoring me on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nim</category>
    </item>
    <item>
      <title>My Nim Development Weekly Report (2/19)</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Fri, 03 Mar 2023 10:16:46 +0000</pubDate>
      <link>https://forem.com/ringabout/my-nim-development-weekly-report-219-1mhm</link>
      <guid>https://forem.com/ringabout/my-nim-development-weekly-report-219-1mhm</guid>
      <description>&lt;p&gt;First of all, the Nim development follows &lt;a href="https://github.com/nim-lang/RFCs/issues/503"&gt;The Roadmap 2023&lt;/a&gt;, which specifies&lt;br&gt;
what features might be implemented or removed in 2023. As we can see, completing incremental compilation and recursive module dependencies&lt;br&gt;
might be the most important tasks to be done in 2023. You might subscribe to the roadmap and write down your expectations of Nim in 2023 there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What have I done in the past week
&lt;/h2&gt;

&lt;p&gt;I work on all kinds of problems such as bugs, features, clean-ups and most importantly the roadmap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clean-ups
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21373"&gt;fixes comments about type bound operations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21373"&gt;remove legacy code; the first iteration now can build Nim with cpp backend&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21396"&gt;closes #1072; add a test case&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21390"&gt;use {.push warning[BareExcept]:off.} to override settings temporarily&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21277"&gt;add deprecated warnings for {.deadcodeelim: on.}&lt;/a&gt; because the dead code elimination is always on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bug fixing
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21374"&gt;fixes #21360; discarding empty seqs/arrays now raises errors&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dev.tofixes%20#19291;%20implements%20%20raw%20%60wasMoved%60%20endraw%20%20hook"&gt;fixes #19291; implements &lt;code&gt;wasMoved&lt;/code&gt; hook&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Roadmap
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/pull/21379"&gt;fixes #19795; fixes #11852; remove parsing pipeline, Nim now parses the whole module at one time&lt;/a&gt; which now is listed on the roadmap and is the first step towards removing the need of forward declarations, which also fixes push pragmas within procs and fixes procs/iterators declarations disturbing the destructors analysis. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Potential implications&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Top level &lt;code&gt;{.experimental: "codeReordering".}&lt;/code&gt; won't work anymore, you must pass it to the command line. This is beyond repair with the new parsing strategy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;{.overflowChecks: on.}&lt;/code&gt; and &lt;code&gt;{.overflowChecks: off.}&lt;/code&gt;,  which were misused to override settings temporarily, won't work like before anymore. The last &lt;code&gt;overflowChecks&lt;/code&gt; setting will decide whether overflow checks will be enabled.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you could contribute to
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/nimble/issues/1069"&gt;nimble develop -g doesn't work&lt;/a&gt; A possible solution is to add "g" to where "global" is placed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim/issues/21392"&gt;add changelog for nimble 0.14.0 breaking changes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/db_connector/issues/16"&gt;remove &lt;code&gt;codeReordering&lt;/code&gt; in &lt;code&gt;db_connector/db_sqlite&lt;/code&gt;&lt;/a&gt; Replace &lt;code&gt;codeReordering&lt;/code&gt; with forward declarations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsorship
&lt;/h2&gt;

&lt;p&gt;Many thanks to @Yepoleb, @lenis0012, &lt;a class="mentioned-user" href="https://dev.to/pietroppeter"&gt;@pietroppeter&lt;/a&gt;, @Clonkk, @mode80 for &lt;a href="https://github.com/sponsors/planety"&gt;sponsoring me on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;ref &lt;a href="https://forum.nim-lang.org/t/9908"&gt;https://forum.nim-lang.org/t/9908&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nim</category>
    </item>
    <item>
      <title>Make `std/strformat` work at the compile time in the Nim language</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Tue, 14 Feb 2023 16:58:21 +0000</pubDate>
      <link>https://forem.com/ringabout/make-stdstrformat-work-at-the-compile-time-in-the-nim-language-3474</link>
      <guid>https://forem.com/ringabout/make-stdstrformat-work-at-the-compile-time-in-the-nim-language-3474</guid>
      <description>&lt;p&gt;&lt;a href="https://nim-lang.org" rel="noopener noreferrer"&gt;The Nim language&lt;/a&gt; is a great statically typed modern programming language. Its built-in VM is quite powerful and can be used for compile-time calculations in order to make the program as fast as possible. Not only is it efficient, but also expressive. We shall see the juicy fruits of the elegant syntax macros in this blog. The &lt;code&gt;std/strformat&lt;/code&gt; is implemented by syntax macros. In a word, the core Nim is small but with macros, its possibilities are infinite.&lt;/p&gt;

&lt;p&gt;You might have heard the f-string in Python language, which is quite neat and handy. &lt;code&gt;std/strformat&lt;/code&gt; implements String interpolation/format elegantly, likewise.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;strformat&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;
&lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="s"&gt;fmt"{msg}\n"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"hello&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;n"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need for extra string concatenation or obscure interpolation operations. What you see is what you get. You just need to put variables between curly bracelets. Can't it be simpler?&lt;/p&gt;

&lt;p&gt;There was a problem before that &lt;code&gt;std/strformat&lt;/code&gt; cannot format floats. It was a bit depressing since &lt;code&gt;std/strformat&lt;/code&gt; is such an elegant and handy library, how could it be so cruel as not to work at the compile time. Worry not, the &lt;code&gt;devel&lt;/code&gt; compiler has supported calling it at any time by means of &lt;a href="https://github.com/nim-lang/Nim/pull/21299" rel="noopener noreferrer"&gt;registering &lt;code&gt;formatBiggestFloat&lt;/code&gt; in VM&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;strformat&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;compileTimeVarible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="s"&gt;"{1.236:&amp;lt;.2}"&lt;/span&gt;
&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="n"&gt;compileTimeVarible&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it prints the expected result: &lt;code&gt;1.2&lt;/code&gt;. See, it is not difficult to contribute to an open source project. Every contribution, big or small, counts.&lt;/p&gt;

</description>
      <category>gratitude</category>
    </item>
    <item>
      <title>Nim -- a modern "glue" language like Python</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Tue, 12 Oct 2021 05:47:45 +0000</pubDate>
      <link>https://forem.com/ringabout/nim-a-modern-glue-language-like-python-3270</link>
      <guid>https://forem.com/ringabout/nim-a-modern-glue-language-like-python-3270</guid>
      <description>&lt;p&gt;Nim is a statically typed compiled systems programming language. It supports various backends: it compiles to C, C++ or JavaScript so that Nim can be used for all backend and frontend needs. Via &lt;code&gt;importc&lt;/code&gt;, &lt;code&gt;importcpp&lt;/code&gt;, &lt;code&gt;importjs&lt;/code&gt; pragmas, Nim can import C/C++/JS/ObjC methods or symbols in general. You can refer to the &lt;a href="https://nim-lang.github.io/Nim/manual.html#implementation-specific-pragmas-importcpp-pragma"&gt;manual&lt;/a&gt; of Nim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/c2nim"&gt;c2nim&lt;/a&gt; is a tool to translate ANSI C code to Nim. The output is human-readable Nim code that is meant to be tweaked by hand after the translation process. If you are tired of wrapping C library, you can try &lt;a href="https://github.com/PMunch/futhark"&gt;futhark&lt;/a&gt; which supports "simply import C header files directly into Nim". Similar to futhark, &lt;a href="https://github.com/n0bra1n3r/cinterop"&gt;cinterop&lt;/a&gt; allows one to interop with C/C++ code without having to create wrappers. &lt;a href="https://github.com/jangko/nimLUA"&gt;nimLUA&lt;/a&gt; is a glue code generator to bind Nim and Lua together using Nim's powerful macro. &lt;a href="https://github.com/yglukhov/nimpy"&gt;nimpy&lt;/a&gt; and &lt;a href="https://github.com/Pebaz/nimporter"&gt;nimporter&lt;/a&gt; is a bridge between Nim and Python. &lt;a href="https://github.com/SciNim/rnim"&gt;rnim&lt;/a&gt; is a bridge between R and Nim. &lt;a href="https://github.com/Clonkk/nimjl"&gt;nimjl&lt;/a&gt; is a bridge between Nim and Julia! Last but not least, &lt;a href="https://github.com/treeform/genny"&gt;genny&lt;/a&gt; generates a shared library and bindings for many languages such as Python, Node.js, C.&lt;/p&gt;

</description>
      <category>nim</category>
      <category>python</category>
    </item>
    <item>
      <title>Best ways to make your first contribution to Nim language for Hacktoberfest 2021</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Tue, 05 Oct 2021 04:57:50 +0000</pubDate>
      <link>https://forem.com/ringabout/best-ways-to-make-your-first-contribution-to-nim-language-4ml2</link>
      <guid>https://forem.com/ringabout/best-ways-to-make-your-first-contribution-to-nim-language-4ml2</guid>
      <description>&lt;p&gt;Concise and readable, small binaries, fast compile times, native performance, zero-overhead interop lets you reuse code in C, C++, JS, Objective-C, Python... Does a programming language have these fantastic features? Of course, &lt;a href="https://github.com/nim-lang/Nim"&gt;Nim language&lt;/a&gt; does have the features I have been dreaming about. And what is the goal of Nim language? Simply put, the goal is "one language to rule them all", from &lt;a href="https://nim-lang.org/docs/nims.html"&gt;shell scripting&lt;/a&gt; to &lt;a href="https://github.com/nim-lang/nimforum"&gt;web frontend and backend&lt;/a&gt;,&lt;br&gt;
  &lt;a href="https://github.com/SciNim"&gt;scientific computing&lt;/a&gt;, &lt;a href="https://github.com/mratsim/Arraymancer"&gt;deep learning&lt;/a&gt;,&lt;br&gt;
  &lt;a href="https://github.com/status-im"&gt;blockchain client&lt;/a&gt;, &lt;a href="https://github.com/ftsf/nico"&gt;gamedev&lt;/a&gt;,&lt;br&gt;
  &lt;a href="https://github.com/EmbeddedNim"&gt;embedded&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Moreover, &lt;a href="https://github.com/nim-lang/Nim"&gt;Nim&lt;/a&gt; is a community driven collaborative effort that welcomes all contributions, big or small. Read &lt;a href="https://github.com/nim-lang/Nim#contributing"&gt;contributing guide&lt;/a&gt; if you are willing to contribute to Nim. In this article, I will tell you best ways to make your first contribution to Nim language. Starting from easy and feasible pull requests, you will surely enjoy the charm of open source projects. Let's start our journey.&lt;/p&gt;
&lt;h2&gt;
  
  
  Replace code-block with runnableExamples
&lt;/h2&gt;

&lt;p&gt;Some modules are using code-blocks which are outdated and should be replaced by &lt;code&gt;runnableExamples&lt;/code&gt;. Search &lt;code&gt;.. code-block&lt;/code&gt; in your favourite editor and change the ones in standard libraries.&lt;/p&gt;

&lt;p&gt;For instance&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;before&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="sd"&gt;## .. code-block:: Nim&lt;/span&gt;
&lt;span class="sd"&gt;##   import std/json&lt;/span&gt;
&lt;span class="sd"&gt;##&lt;/span&gt;
&lt;span class="sd"&gt;##   let jsonNode = parseJson("""{"key": 3.14}""")&lt;/span&gt;
&lt;span class="sd"&gt;##&lt;/span&gt;
&lt;span class="sd"&gt;##   doAssert jsonNode.kind == JObject&lt;/span&gt;
&lt;span class="sd"&gt;##   doAssert jsonNode["key"].kind == JFloat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;after&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="n"&gt;runnableExamples&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;jsonNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parseJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"""{"key": 3.14}"""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;jsonNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;JObject&lt;/span&gt;
  &lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;jsonNode&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;JFloat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that the import of the current module can be left out. If the original snippet cannot be run, use &lt;code&gt;runnableExamples("-r:off")&lt;/code&gt; instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add testcase to close issues
&lt;/h2&gt;

&lt;p&gt;When surfing &lt;a href="https://github.com/nim-lang/Nim/issues"&gt;issues&lt;/a&gt; of Nim, you can find some code which have already worked. Submit a pull request to close that issue. You can refer to &lt;a href="https://github.com/nim-lang/Nim/pull/18934"&gt;https://github.com/nim-lang/Nim/pull/18934&lt;/a&gt; and track issues labelled as &lt;a href="https://github.com/nim-lang/Nim/labels/works_but_needs_test_case"&gt;works_but_needs_test_case&lt;/a&gt; or &lt;a href="https://github.com/nim-lang/Nim/labels/works_with_arc_orc"&gt;works_with_arc_orc&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add top-level runnableExamples for modules
&lt;/h2&gt;

&lt;p&gt;Some modules lack top-level runnableExamples, please help them. Such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nim-lang/Nim/blob/devel/lib/pure/concurrency/cpuload.nim"&gt;https://github.com/nim-lang/Nim/blob/devel/lib/pure/concurrency/cpuload.nim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nim-lang/Nim/blob/devel/lib/pure/concurrency/threadpool.nim"&gt;https://github.com/nim-lang/Nim/blob/devel/lib/pure/concurrency/threadpool.nim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nim-lang/Nim/blob/devel/lib/pure/asyncstreams.nim"&gt;https://github.com/nim-lang/Nim/blob/devel/lib/pure/asyncstreams.nim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nim-lang/Nim/blob/devel/lib/pure/cookies.nim"&gt;https://github.com/nim-lang/Nim/blob/devel/lib/pure/cookies.nim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nim-lang/Nim/blob/devel/lib/pure/endians.nim"&gt;https://github.com/nim-lang/Nim/blob/devel/lib/pure/endians.nim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nim-lang/Nim/blob/devel/lib/pure/volatile.nim"&gt;https://github.com/nim-lang/Nim/blob/devel/lib/pure/volatile.nim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Add runnableExamples or documentations for procs
&lt;/h2&gt;

&lt;p&gt;Some procs lack corresponding runnableExamples and documentations. Please find them and complete them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solve issues labelled as easy
&lt;/h2&gt;

&lt;p&gt;If you like some challenges, start from &lt;a href="https://github.com/nim-lang/Nim/issues?q=is%3Aissue+is%3Aopen+label%3AEasy"&gt;issues&lt;/a&gt; labelled as easy.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>nim</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>One Nim web framework to rule over all styles</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Wed, 10 Feb 2021 08:19:49 +0000</pubDate>
      <link>https://forem.com/ringabout/one-nim-web-framework-to-rule-over-all-styles-437l</link>
      <guid>https://forem.com/ringabout/one-nim-web-framework-to-rule-over-all-styles-437l</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Nim language is an elegant and expressive programming language. The powerful macros system allows you to create impressive programs. Let's play with the magics in the Nim world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirement
&lt;/h2&gt;

&lt;p&gt;Nim Version &amp;gt;= 1.4.0 &lt;a href="https://nim-lang.org/install.html"&gt;Installation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Prologue&lt;/code&gt; Version &amp;gt;= 0.4.0&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nimble install prologue@0.4.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/planety/prologue"&gt;Prologue&lt;/a&gt; is a great web framework in the Nim world. However, &lt;code&gt;Prologue&lt;/code&gt; framework tries to avoid using &lt;code&gt;macros&lt;/code&gt;. It is intended to &lt;code&gt;reduce magic and reduce surprise&lt;/code&gt;. Macros could save you from redundant codebases. At the mean time, it could bring surprise. This article talks about how to extend the routing style outside &lt;code&gt;Prologue&lt;/code&gt; without invading inside the web framework.&lt;/p&gt;

&lt;p&gt;There are three ways to register routing out of box using &lt;code&gt;Prologue&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Using a callback is the most basic way. First write an asynchronous function which responds "Hello World!" to the client. Next create a new &lt;code&gt;Prologue&lt;/code&gt; instance. Then use &lt;code&gt;get&lt;/code&gt; function to register the routing and handler. Finally &lt;code&gt;run&lt;/code&gt; the application. &lt;/p&gt;

&lt;p&gt;Visit &lt;code&gt;localhost:8080/hello&lt;/code&gt; and "Hello World!" will be displayed on the screen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;prologue&lt;/span&gt;
&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"Hello World!"&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you love &lt;code&gt;Express.js&lt;/code&gt; or &lt;code&gt;Koa&lt;/code&gt; web framework, you may prefer the style below which uses anonymous function.&lt;/p&gt;

&lt;p&gt;Visit &lt;code&gt;localhost:8080/hello&lt;/code&gt; and "Hello World!" will be displayed on the screen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;prologue&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you love &lt;code&gt;Django&lt;/code&gt; web framework, you may prefer the style below which uses URL patterns.&lt;/p&gt;

&lt;p&gt;Visit &lt;code&gt;localhost:8080/hello&lt;/code&gt; and "Hello World!" will be displayed on the screen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;prologue&lt;/span&gt;
&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"Hello World!"&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;urlPatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@[&lt;/span&gt;
  &lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urlPatterns&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Magics
&lt;/h2&gt;

&lt;p&gt;The topic of today is to extend &lt;code&gt;Prologue&lt;/code&gt; with the powerful macros outside the web framework.&lt;/p&gt;

&lt;p&gt;If you love &lt;code&gt;Flask&lt;/code&gt; web framework, you may prefer the style below which uses pragmas to simulate decorators.&lt;/p&gt;

&lt;p&gt;The core codebase is &lt;strong&gt;just 4 lines&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;prologue&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;macros&lt;/span&gt;
&lt;span class="k"&gt;macro&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Prologue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;untyped&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="c"&gt;# Gets the name of handler, for example "hello"&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;prologue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(`&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;`,&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;`,&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;`)&lt;/span&gt;
&lt;span class="k"&gt;macro&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Prologue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;middlewares&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;openArray&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HandlerAsync&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;untyped&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;discard&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="p"&gt;).}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;h1&amp;gt;Hello, Prologue!&amp;lt;/h1&amp;gt;"&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you love &lt;code&gt;Jester&lt;/code&gt; or &lt;code&gt;Sinatra&lt;/code&gt; web framework,  you may prefer the style below.&lt;/p&gt;

&lt;p&gt;The core codebase is &lt;strong&gt;just 4 lines&lt;/strong&gt; too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;prologue&lt;/span&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;/[&lt;/span&gt;&lt;span class="n"&gt;macros&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;macro&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Prologue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;untyped&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;ident"ctx"&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;prologue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(`&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;`,&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;`,&lt;/span&gt; &lt;span class="k"&gt;proc&lt;/span&gt; &lt;span class="p"&gt;(`&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;`:&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;`)&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;h1&amp;gt;Hello, Prologue!&amp;lt;/h1&amp;gt;"&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Automation
&lt;/h2&gt;

&lt;p&gt;The powerful macros system could transform &lt;code&gt;Prologue&lt;/code&gt; framework into the DSL style completely(Thanks to @&lt;code&gt;exelotl&lt;/code&gt; and @&lt;code&gt;Vindaar&lt;/code&gt;). It could be used to generate codebases using templates. Redundant codes will be simplified. The less is more.&lt;/p&gt;

&lt;p&gt;The full codebase is &lt;strong&gt;less than 40 lines&lt;/strong&gt;. &lt;code&gt;defineRouteSugar&lt;/code&gt; and &lt;code&gt;defineGroup&lt;/code&gt; are the templates to generate all the DSL routing functions. It makes codebases simple and hard to go wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="c"&gt;# dsl_style.nim&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;prologue&lt;/span&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;macros&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;prologue&lt;/span&gt;
&lt;span class="k"&gt;macro&lt;/span&gt; &lt;span class="n"&gt;defineRouteSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;untyped&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;ident"ctx"&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Prologue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;untyped&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
      &lt;span class="n"&gt;prologue&lt;/span&gt;&lt;span class="p"&gt;.`&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;`(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;(`&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;`:&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                                    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt;
                                    &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;macro&lt;/span&gt; &lt;span class="n"&gt;defineGroupSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;untyped&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;ident"ctx"&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;untyped&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
      &lt;span class="n"&gt;prologue&lt;/span&gt;&lt;span class="p"&gt;.`&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;`(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;(`&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;`:&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
                                      &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt;
                                      &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineRouteSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineRouteSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineRouteSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineRouteSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineRouteSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineRouteSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineGroupSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineGroupSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineGroupSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineGroupSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineGroupSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;defineGroupSugar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="c"&gt;# app.nim&lt;/span&gt;
&lt;span class="k"&gt;include&lt;/span&gt; &lt;span class="n"&gt;dsl_style&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt;
  &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/apiv2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;level1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"/level1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@[]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;level2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/level2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@[]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;level3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/level3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@[]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;h1&amp;gt;Hello, Prologue!&amp;lt;/h1&amp;gt;"&lt;/span&gt;
  &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;h1&amp;gt;Hello, Prologue!&amp;lt;/h1&amp;gt;"&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;h1&amp;gt;Hello, Prologue!&amp;lt;/h1&amp;gt;"&lt;/span&gt;
  &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;h1&amp;gt;Hello, Prologue!&amp;lt;/h1&amp;gt;"&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;level3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;h1&amp;gt;Hello, Prologue!&amp;lt;/h1&amp;gt;"&lt;/span&gt;
  &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;h1&amp;gt;Hello, Prologue!&amp;lt;/h1&amp;gt;"&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are interested in &lt;code&gt;Prologue&lt;/code&gt; or want to maintain these plugins based on macros, welcome to join our &lt;a href="https://discord.gg/e2dB4WT"&gt;discord server&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nim</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Wrap const char* in the Nim language</title>
      <dc:creator>ringabout</dc:creator>
      <pubDate>Mon, 28 Dec 2020 09:21:35 +0000</pubDate>
      <link>https://forem.com/ringabout/wrap-const-char-in-the-nim-language-53no</link>
      <guid>https://forem.com/ringabout/wrap-const-char-in-the-nim-language-53no</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/nim-lang/Nim"&gt;Nim language&lt;/a&gt; has a great FFI with C/C++ which makes it easy to use C/C++ libraries. This article introduces&lt;br&gt;
how to wrap &lt;code&gt;const char*&lt;/code&gt; in C/C++ backend.&lt;/p&gt;

&lt;p&gt;In the Nim world, we often play with &lt;code&gt;string&lt;/code&gt; which handles the dirty works for us such as resizing the buffer, creating/deleting the memory which can satisfy the most of our needs. However, if we want to interact with other languages, we need the power of &lt;code&gt;cstring&lt;/code&gt;. Note that &lt;code&gt;cstring&lt;/code&gt; doesn't mean "string in C", it means compatible string(&lt;code&gt;char *&lt;/code&gt; in C/C++ backend, JS string in JavaScript backend and so on).&lt;/p&gt;

&lt;p&gt;Nim doesn't provide &lt;code&gt;const char *&lt;/code&gt; for us. But it is easy to make our own one.&lt;/p&gt;

&lt;p&gt;You need to import &lt;code&gt;const char*&lt;/code&gt; types from C/C++ backend using &lt;code&gt;importc&lt;/code&gt; pragmas. Then make a distinct type for it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;
  &lt;span class="n"&gt;cstringConstImpl&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;importc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"const char*"&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cstring&lt;/span&gt;
  &lt;span class="n"&gt;constChar&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;distinct&lt;/span&gt; &lt;span class="n"&gt;cstringConstImpl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let's look at a simple example using it.&lt;/p&gt;

&lt;p&gt;First &lt;code&gt;emit&lt;/code&gt; the c function, then write the function declaration(&lt;code&gt;nodecl&lt;/code&gt; pragmas means that we&lt;br&gt;
do not generate the function declaration in the output codes). Finally we construct a &lt;code&gt;constChar&lt;/code&gt; object and&lt;br&gt;
pass it to the &lt;code&gt;fn&lt;/code&gt; proc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"""
int fn(const char* a, char b) {
  return 1;
}
"""&lt;/span&gt;
&lt;span class="p"&gt;.}&lt;/span&gt;

&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;constChar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;importc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"fn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nodecl&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;constChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abc"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;compiles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'b'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;compiles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abc"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cstring&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'b'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We could see that the &lt;code&gt;fn&lt;/code&gt; proc doesn't accept &lt;code&gt;string&lt;/code&gt; and &lt;code&gt;cstring&lt;/code&gt; types and only the &lt;code&gt;constChar&lt;/code&gt; type is allowed. After looking at the generated C codes using &lt;code&gt;nim c -r --nimcache:nimcache app.nim&lt;/code&gt; or &lt;code&gt;nim cpp -r --nimcache:nimcache app.nim&lt;/code&gt;, it does generate &lt;code&gt;const char* x = "abc";&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lastly let's look at an example with C++ backend, it has the same story as above.&lt;/p&gt;

&lt;p&gt;Now we need to create a new &lt;code&gt;.h&lt;/code&gt; file and overload the &lt;code&gt;fn&lt;/code&gt; functions.&lt;/p&gt;

&lt;p&gt;fun.h&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;fun.nim&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nim"&gt;&lt;code&gt;&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;constChar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;importcpp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$1&lt;/span&gt;&lt;span class="s"&gt;(@)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"fun.h"&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;discard&lt;/span&gt;
&lt;span class="k"&gt;proc &lt;/span&gt;&lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cstring&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{.&lt;/span&gt;&lt;span class="n"&gt;importcpp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$1&lt;/span&gt;&lt;span class="s"&gt;(@)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"fun.h"&lt;/span&gt;&lt;span class="p"&gt;.}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;discard&lt;/span&gt;


&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;constChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abs"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'b'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abc"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doAssert&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'b'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the codes above using &lt;code&gt;nim cpp -r fun.nim&lt;/code&gt; and it works!&lt;/p&gt;

&lt;p&gt;Reference:&lt;br&gt;
&lt;a href="https://github.com/nim-lang/Nim/issues/3720"&gt;https://github.com/nim-lang/Nim/issues/3720&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nim is a great language. Let's port and wrap more libraries for it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nim-lang/needed-libraries/issues"&gt;https://github.com/nim-lang/needed-libraries/issues&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nothings/single_file_libs"&gt;https://github.com/nothings/single_file_libs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nim</category>
      <category>ffi</category>
      <category>c</category>
    </item>
  </channel>
</rss>
