<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://mojolang.static.modular-staging.com/releases/</id>
    <title>Mojo Blog</title>
    <updated>2026-05-07T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://mojolang.static.modular-staging.com/releases/"/>
    <subtitle>Mojo Blog</subtitle>
    <icon>https://mojolang.static.modular-staging.com/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Mojo v1.0.0b1]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v1.0.0b1/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/"/>
        <updated>2026-05-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/#-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation">Documentation<a href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">
<p>Compilation targets docs instructs how to inspect your current platform,
select a target configuration, and generate code for that target. Use it to
build for your own system or target other CPUs, operating systems, and
accelerators.</p>
</li>
<li class="">
<p>Mojo language reference covers lexical elements, expressions, statements,
numeric types, struct declarations, trait declarations.</p>
</li>
<li class="">
<p>Functions reference page improves discoverability of new function features.</p>
</li>
<li class="">
<p>Split operators manual into separate pages; refreshed coverage and added
tutorial, operator tests, and new reference page.</p>
</li>
<li class="">
<p>Negative examples and errors added to reference pages highlight sharp
edges of the language.</p>
</li>
<li class="">
<p>MLIR reference page introduces inline MLIR to developers in Mojo code.</p>
</li>
<li class="">
<p>Adds docs for non-nullable pointers and provides sample code showing
how to use <code>Optional</code> with <code>UnsafePointer</code>.</p>
</li>
<li class="">
<p>Separated the Mojo layout library docs from the MAX kernels library,
reflecting that the layout library ships with the <code>mojo</code> package while the
rest of the kernels library ships with the <code>max</code> package.</p>
</li>
<li class="">
<p>Added a new guide for building Mojo packages, currently covering the
<code>rattler-build</code> workflow.</p>
</li>
<li class="">
<p>Restructured the Mojo and MAX system requirements and GPU compatibility
docs. Replaced the three-tier GPU support model with a two-level
"Continuously tested" / "Known compatible" taxonomy, added a dedicated
Mojo GPU compatibility page with per-vendor hardware tables and driver
requirements, and simplified the main requirements pages.</p>
</li>
<li class="">
<p>Added a Mojo manual reference page for the <code>@doc_hidden</code> decorator.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="language-enhancements">Language enhancements<a href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/#language-enhancements" class="hash-link" aria-label="Direct link to Language enhancements" title="Direct link to Language enhancements" translate="no">​</a></h2>
<ul>
<li class="">
<p>Added type refinement based on compile time assumptions, enabling Mojo to
narrow types from <code>where</code> clauses, <code>comptime if</code> statements, and
<code>comptime assert</code> statements. Refinements in a scope are driven by
<code>conforms_to()</code> expressions.</p>
<p>Before:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__contains__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">.</span><span class="token plain">T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Bool where conforms_to</span><span class="token punctuation">(</span><span class="token plain">Self</span><span class="token punctuation">.</span><span class="token plain">T</span><span class="token punctuation">,</span><span class="token plain"> Equatable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> item </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> trait_downcast</span><span class="token punctuation">[</span><span class="token plain">Equatable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">item</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> trait_downcast</span><span class="token punctuation">[</span><span class="token plain">Equatable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">value</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">True</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">False</span><br></div></code></pre></div></div>
<p>After:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__contains__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">.</span><span class="token plain">T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Bool where conforms_to</span><span class="token punctuation">(</span><span class="token plain">Self</span><span class="token punctuation">.</span><span class="token plain">T</span><span class="token punctuation">,</span><span class="token plain"> Equatable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> item </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> item </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">True</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">False</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Improved diagnostics for onboarding-priority parser errors in Mojo
for clarity and UX.</p>
</li>
<li class="">
<p>Updated signature error diagnostics and added related tests.</p>
</li>
<li class="">
<p>Mojo now uses <code>NoneType</code> instead of an empty tuple to mark constructor
using literals.</p>
</li>
<li class="">
<p>The ternary <code>if/else</code> expression now coerces each element to its contextual
type when it is obvious. For example, this works instead of producing an
error about incompatible metatypes:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> some_type</span><span class="token punctuation">:</span><span class="token plain"> Movable </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Int </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> cond </span><span class="token keyword" style="color:#af2528">else</span><span class="token plain"> String</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Unified closure improvements.</strong> This release continues the closure
unification work begun in earlier releases: stateless closures auto-lift,
the <code>ref</code> capture convention is supported, default capture conventions can
be combined with explicit capture lists, and a new <code>thin</code> function effect
distinguishes function pointer types from closure traits.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token punctuation">,</span><span class="token plain"> d </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hello"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Legacy closure: no capture list. Cannot capture variables.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">hello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"hi"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Unified closure with no captures (stateless). Stateless closures</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># lift to top-level functions and can be passed as FFI callbacks.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">add_one</span><span class="token punctuation">(</span><span class="token plain">n</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> n </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Unified closure with explicit captures and a default capturing</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># convention:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">my_fn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token keyword" style="color:#af2528">mut</span><span class="token plain"> a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token operator" style="color:#a89984">^</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">read</span><span class="token punctuation">}</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token comment" style="color:#a89984"># capture:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token comment" style="color:#a89984"># `a` by mut reference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token comment" style="color:#a89984"># `b` by immut reference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token comment" style="color:#a89984"># `c` by moving</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token comment" style="color:#a89984"># `d` by immut reference (the default `read` convention)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        use</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token punctuation">,</span><span class="token plain"> d</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Unified closure that captures `x` by ref (carries an</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># origin-mutability parameter):</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">show_x</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> x</span><span class="token punctuation">}</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Function effects come before the capture list. The calling context</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># must handle errors raised from a `raises` closure.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">fallible</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises </span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">raise</span><span class="token plain"> Error</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"nope"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Closures are invoked like ordinary functions:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    hello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">add_one</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">41</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    my_fn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    show_x</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">try</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        fallible</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">except</span><span class="token plain"> e</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">e</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># The `thin` function effect declares a function pointer type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># (distinct from a closure trait). Stateless closures and top-level</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># functions satisfy `thin`:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> fn_ptr</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">def</span><span class="token punctuation">(</span><span class="token plain">Int</span><span class="token punctuation">)</span><span class="token plain"> thin </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> add_one</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">fn_ptr</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">99</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added <code>abi("C")</code> as a function effect for declaring C calling convention on
function definitions and function pointer types. Functions marked with
<code>abi("C")</code> use the platform C ABI (System V x86-64 / ARM64 AAPCS) for
struct arguments and return values, enabling safe interop with C libraries:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># C-ABI function definition (safe as a callback into C code)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">add</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Int32</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int32</span><span class="token punctuation">)</span><span class="token plain"> abi</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"C"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int32</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> a </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> b</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># C-ABI function pointer type (safe for use with DLHandle.get_function)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> f </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> handle</span><span class="token punctuation">.</span><span class="token plain">get_function</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">def</span><span class="token punctuation">(</span><span class="token plain">Float64</span><span class="token punctuation">)</span><span class="token plain"> abi</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"C"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Float64</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"sqrt"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p><code>DLHandle.get_function[]</code> now enforces that the type parameter carries
<code>abi("C")</code>, preventing silent ABI mismatches when loading C symbols.</p>
</li>
<li class="">
<p>String literals now support <code>\uXXXX</code> and <code>\UXXXXXXXX</code> unicode escape
sequences, matching Python. The resulting code point is stored as UTF-8.
Invalid code points and surrogates are rejected at parse time.</p>
</li>
<li class="">
<p>Added support for conditional <code>RegisterPassable</code> conformance.</p>
</li>
<li class="">
<p>Variadic lists and packs can be forwarded through runtime calls with <code>*pack</code>
when the callee takes a compatible variadic list/pack.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> callee</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">:</span><span class="token plain"> Writable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token plain">args</span><span class="token punctuation">.</span><span class="token plain">__len__</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">args</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> forwarder</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">:</span><span class="token plain"> Writable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    callee</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">forwarder</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hello"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3.14</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints each value on a separate line</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Heterogenous variadic packs can now be specified with a <code>SomeType</code> helper
function. These two are equivalent:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">arg_types</span><span class="token punctuation">:</span><span class="token plain"> Copyable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">arg_types</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">SomeTypeList</span><span class="token punctuation">[</span><span class="token plain">Copyable</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>T-strings can now be used in <code>comptime assert</code> messages:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">assert</span><span class="token plain"> i </span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> t</span><span class="token string" style="color:#477a5b">"expected i &gt; 5, got {i}"</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added <code>__mlir_deferred_type[...]</code> for declaring parameter-dependent return
types and operation result types in inline MLIR. The parser combines the
bracketed pieces into a type string and the elaborator builds the concrete
MLIR type once parameters are substituted.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/#language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Variadic parameters lists are now passed instead of <code>ParameterList</code> and
<code>TypeList</code> instead of <code>!kgen.param_list</code>. This makes it much more ergonomic to
work with these types, e.g. simple logic just works:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> callee</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">values</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> v </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">values</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        v </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> values</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> elt </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> values</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        v </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> elt</span><br></div></code></pre></div></div>
<p>Similarly, the <code>ParameterList</code>/<code>TypeList</code> structs have other methods for
transforming the value list. As such, a variety of values from the <code>Variadic</code>
struct have started moving over to being members of these types.</p>
</li>
<li class="">
<p>All Mojo functions now has a unique "function literal type". In practice, it
means that:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># type_of(foo) != type_of(bar)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>fn</code> keyword for function declarations is deprecated. Mojo now emits a
compiler warning on uses of <code>fn</code>; this will become a compilation error in
the next release. Use <code>def</code> instead.</p>
</li>
<li class="">
<p>The <code>unified</code> keyword has been removed; specify unified-closure semantics
with an explicit capture list <code>{...}</code> after the function signature. An
empty capture list <code>{}</code> denotes unified with no captures. Closures without
any capture list are legacy. Mojo also now warns when a function pointer
type omits the <code>thin</code> effect; specify <code>thin</code> explicitly to silence the
warning.</p>
</li>
<li class="">
<p>Removed support for comparing tuples of differing lengths or types. Such
comparisons (for example <code>(1, 2) != (4, 5, 6)</code>) are now rejected statically
by the type system instead of silently returning not-equal.</p>
</li>
<li class="">
<p><code>A if comptime(C) else B</code> now skips elaboration of the dead branch,
treating the ternary expression as a compile-time evaluation contract
analogous to <code>comptime if C: A else: B</code>.</p>
</li>
<li class="">
<p><code>@explicit_destroy</code> is now rejected at parse time when paired with an
unconditional <code>ImplicitlyDestructible</code> conformance; it remains valid only
on conditional (where-clause-constrained) conformances.</p>
</li>
<li class="">
<p>Import statements of the form <code>from pkg import ...</code> no longer make <code>pkg</code>
available to the module.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="library-changes">Library changes<a href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/#library-changes" class="hash-link" aria-label="Direct link to Library changes" title="Direct link to Library changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Removed explicit <code>trait_downcast</code>/<code>trait_downcast_var</code> across the standard
library sources, now that Mojo applies type refinement from comptime
assumptions. Public APIs are unchanged. Updated files:</p>
<ul>
<li class=""><code>stdlib/std/builtin/</code>: <code>_stubs.mojo</code>, <code>bool.mojo</code></li>
<li class=""><code>stdlib/std/collections/</code>: <code>deque.mojo</code>, <code>dict.mojo</code>, <code>inline_array.mojo</code>,
<code>linked_list.mojo</code>, <code>list.mojo</code>, <code>optional.mojo</code>, <code>set.mojo</code></li>
<li class=""><code>stdlib/std/iter/__init__.mojo</code>, <code>stdlib/std/itertools/itertools.mojo</code></li>
<li class=""><code>stdlib/std/memory/</code>: <code>arc_pointer.mojo</code>, <code>owned_pointer.mojo</code>, <code>span.mojo</code></li>
</ul>
</li>
<li class="">
<p>Consolidated the reflection APIs in <code>std.reflection</code> behind a unified entry
point <code>reflect[T]()</code> returning a <code>Reflected[T]</code> handle. <code>reflect</code> is
auto-imported via the prelude, so it is available without an explicit
import. Methods on the handle replace the family of <code>struct_field_*</code> free
functions (dropping the <code>struct_</code> prefix — only structs have fields) and
the <code>get_type_name</code> / <code>get_base_type_name</code> free functions:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Point</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> r </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> reflect</span><span class="token punctuation">[</span><span class="token plain">Point</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">r</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">                          </span><span class="token comment" style="color:#a89984"># "Point"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">r</span><span class="token punctuation">.</span><span class="token plain">field_count</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">                   </span><span class="token comment" style="color:#a89984"># 2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">r</span><span class="token punctuation">.</span><span class="token plain">field_names</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">                </span><span class="token comment" style="color:#a89984"># x</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> y_type </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> r</span><span class="token punctuation">.</span><span class="token plain">field_type</span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"y"</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Reflected[Float64]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">y_type</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">                     </span><span class="token comment" style="color:#a89984"># "SIMD[DType.float64, 1]"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">reflect</span><span class="token punctuation">[</span><span class="token plain">List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">base_name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># "List"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> v</span><span class="token punctuation">:</span><span class="token plain"> y_type</span><span class="token punctuation">.</span><span class="token plain">T </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3.14</span><br></div></code></pre></div></div>
<p>Methods on <code>Reflected[T]</code>: <code>name[qualified_builtins=]</code>, <code>base_name</code>,
<code>is_struct</code>, <code>field_count</code>, <code>field_names</code>, <code>field_types</code>,
<code>field_index[name]</code>, <code>field_type[name]</code>,
<code>field_offset[name=]/[index=]</code>, and <code>field_ref[idx](s)</code>. The
<code>field_type[name]()</code> method returns a <code>Reflected[FieldT]</code>, so reflection
is fully composable.</p>
<p>The legacy free functions — <code>struct_field_count</code>, <code>struct_field_names</code>,
<code>struct_field_types</code>, <code>struct_field_index_by_name</code>,
<code>struct_field_type_by_name</code>, <code>struct_field_ref</code>, <code>is_struct_type</code>,
<code>offset_of</code>, <code>get_type_name</code>, <code>get_base_type_name</code> — and the
<code>ReflectedType[T]</code> wrapper are now <code>@deprecated</code> and delegate to the new
API. They will be removed in a future release.</p>
</li>
<li class="">
<p>Added <code>struct_field_ref[idx, T](ref s)</code> to <code>std.reflection</code> for accessing
struct fields by index without copying. The function returns a reference
with the same mutability as <code>s</code> and works with both concrete and generic
struct types, including parametric indices in <code>comptime for</code> loops. The
default implementations of <code>Hashable</code>, <code>Equatable</code>, and <code>Writable</code> now use
this library function instead of the <code>__struct_field_ref</code> magic.</p>
</li>
<li class="">
<p>The <code>Boolable</code>, <code>Defaultable</code>, and <code>Writable</code> traits no longer inherit from
<code>ImplicitlyDestructible</code>. Generic code that relied on receiving the
destructor bound transitively through these traits must now spell it out
explicitly, for example <code>T: Writable &amp; ImplicitlyDestructible</code>.</p>
</li>
<li class="">
<p>The <code>Variadic</code> suite of low-level operation has been refactored and migrated
to being members of the <code>TypeList</code> and <code>ParameterList</code> types, making them more
ergonomic to work with and more accessible.</p>
</li>
<li class="">
<p>Atomic operations have moved to a dedicated <code>std.atomic</code> module. The
<code>Consistency</code> type has been renamed to <code>Ordering</code> and its <code>MONOTONIC</code>
member has been renamed to <code>RELAXED</code> to align with conventions used by
other languages. Update existing code as follows:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Before</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> std</span><span class="token punctuation">.</span><span class="token plain">os </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Atomic</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> std</span><span class="token punctuation">.</span><span class="token plain">os</span><span class="token punctuation">.</span><span class="token plain">atomic </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Atomic</span><span class="token punctuation">,</span><span class="token plain"> Consistency</span><span class="token punctuation">,</span><span class="token plain"> fence</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">_ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> atom</span><span class="token punctuation">.</span><span class="token plain">load</span><span class="token punctuation">[</span><span class="token plain">ordering</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Consistency</span><span class="token punctuation">.</span><span class="token plain">MONOTONIC</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> std</span><span class="token punctuation">.</span><span class="token plain">atomic </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Atomic</span><span class="token punctuation">,</span><span class="token plain"> Ordering</span><span class="token punctuation">,</span><span class="token plain"> fence</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">_ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> atom</span><span class="token punctuation">.</span><span class="token plain">load</span><span class="token punctuation">[</span><span class="token plain">ordering</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Ordering</span><span class="token punctuation">.</span><span class="token plain">RELAXED</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added <code>Optional.destroy_with(destroy_func)</code>, which destroys an <code>Optional[T]</code>
in-place using a caller-provided destructor. This enables <code>Optional</code> to hold
element types that are not <code>ImplicitlyDestructible</code> (for example, types
marked <code>@explicit_destroy</code>), mirroring <code>Variant.destroy_with</code>. Both
<code>Optional.destroy_with</code> and <code>Variant.destroy_with</code> now accept closures that
capture local state in addition to plain function references. Note that
<code>Variant.destroy_with</code> callers must now pass the destroyed type explicitly
(for example, <code>v^.destroy_with[Int](destroy_func)</code>) since <code>T</code> can no longer
be inferred from the closure type.</p>
</li>
<li class="">
<p><code>assert_raises</code> now catches custom <code>Writable</code> error types, not just <code>Error</code>.</p>
</li>
<li class="">
<p>Added UAX #29 grapheme cluster segmentation to <code>String</code> and <code>StringSlice</code>.
New APIs: <code>graphemes()</code> returns a <code>GraphemeSliceIter</code> that yields each
user-perceived "character" as a <code>StringSlice</code>, and <code>count_graphemes()</code> returns
the grapheme cluster count. This correctly handles combining marks, emoji ZWJ
sequences, flag emoji, Hangul syllables, and other multi-codepoint clusters.</p>
</li>
<li class="">
<p><code>StringSlice</code> now supports slicing by grapheme cluster via the <code>grapheme=</code>
keyword argument, mirroring the existing <code>byte=</code> indexer. For example,
<code>s[grapheme=0:3]</code> returns a <code>StringSlice</code> covering the first three grapheme
clusters, and <code>s[grapheme=i:i+1]</code> extracts the <em>i</em>-th grapheme. Out-of-range
ends are clamped to the end of the string; negative indices are not supported.
Because grapheme boundaries are discovered by a forward scan, this operation
is O(n) in the byte length — prefer <code>byte=</code> slicing when you already have
byte offsets.</p>
</li>
<li class="">
<p><code>GraphemeSliceIter</code> exposes a new <code>remaining_byte_length()</code> accessor that
reports the byte length of the iterator's remaining range in O(1). This
lets callers compute how many bytes the iterator has produced so far
without summing per-grapheme byte lengths, and is now used by
<code>StringSlice[grapheme=...]</code> for an ~1.4x speedup on ASCII-heavy inputs.</p>
</li>
<li class="">
<p><code>GraphemeSliceIter</code> now supports reverse iteration. <code>next_back()</code> and
<code>peek_back()</code> return the last grapheme cluster in the remaining range, and
<code>StringSlice.graphemes_reversed()</code> / <code>String.graphemes_reversed()</code> return a
<code>GraphemeSliceIter</code> whose <code>for</code>-loop iteration walks clusters from end to
start. <code>next()</code> and <code>next_back()</code> can be interleaved on the same iterator.
Reverse iteration costs more per cluster than forward iteration because the
UAX #29 state machine is inherently forward-scanning: <code>next_back()</code> backs
up to a guaranteed grapheme boundary (the start of the string or a
Control/CR/LF codepoint) and rescans forward. The safe boundary is cached
across reverse calls — a forward <code>next()</code> invalidates it — so per-call cost
is dominated by forward-scan length: small in text containing line breaks
or whitespace, growing with the distance back to such a codepoint in long
runs without them.</p>
</li>
<li class="">
<p>Added grapheme-aware algorithms on <code>String</code> and <code>StringSlice</code>:</p>
<ul>
<li class=""><code>grapheme_indices()</code> returns a <code>GraphemeIndicesIter</code> that yields
<code>(byte_offset, grapheme)</code> pairs, mirroring Rust's
<code>str::grapheme_indices</code>. Useful for text editors or UIs that need to
map cursor byte positions back to grapheme boundaries.</li>
<li class=""><code>nth_grapheme(n)</code> returns the <code>n</code>-th grapheme cluster as an
<code>Optional[StringSlice]</code>, or <code>None</code> when <code>n</code> is out of range.</li>
<li class=""><code>split_at_grapheme(n)</code> returns <code>Tuple[StringSlice, StringSlice]</code>
holding the prefix <code>[0, n)</code> and suffix <code>[n, count)</code> of grapheme
clusters in a single pass, clamping <code>n</code> to the total count.</li>
</ul>
</li>
<li class="">
<p><code>count_graphemes()</code> now takes a fast path over runs of printable ASCII
(U+0020..U+007E). Each such byte has GBP <code>Other</code> and two consecutive
safe-ASCII bytes always have a grapheme-cluster break between them
(GB999), so safe-ASCII runs can be counted at one grapheme per byte
without entering the UAX #29 state machine. On pure-ASCII text this is
roughly 10x faster (~0.38 ms vs. ~3.85 ms for 1 MB of English), and
~5-6x faster on ASCII-dominant mixed text (Spanish UN charter). Pure
non-ASCII text (Arabic, Russian, Chinese) is unchanged.</p>
</li>
<li class="">
<p>Variadics of types have been moved to the <code>TypeList</code> struct.
One can write operations such as:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">assert</span><span class="token plain"> TypeList</span><span class="token punctuation">[</span><span class="token plain">Trait</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">AnyType</span><span class="token punctuation">,</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> String</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">contains</span><span class="token punctuation">[</span><span class="token plain">Bool</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>abort(message)</code> now includes the call site location in its output. The
location is automatically captured and printed alongside the message. You can
also pass an explicit <code>SourceLocation</code> to override it:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">abort</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"something went wrong"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># prints: ABORT: path/to/file.mojo:42:5: something went wrong</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> loc </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> current_location</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">abort</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"something went wrong"</span><span class="token punctuation">,</span><span class="token plain"> location</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">loc</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>abort(message)</code> now prints its message on Nvidia and AMDGPU, including
block and thread IDs. Previously, the message was silently suppressed on
these GPUs. On Apple GPU, the message is silently suppressed for now.</p>
</li>
<li class="">
<p><code>SourceLocation</code> fields (<code>line</code>, <code>col</code>, <code>file_name</code>) are now private.
Use the new accessor methods <code>line()</code>, <code>column()</code>, and <code>file_name()</code> instead.</p>
</li>
<li class="">
<p>Fixed default alignment in <code>TileTensor.load()</code> and <code>TileTensor.store()</code> to
use the caller-specified <code>width</code> parameter instead of <code>Self.element_size</code>.</p>
</li>
<li class="">
<p>Added uninitialized memory read detection for float loads. When compiled
with <code>-D MOJO_STDLIB_SIMD_UNINIT_CHECK=true</code>, every float load is checked
against the debug allocator's poison pattern (the largest finite value of
the float type, e.g. <code>FLT_MAX</code> for <code>Float32</code>). A match triggers <code>abort()</code>
with a descriptive message. The non-NaN poison pattern lets <code>nan-check</code>
and <code>uninit-read-check</code> coexist (a NaN poison would be flagged by
<code>nan-check</code> as a legitimate NaN error in kernels that intentionally only
write active positions). When disabled (the default), zero runtime
overhead. For MAX pipelines, set
<code>MODULAR_MAX_DEBUG_UNINITIALIZED_READ_CHECK=true</code> to enable both the debug
allocator and the load-time checks automatically.</p>
</li>
<li class="">
<p><strong>Expanded Apple Silicon GPU support.</strong> Apple Metal GPU is now a more
capable Mojo target.</p>
<ul>
<li class=""><code>print()</code> and <code>_printf()</code> now work on Apple Metal GPU. Output is chunked
through the Metal <code>os_log</code> path, with a Float32-only formatter that
matches Metal's hardware constraints. <code>_printf()</code> currently emits the
format string only (not interpolated arguments); <code>|x| &lt; 1e-7</code> is
truncated to <code>0.0</code> and there is no scientific notation.</li>
<li class=""><code>external_memory[]()</code> (dynamic threadgroup memory) is now supported on
Apple Silicon. The compiler and runtime bridge CUDA-style extern shared
symbols to Metal's <code>setThreadgroupMemoryLength:atIndex:</code> model, so
existing GPU kernels using <code>external_memory[]()</code> work unchanged.</li>
<li class="">Apple M5 MMA intrinsics (<code>apple_mma_load</code>, <code>apple_mma_store</code>,
<code>_mma_apple</code>) in <code>std.gpu.compute.arch.mma_apple</code> enable hardware matrix
multiply-accumulate on Apple GPU.</li>
<li class="">Added <code>CompilationTarget.is_apple_m5()</code> to <code>std.sys</code> for detecting Apple
M5 targets at compile time; <code>is_apple_silicon()</code> now includes M5 in its
check.</li>
<li class="">Apple GPU targets now prefer <code>metal4</code> features by default when the
toolchain supports them, automatically appending <code>-metal4</code> to the arch
instead of requiring explicit <code>m5-metal4</code> selection.</li>
<li class=""><strong>Atomic ordering:</strong> <code>release</code> ordering is not supported on Metal. Apple
GPU targets now use <code>monotonic</code> (relaxed) atomic ordering by default.</li>
<li class=""><strong>Floating-point widths:</strong> the compiler now rejects floating-point types
wider than 32 bits (<code>Float64</code>/<code>Float80</code>/<code>Float128</code>) for Apple GPU
targets, since Metal supports only <code>Float16</code> and <code>Float32</code>.</li>
</ul>
</li>
<li class="">
<p>Standard library types now use conditional conformances, replacing previous
<code>_constrained_conforms_to</code> checks:</p>
<ul>
<li class=""><code>Span</code>: <code>Writable</code>, <code>Hashable</code></li>
<li class=""><code>Tuple</code>, <code>Optional</code>, <code>Variant</code>, and <code>UnsafeMaybeUninit</code>: <code>RegisterPassable</code></li>
<li class=""><code>Variant</code>: <code>Copyable</code>, <code>ImplicitlyCopyable</code></li>
<li class=""><code>Optional</code>: <code>DevicePassable</code> (conditional on element type)</li>
</ul>
</li>
<li class="">
<p><code>Tuple</code> now conditionally conforms to <code>Defaultable</code>, so generic
<code>T: Defaultable</code> code can default-construct tuples when all element types are
<code>Defaultable</code>.</p>
</li>
<li class="">
<p><code>OwnedDLHandle.get_symbol()</code> now returns <code>Optional[UnsafePointer[...]]</code>
instead of aborting when a symbol is not found. This allows callers to handle
missing symbols gracefully.</p>
</li>
<li class="">
<p><code>UnsafePointer</code> is now non-null by design. See the
<a href="https://github.com/modular/modular/blob/main/mojo/proposals/non-null-pointer.md" target="_blank" rel="noopener noreferrer" class="">non-null pointer proposal</a>
for the full design and migration timeline.</p>
<p>The default null constructor <code>__init__(out self)</code> and <code>__bool__(self)</code> method
are now deprecated, and <code>UnsafePointer</code> no longer conforms to <code>Defaultable</code> or
<code>Boolable</code>.</p>
<p>To migrate, express nullability explicitly with
<code>Optional[UnsafePointer[...]]</code>, which has the same layout as <code>UnsafePointer</code>
(the null address is the <code>None</code> niche) so nullable pointers remain
zero-overhead and can be used across C-FFIs.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Before: null default construction</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> UnsafePointer</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">,</span><span class="token plain"> origin</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After: express absence with Optional</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr</span><span class="token punctuation">:</span><span class="token plain"> Optional</span><span class="token punctuation">[</span><span class="token plain">UnsafePointer</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">,</span><span class="token plain"> origin</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Before: Bool-based null check</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> ptr</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    use</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After: check the Optional, then unwrap</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> ptr</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    use</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>If you specifically need a non-null placeholder for a field that will be
populated later (for example, a buffer that is allocated on demand) use
<code>UnsafePointer.unsafe_dangling()</code>, which returns a well-aligned but dangling
pointer. Note that <code>unsafe_dangling()</code> is not a null sentinel: types that
lazily allocate must track initialization separately.</p>
</li>
<li class="">
<p>GPU primitive id accessors (<code>thread_idx</code>, <code>block_idx</code>, <code>block_dim</code>,
<code>grid_dim</code>, <code>global_idx</code>, <code>lane_id</code>, <code>warp_id</code>, <code>cluster_dim</code>,
<code>cluster_idx</code>, and <code>block_id_in_cluster</code>) have migrated from <code>UInt</code> to
<code>Int</code>.</p>
<p>This is part of a broader migration to standardize on the <code>Int</code> type for
all sizes and offsets in Mojo. As a related step in the same migration,
<code>TensorCore.load_a()</code> and <code>TensorCore.load_b()</code> now also take <code>Int</code>
arguments instead of <code>UInt</code>.</p>
<p>To provide a gradual migration path, explicitly typed <code>*_uint</code> aliases of
the seven non-cluster accessors are available temporarily:</p>





































<table><thead><tr><th>Accessor</th><th>Legacy <code>UInt</code> alias</th></tr></thead><tbody><tr><td><code>thread_idx</code></td><td><code>thread_idx_uint</code></td></tr><tr><td><code>block_idx</code></td><td><code>block_idx_uint</code></td></tr><tr><td><code>block_dim</code></td><td><code>block_dim_uint</code></td></tr><tr><td><code>grid_dim</code></td><td><code>grid_dim_uint</code></td></tr><tr><td><code>global_idx</code></td><td><code>global_idx_uint</code></td></tr><tr><td><code>lane_id</code></td><td><code>lane_id_uint</code></td></tr><tr><td><code>warp_id</code></td><td><code>warp_id_uint</code></td></tr></tbody></table>
<p>The three cluster accessors (<code>cluster_dim</code>, <code>cluster_idx</code>,
<code>block_id_in_cluster</code>) migrated directly without <code>*_uint</code> aliases, since
their usage was limited.</p>
<p>Code can preserve its prior <code>UInt</code> behavior by using a renaming import of
the <code>*_uint</code> alias:</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">- from std.gpu import thread_idx</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">+ from std.gpu import thread_idx_uint as thread_idx</span><br></div></code></pre></div></div>
<p>The temporary <code>*_int</code> accessors that briefly existed during the phased
migration as a forward-compatibility aid have been removed; use the
unprefixed accessors (which now return <code>Int</code> by default). The <code>*_uint</code>
aliases will eventually be deprecated and removed as well.</p>
</li>
<li class="">
<p>Added <code>IterableOwned</code> trait to the iteration module. Types conforming to
<code>IterableOwned</code> implement <code>__iter__(var self)</code>, which consumes the collection
and returns an iterator that owns the underlying elements.</p>
<ul>
<li class=""><code>List</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Optional</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Deque</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>LinkedList</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Dict</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Set</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Counter</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>InlineArray</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Span</code> now conforms to <code>IterableOwned</code> (conditional on <code>T: Copyable</code>).
The owned iterator yields copies of elements by value.</li>
<li class="">Iterator adaptors (<code>enumerate</code>, <code>zip</code>, <code>map</code>, <code>peekable</code>, <code>take_while</code>,
<code>drop_while</code>, <code>product</code>, <code>cycle</code>, <code>count</code>, <code>repeat</code>) now conform to
<code>IterableOwned</code>.</li>
<li class="">Added owned overloads of <code>enumerate()</code>, <code>zip()</code>, <code>map()</code>, <code>peekable()</code>,
<code>take_while()</code>, <code>drop_while()</code>, <code>product()</code>, and <code>cycle()</code> that consume the
input iterable.</li>
</ul>
</li>
<li class="">
<p><code>CStringSlice</code> can no longer represent a null pointer. To represent
nullability use <code>Optional[CStringSlice]</code> which is guaranteed to have the same
size and layout as <code>const char*</code>, where <code>NULL</code> is the empty <code>Optional</code>.</p>
</li>
<li class="">
<p><code>external_call</code>'s <code>return_type</code>'s requirements has been relaxed from
<code>TrivialRegisterPassable</code> to <code>RegisterPassable</code>.</p>
</li>
<li class="">
<p>Negative indexing on all stdlib collections has been removed to enable cheap
CPU bounds checks by default:</p>
<ul>
<li class=""><code>List</code></li>
<li class=""><code>Span</code></li>
<li class=""><code>InlineArray</code></li>
<li class=""><code>String</code></li>
<li class=""><code>StringSlice</code></li>
<li class=""><code>LinkedList</code></li>
<li class=""><code>Deque</code></li>
<li class=""><code>IntTuple</code></li>
</ul>
<p>Using a negative <code>IntLiteral</code> for indexing will now trigger a compile-time
error, for example:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">/tmp/main.mojo:3:12: note: call expansion failed with parameter value(s): (..., ...)</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        print(x[-1])</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            ^</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">constraint failed: negative indexing is not supported, use e.g. `x[len(x) - 1]` instead</span><br></div></code></pre></div></div>
<p>Update any <code>x[-1]</code> to <code>x[len(x) - 1]</code>, following the compiler errors to
your call sites as above.</p>
<p>This does not affect any MAX ops that support negative indexing.</p>
</li>
<li class="">
<p>Bounds checking is now on by default for all collections on CPU, and will show
you the call site in your code where you triggered the out of bounds access:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">At: /tmp/main.mojo:3:12: Assert Error: index 3 is out of bounds, valid range is 0 to 2</span><br></div></code></pre></div></div>
<p>Bounds checking is still off by default for GPU to avoid performance
penalties. To enable it for tests:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">mojo build </span><span class="token parameter variable" style="color:#af2528">-D</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#af2528">ASSERT</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">all main.mojo</span><br></div></code></pre></div></div>
<p>To turn off all asserts, including CPU bounds checking:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">mojo build </span><span class="token parameter variable" style="color:#af2528">-D</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#af2528">ASSERT</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">none main.mojo</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>alloc[T](count, alignment)</code> will now <code>abort</code> if the underlying allocation
failed.</p>
</li>
<li class="">
<p>Added <code>Variadic.contains_value</code> comptime alias to check whether a variadic
sequence contains a specific value at compile time.</p>
</li>
<li class="">
<p><code>ArcPointer</code> now conditionally conforms to <code>Hashable</code> and <code>Equatable</code> when
its inner type <code>T</code> does. Both <code>__eq__</code> and <code>__hash__</code> delegate to the managed
value, matching C++ <code>shared_ptr</code> and Rust <code>Arc</code> semantics. This makes
<code>ArcPointer</code> usable as a <code>Dict</code> key or <code>Set</code> element with value-based
equality. Pointer identity is still available via the <code>is</code> operator.</p>
</li>
<li class="">
<p><code>Path</code> now conforms to <code>Comparable</code>, enabling lexicographic ordering and use
with <code>sort()</code>.</p>
</li>
<li class="">
<p><code>range()</code> overloads that took differently-typed arguments or arguments that
were <code>Intable</code>/<code>IntableRaising</code> but not <code>Indexer</code> have been removed. Callers
should ensure they're passing consistent integral argument types when calling
<code>range()</code>.</p>
</li>
<li class="">
<p><code>Consistency</code> now has a default constructor that selects <code>RELEASE</code> ordering on
Apple GPU and <code>SEQUENTIAL</code> on all other targets. All <code>Atomic</code> methods and
<code>fence</code> use this platform-aware default instead of hard-coding <code>SEQUENTIAL</code>.</p>
</li>
<li class="">
<p><code>NDBuffer</code> has been fully removed. Please migrate to <code>TileTensor</code>.</p>
</li>
<li class="">
<p>Added a generic <code>__contains__</code> method to <code>Span</code> for any element type
conforming to <code>Equatable</code>, not just <code>Scalar</code> types.</p>
</li>
<li class="">
<p>Fixed <code>blocked_product</code> in <code>tile_layout</code> to zip block and tiler dimensions
per mode, matching the legacy <code>blocked_product</code> behavior.</p>
</li>
<li class="">
<p>Added <code>Span</code>-based overloads for <code>enqueue_copy</code>, <code>enqueue_copy_from</code>, and
<code>enqueue_copy_to</code> on <code>DeviceContext</code>, <code>DeviceBuffer</code>, and <code>HostBuffer</code>,
providing a safer alternative to raw <code>UnsafePointer</code> for host-device memory
transfers.</p>
</li>
<li class="">
<p><code>String.__len__()</code> has been deprecated. Prefer to use <code>String.byte_length()</code>
or <code>String.count_codepoints()</code>.</p>
</li>
<li class="">
<p>Added <code>map()</code> and <code>and_then()</code> methods to <code>Optional</code>. <code>map()</code> transforms
the contained value by applying a function, returning <code>Optional[To]</code>.
<code>and_then()</code> chains operations that themselves return an <code>Optional</code>, enabling
flat-mapping over fallible computations.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> o </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Optional</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">closure</span><span class="token punctuation">(</span><span class="token plain">n</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token plain">n </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> mapped</span><span class="token punctuation">:</span><span class="token plain"> Optional</span><span class="token punctuation">[</span><span class="token plain">String</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> o</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">map</span><span class="token punctuation">[</span><span class="token plain">To</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">String</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">closure</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">mapped</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Optional("43")</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added <code>std.memory.forget_deinit()</code> to enable low-level code to skip the usual
requirement to run a destructor for a value. This function should be used
rarely, when building low-level abstractions.</p>
</li>
<li class="">
<p><strong>CPU <code>DeviceContext</code> expansion.</strong> <code>DeviceContext(api="cpu")</code> is now usable
as a stream-ordered execution context for CPU work, paving the way for
NUMA-aware CPU dispatch.</p>
<ul>
<li class="">Added <code>DeviceContext.enqueue_cpu_function()</code> and
<code>DeviceContext.enqueue_cpu_range()</code> for stream-ordered execution of host
functions on CPU <code>DeviceContext</code> instances. <code>enqueue_cpu_function</code>
enqueues a single host function; <code>enqueue_cpu_range</code> enqueues a parallel
range whose tasks run concurrently but are stream-ordered relative to
surrounding work. Argument passing is not yet supported.</li>
<li class=""><code>parallelize</code>, <code>parallelize_over_rows</code> (in
<code>std.algorithm.backend.cpu.parallelize</code>), and the <code>elementwise</code>
overloads in <code>std.algorithm.functional</code> now accept an optional trailing
<code>ctx: Optional[DeviceContext] = None</code>. When supplied, the provided CPU
<code>DeviceContext</code> is forwarded to <code>sync_parallelize</code>; when omitted, the
previous behavior is preserved.</li>
<li class="">Added a <code>parallelism_level()</code> overload that takes a CPU <code>DeviceContext</code>
and returns the thread-pool size for that specific context, enabling
NUMA-specific introspection.</li>
</ul>
</li>
<li class="">
<p><strong>Readable GPU kernel names in profilers.</strong> GPU kernels in the standard
library and across MAX kernels (elementwise, GEMV, multistage matmul,
attention, convolution, MoE, normalization, quantization, BMM, grouped
matmul, SM100 matmul, AMD matmul, communication, and sampling) now expose
human-readable names in profiler traces such as Nsight Systems, replacing
previously mangled KGEN symbols.</p>
</li>
<li class="">
<p><strong><code>tile_io</code> module for <code>TileTensor</code> data movement.</strong> Added a <code>tile_io</code>
module providing <code>TileTensor</code> copier traits and copy utilities for moving
data between memory hierarchies (DRAM/SRAM). The module includes:</p>
<ul>
<li class=""><code>GenericToSharedAsyncTileCopier</code>, which moves a <code>TileTensor</code> from
generic memory into shared memory via NVIDIA's <code>cp.async</code>. On AMD and
Apple GPUs the underlying <code>async_copy</code> falls back to synchronous
loads/stores.</li>
<li class="">An optional <code>swizzle: Swizzle</code> parameter on
<code>GenericToSharedAsyncTileCopier</code>, mirroring the swizzled write path in
<code>LocalToSharedTileCopier</code>.</li>
<li class="">A <code>masked: Bool = False</code> parameter on
<code>GenericToSharedAsyncTileCopier</code>. When enabled, out-of-bounds vectors
receive a zero-byte copy with zero-fill, matching
<code>LayoutTensor.copy_from_async[is_masked=True, fill=Fill.ZERO]</code>.</li>
<li class="">An <code>AsyncTileCopier</code> trait abstracting copier conformance.</li>
</ul>
</li>
<li class="">
<p><strong>TMA <code>gather4</code> for sparse 2D tensor loads.</strong> Added a TMA <code>gather4</code>
operation on SM100 (Blackwell) for loading 4 non-contiguous rows from a 2D
tensor in a single TMA instruction, surfaced as the
<code>cp_async_bulk_tensor_2d_gather4</code> intrinsic in <code>std.gpu.memory</code> and
integrated with <code>TMATensorTile</code>. The API supports:</p>
<ul>
<li class="">Full 2D tile sparse loads with arbitrary <code>tile_height</code> (multiple of 4)
and <code>tile_width</code>, replacing the prior 4-row-per-call limit.</li>
<li class="">Arbitrary <code>row_width</code> — previously restricted to the swizzle box width.
The API automatically computes the box width from the swizzle constraint
and supports non-divisible widths via TMA hardware zero-fill on the last
column group, so kernels no longer need to hand-code column-group loops.</li>
</ul>
</li>
<li class="">
<p><strong>1D TMA instructions for SM90+ NVIDIA GPUs.</strong> Added 1D TMA (Tensor Memory
Accelerator) instruction support in <code>std.gpu.memory</code>. 1D TMA copies do not
require a pre-allocated tensormap object on the host, providing greater
flexibility than the existing 2D–5D TMA path. New functions:
<code>cp_async_bulk_shared_cluster_global</code>, <code>cp_async_bulk_global_shared_cta</code>,
<code>cp_async_bulk_prefetch</code>, and <code>cp_async_bulk_reduce_global_shared_cta</code>
(the 1D counterpart to <code>cp_async_bulk_tensor_reduce_global_shared_cta</code>,
which reduces floating-point values from shared memory into global memory;
ADD only).</p>
</li>
<li class="">
<p><strong><code>TileTensor</code> API extensions.</strong></p>
<ul>
<li class="">Added <code>TileTensor.bitcast[target_dtype]()</code>, which returns a new
<code>TileTensor</code> viewing the same storage and layout under a different
element dtype, replacing the
<code>TileTensor(x.ptr.bitcast[Scalar[T]](), x.layout)</code> idiom.</li>
<li class="">Added <code>TileTensor.flat_load</code> and <code>TileTensor.flat_store</code> as raw-flat
accessors that read and write the underlying storage at a linear offset,
bypassing the tensor's layout.</li>
<li class="">Added a <code>TileTensor.tile()</code> overload that takes the tile shape as a
runtime/parameter argument, complementing the existing tile APIs.</li>
<li class="">GPU <code>TileTensor.load()</code> and <code>load_linear()</code> now default <code>invariant=True</code>
for immutable tensors, enabling the compiler to use <code>ldg</code> for read-only
memory accesses.</li>
<li class="">Added compile-time bounds checks to <code>TileTensor</code>, <code>ManagedTensorSlice</code>,
and <code>crd2idx</code> to catch out-of-range coordinate accesses at compile time.</li>
</ul>
</li>
<li class="">
<p><strong>Layout library extensions.</strong></p>
<ul>
<li class="">Added a compile-time <code>coalesce</code> function for <code>TensorLayout</code>, mirroring
the legacy <code>Layout.coalesce</code> algorithm (skip shape-1 dims and merge
contiguous dims).</li>
<li class="">Added <code>write_repr_to</code> to <code>Layout</code> for writing a debug representation to
a <code>Writer</code>.</li>
<li class=""><code>vectorize</code> and <code>distribute</code> now accept layouts with runtime dimensions.</li>
<li class=""><code>row_major</code> now accepts coord-like arguments directly, no longer
requiring them to be wrapped in tuples.</li>
<li class="">Introduced weakly compatible layouts, enabling structural compatibility
comparisons between layouts and coordinate indices (up to depth 4).
Structural equality is now checked via a <code>comptime assert</code> rather than a
<code>where</code> clause.</li>
<li class="">Changed <code>CoordLike.value()</code> to return <code>Scalar[Self.DTYPE]</code> instead of
<code>Int</code>, providing a more expressive return type for layout coordinate
values.</li>
<li class=""><code>Coord</code>, <code>RowMajorLayout</code>, and <code>ColMajorLayout</code> once again take their
parameters as variadic arguments, improving ergonomics when specifying
individual coords. Use <code>*splat</code> to pass an existing list.</li>
</ul>
</li>
<li class="">
<p>Several standard library APIs that previously took legacy closures now
have unified-closure overloads: <code>parallelize</code> and <code>parallelize_over_rows</code>
(in <code>std.algorithm.backend.cpu.parallelize</code>), <code>bench.bencher</code>,
<code>DeviceContext.execution_time</code>, and <code>DeviceContext.enqueue_function</code> (the
GPU enqueue path, renamed from the previous <code>enqueue_closure</code>).</p>
</li>
<li class="">
<p><strong>GPU device APIs.</strong></p>
<ul>
<li class="">Added support for NVIDIA B300 (sm_103a) accelerators. New helpers in
<code>std.sys.info</code> and <code>std.gpu.host.info</code> recognize B300 targets so kernels
can dispatch correctly on the Blackwell B300 architecture.</li>
<li class="">Added <code>DeviceStream.enqueue_host_func(func, user_data)</code> exposing the
<code>cuLaunchHostFunc</code> primitive for Mojo kernels and custom ops. Takes a
<code>thin def(OpaquePointer[MutAnyOrigin]) -&gt; None</code> callback and an opaque
<code>user_data</code> pointer. CUDA-only today; non-CUDA backends raise.</li>
<li class=""><code>DeviceContext</code> initialization now runs an automatic GPU health check
that detects hardware throttling, uncorrectable ECC errors, and zombie
VRAM, and fails device creation with an actionable error message on
unhealthy GPUs. Added <code>DeviceContext.run_healthcheck()</code> to re-invoke the
check explicitly. Set <code>MODULAR_DEVICE_CONTEXT_DISABLE_HEALTHCHECK=true</code>
to disable.</li>
<li class="">Optimized GPU <code>elementwise</code> index computation and dispatch with a
<code>use_32bit</code> fast path, 4× unrolled grid-stride processing, warp-aligned
block sizes, and SM100+ single-tile routing.</li>
</ul>
</li>
<li class="">
<p><strong>AMD GPU intrinsics.</strong></p>
<ul>
<li class="">Added the <code>ds_read_tr8_b64</code> AMD GPU intrinsic in <code>std.gpu.intrinsics</code>,
performing a 64-bit LDS transpose load of 8-bit elements via
<code>llvm.amdgcn.ds.read.tr8.b64</code>. Supported on AMD CDNA4+ GPUs.</li>
<li class="">Added a <code>Scalar[dtype]</code> overload of <code>readfirstlane</code> so callers no longer
need bitcast workarounds to broadcast non-<code>Int32</code> scalar values across
an AMD GPU wavefront.</li>
<li class=""><code>AMDBufferResource.load_to_lds</code> in <code>std.gpu.intrinsics</code> now lowers to
the <code>.ptr.</code> form of the AMDGPU buffer-load-to-LDS intrinsic, fixing a
strided-layout regression on MLA layouts where <code>cache_depth != depth</code>
and <code>head_dim_offset != 0</code>. A new <code>async_copies: Bool = False</code> parameter
opts in to attaching the <code>amdgpu.AsyncCopies</code> alias scope on the load,
enabling LLVM <code>vmcnt</code> relaxation.</li>
<li class="">Added a <code>broadcast=True</code> parameter to GPU <code>warp_id()</code> (and related id
accessors) so callers can avoid manual <code>warp.broadcast(warp_id())</code>
patterns.</li>
</ul>
</li>
<li class="">
<p><strong>Math, debug, and stdlib APIs.</strong></p>
<ul>
<li class=""><code>align_down</code> and <code>align_up</code> now accept generic <code>SIMD[dtype, width]</code>
integer values, replacing the previous <code>UInt</code>-only overloads.</li>
<li class="">Extended <code>FastDiv</code> and <code>mulhi</code> to support 64-bit integer types, with
NVIDIA-specific <code>llvm.nvvm.mulhi.ull/ll</code> intrinsics and 128-bit
arithmetic on other targets.</li>
<li class="">Added <code>check_bounds</code> for collections that asserts on out-of-range
indices and reports the user's call site instead of stdlib source.</li>
<li class=""><code>debug_assert</code> now accepts a <code>call_location</code> parameter, allowing callers
to override the reported <code>SourceLocation</code> so assertion errors can point
to user code rather than stdlib internals.</li>
<li class="">Swapped the ordering arguments of <code>Atomic.compare_exchange</code> so
<code>success_ordering</code> is listed before <code>failure_ordering</code>, matching the
convention used by C++, Rust, and other languages.</li>
<li class=""><code>InlineArray</code>'s storage constructor now uses
<code>debug_assert[assert_mode="safe"]</code> for the element-count check, so size
mismatches are caught by default instead of only with <code>-D ASSERT=all</code>.</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/#tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The Mojo debugger now shows a <code>Variant</code> variable's active type name and
value in LLDB — e.g. <code>Int(42)</code> or <code>String("hello")</code> — instead of exposing
raw <code>_DefaultVariantStorage</code> internals.</p>
</li>
<li class="">
<p>The Mojo debugger now displays scalar types (e.g. <code>UInt8</code>, <code>Float32</code>) as
plain values instead of <code>([0] = value)</code>, and elides internal <code>_mlir_value</code>
wrapper fields from struct display.</p>
</li>
<li class="">
<p><code>mojo format</code> no longer supports the deprecated <code>fn</code> keyword, nor the
removed <code>owned</code> argument convention.</p>
</li>
<li class="">
<p>Comptime function calls now print more nicely in error messages and generated
documentation, not including <code>VariadicList</code>/<code>VariadicPack</code> and including
keyword argument labels when required.</p>
</li>
<li class="">
<p><strong>LSP and REPL responsiveness.</strong></p>
<ul>
<li class="">Code completion and signature help in REPL/notebook contexts are now
amortized O(1) per request by caching parsed prior cells across
requests, eliminating quadratic O(N²) slowdown in long sessions.</li>
<li class="">LSP parse time for files with docstring code blocks (e.g. <code>dict.mojo</code>)
is roughly 2× faster, using signature-only resolution for transitive
dependencies inside docstring code blocks.</li>
<li class="">LSP parse time is further reduced by deferring body resolution of
imported bytecode declarations and resolving named imports lazily,
avoiding eager pulls of large transitive dependencies.</li>
</ul>
</li>
<li class="">
<p><strong><code>mojo</code> CLI and toolchain.</strong></p>
<ul>
<li class=""><code>mojo --version</code> now prints a semantic Mojo version (for example,
<code>1.0.0...</code>) instead of an internal build identifier, and the same
version is used wherever the compiler performs version checks.</li>
<li class=""><code>mojo build --print-supported-targets</code> now lists registered targets
sorted alphabetically, with a graceful empty-list message.</li>
<li class="">The compiler now selects the target's baseline CPU when cross-compiling
with <code>--target-triple</code> without <code>--target-cpu</code> and the host and target
architectures differ.</li>
<li class="">ASAN-instrumented Mojo binaries on macOS now use <code>llvm-symbolizer</code>
instead of <code>atos</code>, so stack traces report the full inlined call chain
through user functions.</li>
</ul>
</li>
<li class="">
<p><strong><code>mojo doc</code> and docstring validation.</strong></p>
<ul>
<li class=""><code>mojo doc</code> now preserves parameterized type names (for example
<code>List[K]</code>, <code>Optional[V]</code>, <code>UnsafePointer[Scalar[dtype]]</code>) in the API doc
JSON <code>"type"</code> fields, instead of emitting only the bare base name.</li>
<li class=""><code>mojo doc</code> now emits a diagnostic when a public Mojo module has no
module-level docstring and <code>-mojo-diagnose-missing-doc-strings</code> is
active. Private modules and modules nested inside private packages are
exempt.</li>
<li class="">Docstring validation no longer requires inferred parameters (those
before <code>//</code> in a parameter list) to be documented; documenting them
remains valid.</li>
<li class="">Docstring validation now accepts <code>!</code> and <code>?</code> as valid sentence-ending
punctuation for summaries, section bodies, and argument descriptions.</li>
<li class=""><code>def ... raises</code> functions now require a <code>Raises:</code> docstring section
like any other raising function, and the <code>isDef</code> field has been removed
from <code>mojo doc</code> JSON output.</li>
</ul>
</li>
<li class="">
<p><strong>Debugger UX.</strong></p>
<ul>
<li class="">The Mojo debugger now displays <code>Optional[T]</code> variables as <code>None</code> or
<code>Some(value)</code> in LLDB instead of exposing raw <code>_DefaultVariantStorage</code>
internals.</li>
<li class="">The Mojo debugger now correctly displays <code>UnsafePointer[T]</code> values in
LLDB for all pointed-to types, including signed integers (no longer
rendered as huge unsigned values), <code>Bool</code> (<code>True</code>/<code>False</code>), and floats.</li>
<li class="">The Mojo debugger now displays <code>StringSlice</code>, <code>StaticString</code>, and their
underlying <code>Span[Byte]</code> values as quoted strings in LLDB.</li>
<li class="">At <code>-O0</code>, trivially destructible types (<code>Int</code>, <code>Float</code>, <code>Bool</code>, <code>SIMD</code>,
etc.) now remain visible in the debugger through the end of their
lexical scope instead of disappearing at the ASAP destruction point.</li>
</ul>
</li>
<li class="">
<p><code>mojo format</code> (<code>mblack</code>) now correctly parses the new unified-closure
syntax including <code>raises {captures}</code> effect ordering, and no longer
inserts a spurious space between <code>^</code> and the operand in <code>var^</code> captures.</p>
</li>
<li class="">
<p>Mojo package files (<code>.mojopkg</code>) now use format version 2 with
zstd-compressed MLIR bytecode, significantly reducing package, wheel, and
Docker image sizes.</p>
</li>
<li class="">
<p>Added a <code>--mojo-version</code> flag to <code>mojo-lsp-server</code> for verifying the Mojo
version that the LSP is using.</p>
</li>
<li class="">
<p>Removed the legacy <code>MOJO_ENABLE_STACK_TRACE_ON_ERROR</code> and
<code>MOJO_ENABLE_STACK_TRACE_ON_CRASH</code> environment variables. Instead, set the
<code>MODULAR_DEBUG</code> environment variable to <code>stack_trace_on_error</code> to enable
generation of stack traces when a Mojo program raises an error.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gpu-programming">GPU programming<a href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/#gpu-programming" class="hash-link" aria-label="Direct link to GPU programming" title="Direct link to GPU programming" translate="no">​</a></h2>
<ul>
<li class="">Added support for AMD MI250X accelerators.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/#-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p>The <code>escaping</code> function effect is no longer supported. Migrate
<code>def(...) escaping -&gt; T</code> closures to use an explicit capture list <code>{...}</code> (see
the
<a href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/#language-enhancements" class="">closure refactor entry under Language enhancements</a>).</p>
</li>
<li class="">
<p>The deprecated <code>@doc_private</code> decorator has been removed. Use <code>@doc_hidden</code>
instead.</p>
</li>
<li class="">
<p>Removed the <code>store_release</code>, <code>store_relaxed</code>, <code>load_acquire</code>, and
<code>load_relaxed</code> helpers from <code>std.gpu.intrinsics</code>. Use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/atomic/atomic/Atomic/#store"><code>Atomic[dtype, scope=...].store</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/atomic/atomic/Atomic/#load"><code>Atomic[dtype, scope=...].load</code></a> with
the desired <a class="" href="https://mojolang.static.modular-staging.com/docs/std/atomic/atomic/Ordering/"><code>Ordering</code></a> instead:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Before</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> std</span><span class="token punctuation">.</span><span class="token plain">gpu</span><span class="token punctuation">.</span><span class="token plain">intrinsics </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> store_release</span><span class="token punctuation">,</span><span class="token plain"> load_acquire</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">store_release</span><span class="token punctuation">[</span><span class="token plain">scope</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Scope</span><span class="token punctuation">.</span><span class="token plain">GPU</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> v </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> load_acquire</span><span class="token punctuation">[</span><span class="token plain">scope</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Scope</span><span class="token punctuation">.</span><span class="token plain">GPU</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> std</span><span class="token punctuation">.</span><span class="token plain">atomic </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Atomic</span><span class="token punctuation">,</span><span class="token plain"> Ordering</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Atomic</span><span class="token punctuation">[</span><span class="token plain">dtype</span><span class="token punctuation">,</span><span class="token plain"> scope</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"device"</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">store</span><span class="token punctuation">[</span><span class="token plain">ordering</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Ordering</span><span class="token punctuation">.</span><span class="token plain">RELEASE</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> v </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Atomic</span><span class="token punctuation">[</span><span class="token plain">dtype</span><span class="token punctuation">,</span><span class="token plain"> scope</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"device"</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">load</span><span class="token punctuation">[</span><span class="token plain">ordering</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Ordering</span><span class="token punctuation">.</span><span class="token plain">ACQUIRE</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Several constructs deprecated in 26.2 are no longer accepted:</p>
<ul>
<li class="">The <code>@register_passable</code> and <code>@register_passable("trivial")</code> decorators
are no longer supported. Conform to the <code>RegisterPassable</code> and
<code>TrivialRegisterPassable</code> traits instead. Use of either decorator now
produces a hard error pointing to the trait equivalent.</li>
<li class="">The legacy <code>__moveinit__</code> and <code>__copyinit__</code> method names are no longer
auto-rewritten to the unified <code>__init__</code> form. Rename these methods to
<code>__init__</code> with keyword-only <code>take: Self</code> and <code>copy: Self</code> arguments,
respectively, as introduced by
<a class="" href="https://mojolang.static.modular-staging.com/mojo/releases/v0.26.2/#0-26-2-init-unification">init unification</a> in 26.2.
Existing legacy spellings now fail to compile with errors such as
<code>no matching function in initialization</code> rather than being silently
rewritten.</li>
</ul>
</li>
<li class="">
<p>API removals beyond the deprecation removals already noted:</p>
<ul>
<li class="">Removed the <code>param_env.mojo</code> module. Use <code>defines.mojo</code> instead.</li>
<li class="">Removed <code>LinkedList.__getitem__</code>. Indexing a <code>LinkedList</code> is O(n), and
exposing <code>__getitem__</code> encouraged accidentally quadratic code; iterate
the list instead.</li>
<li class="">Removed the unused <code>UIntSized</code> trait and its prelude re-export.</li>
<li class="">Removed the <code>pdl_level</code> parameter from <code>elementwise</code>, <code>reduction</code>, and
<code>reducescatter</code> kernel APIs. PDL usage is now an internal compile-time
default.</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v1.0.0b1/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p>Fixed <code>math.sqrt</code> on <code>Float64</code> on NVIDIA GPU producing a cryptic
<code>could not find LLVM intrinsic: "llvm.nvvm.sqrt.approx.d"</code> failure at LLVM
IR translation time. <code>math.sqrt</code> now rejects <code>Float64</code> on NVIDIA GPU at
compile time with the message <code>DType.float64 isn't supported for approx sqrt on NVIDIA GPU</code>. The existing <code>math.sin</code> and <code>math.cos</code> constraint
messages were also sharpened to name the op (<code>DType.float64 isn't supported for sin/cos on NVIDIA GPU</code>).
(<a href="https://github.com/modular/modular/issues/6434" target="_blank" rel="noopener noreferrer" class="">Issue #6434</a>)</p>
</li>
<li class="">
<p>Fixed pack inference failing with <code>could not infer type of parameter pack ... given value with unresolved type</code> when passing list, dict, set, or slice
literals to a <code>*Ts</code>-bound variadic pack parameter (e.g.
<code>def foo[*Ts: Iterable](*args: *Ts)</code>). Pack inference now applies the same
default-type fallback that single-argument trait-bound parameters already
use, so <code>foo([1, 2, 3], [4, 5, 6])</code> resolves each literal to its default
type (e.g. <code>List[Int]</code>) before binding the pack.</p>
</li>
<li class="">
<p>Fixed <code>mojo</code> aborting at startup with <code>std::filesystem::filesystem_error</code>
when <code>$HOME</code> is not traversable by the running UID (common in containerized
CI where the image's build-time UID differs from the runtime UID). The
config search now treats permission errors as "not found" and falls through
to the next candidate.
(<a href="https://github.com/modular/modular/issues/6412" target="_blank" rel="noopener noreferrer" class="">Issue #6412</a>)</p>
</li>
<li class="">
<p><code>mojo run</code> and <code>mojo debug</code> now honor <code>-Xlinker</code> flags by loading the
referenced shared libraries into the in-process JIT. Previously the flags
were dropped (with a <code>-Xlinker argument unused</code> warning), leaving programs
that called into external shared libraries via <code>external_call</code> unable to
resolve those symbols at runtime (so <code>mojo build</code> worked but <code>mojo run</code> did
not). The supported forms mirror what the system linker accepts: <code>-Xlinker -L&lt;dir&gt;</code>, <code>-Xlinker -l&lt;name&gt;</code>, <code>-Xlinker -rpath &lt;dir&gt;</code>, and <code>-Xlinker &lt;absolute-path-to-shared-library&gt;</code>. Flags that have no meaning under JIT
are reported as a warning and ignored.
(<a href="https://github.com/modular/modular/issues/6155" target="_blank" rel="noopener noreferrer" class="">Issue #6155</a>)</p>
</li>
<li class="">
<p>Fixed <code>libpython</code> auto-discovery failing for Python 3.14 free-threaded builds.
The discovery script constructed the library filename without the ABI flags
suffix (e.g. looked for <code>libpython3.14.dylib</code> instead of
<code>libpython3.14t.dylib</code>).
(<a href="https://github.com/modular/modular/issues/6366" target="_blank" rel="noopener noreferrer" class="">Issue #6366</a>)</p>
</li>
<li class="">
<p>Fixed <code>RTLD.LOCAL</code> having the wrong value on Linux. It was set to <code>4</code>
(<code>RTLD_NOLOAD</code>) instead of <code>0</code>, causing <code>dlopen</code> with <code>RTLD.NOW | RTLD.LOCAL</code>
to fail. (<a href="https://github.com/modular/modular/issues/6410" target="_blank" rel="noopener noreferrer" class="">Issue #6410</a>)</p>
</li>
<li class="">
<p>Fixed <code>mojo format</code> crashing after upgrading Mojo versions due to a stale
grammar cache. (<a href="https://github.com/modular/modular/issues/6144" target="_blank" rel="noopener noreferrer" class="">Issue #6144</a>)</p>
</li>
<li class="">
<p>Fixed <code>atof</code> producing incorrect results for floats near the
normal/subnormal boundary (e.g., <code>Float64("4.4501363245856945e-308")</code>
returned half the correct value).
(<a href="https://github.com/modular/modular/issues/6196" target="_blank" rel="noopener noreferrer" class="">#6196</a>)</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5872" target="_blank" rel="noopener noreferrer" class="">Issue #5872</a>: Fixed a
compiler crash ("'get_type_name' requires a concrete type") when using
default <code>Writable</code>, <code>Equatable</code>, or <code>Hashable</code> implementations on structs
with MLIR-type fields (e.g. <code>__mlir_type.index</code>). The compiler now correctly
reports that the field does not implement the required trait.</p>
</li>
<li class="">
<p>Fixed <code>Atomic.store</code> silently dropping the requested <code>scope</code>. The previous
implementation lowered to <code>atomicrmw xchg</code> without forwarding <code>syncscope</code>,
so <code>Atomic[..., scope="device"].store(...)</code> was emitting a system-scope
store on NVPTX (extra L2/NVLink fences) and an over-synchronized store on
AMDGPU. <code>Atomic.store</code> now lowers via <code>pop.store atomic syncscope(...)</code>,
emitting <code>st.release.&lt;scope&gt;</code> on NVPTX and a properly-scoped LLVM atomic
store on AMDGPU. The Mojo API surface is unchanged.</p>
</li>
<li class="">
<p>Fixed <code>Process.run()</code> not inheriting the parent's environment variables.
Child processes spawned via <code>Process.run()</code> now correctly receive the
parent's environment.</p>
</li>
<li class="">
<p>Fixed <code>\xhh</code> and <code>\ooo</code> escape sequences in string literals being
interpreted as raw bytes instead of Unicode code points, which produced
malformed UTF-8 for values <code>&gt;= 0x80</code>. The escapes now match Python <code>str</code>
semantics (and the existing <code>\u</code>/<code>\U</code> handling): <code>"\x85"</code> encodes U+0085
(NEL) as two UTF-8 bytes and <code>ord("\x85")</code> returns <code>133</code> instead of <code>5</code>.
Code that relied on <code>\xhh</code> to emit a single raw byte for non-ASCII values
must construct the bytes explicitly (for example via a <code>List[Byte]</code>
literal).
(<a href="https://github.com/modular/modular/issues/2842" target="_blank" rel="noopener noreferrer" class="">Issue #2842</a>)</p>
</li>
<li class="">
<p>Fixed incorrect data layout for <code>MI250X</code> AMDGPU architectures.
(<a href="https://github.com/modular/modular/issues/6451" target="_blank" rel="noopener noreferrer" class="">Issue #6451</a></p>
</li>
<li class="">
<p>Fixed Apple Silicon target detection on macOS 26 producing unrecognized
arch strings like <code>metal:2-metal4</code> when the installed Xcode could not
compile Metal 4.0; the <code>-metal4</code> suffix is now applied only when the
toolchain supports it.</p>
</li>
<li class="">
<p>Fixed <code>UnsafePointer.gather</code>, <code>UnsafePointer.scatter</code>, and <code>strided_load</code>
silently reading zero on Apple GPU. The per-lane fallback reconstructed
pointers via <code>unsafe_from_address=Int(addr)</code>, yielding a generic-address-space
pointer the Apple AIR backend could not resolve. The fallback now uses typed
pointer arithmetic on Apple GPU; NVIDIA, AMD, and CPU paths are unchanged.</p>
</li>
<li class="">
<p>Fixed <code>rotate_left</code> and <code>rotate_right</code> intrinsics failing to lower on
Apple GPU. Both now lower correctly to the Apple AIR backend.</p>
</li>
<li class="">
<p>Fixed <code>TileTensor.write_to()</code> only handling 2D static-shape tensors; 1D,
3D+, nested-layout, and dynamic-shape tensors now print correctly via a
generic elementwise fallback, and all ranks use a bracket-delimited,
comma-separated format.</p>
</li>
<li class="">
<p>Fixed incorrect alignment in <code>TileTensor.__getitem__</code>.</p>
</li>
<li class="">
<p>Fixed <code>TileTensor</code> SIMD loads/stores on CPU to use <code>alignment=1</code>,
preventing segfaults when underlying data is not naturally aligned. GPU
still uses aligned access where the layout guarantees alignment.</p>
</li>
<li class="">
<p>Fixed <code>complement()</code> in <code>tile_layout</code> returning a static shape of <code>0</code>
when given <code>UNKNOWN_VALUE</code> as the size; it now propagates <code>UNKNOWN_VALUE</code>
so downstream layout algebra falls back to runtime dimensions, restoring
correct bounds checks for <code>LayoutTensor.flatten().vectorize[N]()</code>.</p>
</li>
<li class="">
<p>Fixed <code>idx2crd</code> returning incorrect coordinates for nested layouts.</p>
</li>
<li class="">
<p>Fixed <code>mojo --version</code> printing the MAX version instead of the Mojo
compiler version.</p>
</li>
<li class="">
<p>Fixed <code>comptime</code> <code>and</code>/<code>or</code> expressions to accept any <code>Boolable</code> operands,
matching runtime behavior. This also enables mixed-type expressions like
<code>comptime if some_Bool and some_Optional</code>.</p>
</li>
<li class="">
<p>Fixed several codegen correctness issues affecting valid Mojo programs:
an SRoA miscompile that incorrectly promoted arrays accessed via dynamic
offsets through a constant GEP; a use-after-free where destructors of
live owned values were inserted before, rather than after, a
<code>lit.ref.store</code> into a ref with <code>#lit.any.origin</code>; silent memory
corruption when calling <code>abi("C")</code> functions that returned structs via
<code>sret</code>; and bogus <code>existing function with conflicting attributes</code> errors
when calling the same external function more than once with an
<code>sret</code>/<code>byval</code> ABI.</p>
</li>
<li class="">
<p>Fixed several <code>mojo-lsp-server</code> crashes affecting REPL/notebook contexts,
parameter-pack-related diagnostics, files importing from <code>.mojopkg</code>, and
files using stateless closures. The LSP also no longer mistakes REPL
buffer identifiers (which contain a <code>.mojo</code> extension) for relative
module imports.</p>
</li>
<li class="">
<p>Fixed several debugger display issues: variables after their ASAP
destruction point at <code>-O0</code> now correctly show "not available" instead of
stale values; unsigned integers (<code>UInt</code>, <code>UInt8</code>, etc.) display with
correct unsigned semantics; <code>ref</code> loop variables show <code>index</code> instead of
<code>pointer&lt;index&gt;</code>; <code>String</code> fields typed as <code>Scalar[T]</code> and <code>Tuple</code> values
display correctly.</p>
</li>
<li class="">
<p>Fixed two <code>mojo format</code> (<code>mblack</code>) issues: it no longer loses the <code>t</code>
prefix when splitting long t-string literals across lines, and no longer
inserts a stray space between <code>*</code> and a complex operand in variadic pack
unpacking annotations.</p>
</li>
<li class="">
<p>Fixed <code>BitSet.set_all</code> and <code>BitSet.toggle_all</code> writing <code>~0</code> to every
underlying 64-bit word, including bits beyond the logical <code>size</code> when
<code>size</code> was not a multiple of 64. Those stray high bits were counted by
<code>__len__</code>, producing incorrect population counts; the methods now mask
off the unused high bits.</p>
</li>
<li class="">
<p>Fixed <code>syncwarp</code> on AMD GPUs, which was previously implemented as a
no-op. It now lowers to <code>llvm.amdgcn.wave.barrier</code>, providing the
control-flow synchronization required to correctly sequence shared-memory
writes followed by reads across lanes.</p>
</li>
<li class="">
<p>Fixed <code>isnan</code>, <code>isinf</code>, and <code>isfinite</code> failing during LLVM lowering for
<code>float8_e3m4</code> and <code>float4_e2m1fn</code>. <code>float4_e2m1fn</code> (no NaN/Inf encodings)
folds to constant branches; <code>float8_e3m4</code> casts through <code>bfloat16</code> to
reuse the existing <code>llvm.is.fpclass</code> path.</p>
</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo nightly]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/nightly/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/nightly/"/>
        <updated>2026-05-01T00:22:36.000Z</updated>
        <summary type="html"><![CDATA[This version is still a work in progress.]]></summary>
        <content type="html"><![CDATA[<p>This version is still a work in progress.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation">Documentation<a href="https://mojolang.static.modular-staging.com/releases/nightly/#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">
<p>Compilation targets docs instructs how to inspect your current platform,
select a target configuration, and generate code for that target. Use it to
build for your own system or target other CPUs, operating systems, and
accelerators.</p>
</li>
<li class="">
<p>Mojo language reference covers lexical elements, expressions, statements,
numeric types, struct declarations, trait declarations.</p>
</li>
<li class="">
<p>Functions reference page improves discoverability of new function features.</p>
</li>
<li class="">
<p>Split operators manual into separate pages; refreshed coverage and added
tutorial, operator tests, and new reference page.</p>
</li>
<li class="">
<p>Negative examples and errors added to reference pages highlight sharp
edges of the language.</p>
</li>
<li class="">
<p>MLIR reference page introduces inline MLIR to developers in Mojo code.</p>
</li>
<li class="">
<p>Adds docs for non-nullable pointers and provides sample code showing
how to use <code>Optional</code> with <code>UnsafePointer</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="language-enhancements">Language enhancements<a href="https://mojolang.static.modular-staging.com/releases/nightly/#language-enhancements" class="hash-link" aria-label="Direct link to Language enhancements" title="Direct link to Language enhancements" translate="no">​</a></h2>
<ul>
<li class="">
<p>Added type refinement based on compile time assumptions, enabling Mojo to
narrow types from <code>where</code> clauses, <code>comptime if</code> statements, and
<code>comptime assert</code> statements. Refinements in a scope are driven by
<code>conforms_to()</code> expressions.</p>
<p>Before:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__contains__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">.</span><span class="token plain">T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Bool where conforms_to</span><span class="token punctuation">(</span><span class="token plain">Self</span><span class="token punctuation">.</span><span class="token plain">T</span><span class="token punctuation">,</span><span class="token plain"> Equatable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> item </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> trait_downcast</span><span class="token punctuation">[</span><span class="token plain">Equatable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">item</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> trait_downcast</span><span class="token punctuation">[</span><span class="token plain">Equatable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">value</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">True</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">False</span><br></div></code></pre></div></div>
<p>After:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__contains__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">.</span><span class="token plain">T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Bool where conforms_to</span><span class="token punctuation">(</span><span class="token plain">Self</span><span class="token punctuation">.</span><span class="token plain">T</span><span class="token punctuation">,</span><span class="token plain"> Equatable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> item </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> item </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">True</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">False</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Improved diagnostics for onboarding-priority parser errors in Mojo
for clarity and UX.</p>
</li>
<li class="">
<p>Migrated monorepo from <code>fn</code> to using <code>def</code> for function declaration.
Warned on use of <code>fn</code> and will deprecate <code>fn</code> in the next release.</p>
</li>
<li class="">
<p>Updated signature error diagnostics and added related tests.</p>
</li>
<li class="">
<p>Mojo now uses <code>NoneType</code> instead of an empty tuple to mark constructor
using literals.</p>
</li>
<li class="">
<p>The ternary <code>if/else</code> expression now coerces each element to its contextual
type when it is obvious. For example, this works instead of producing an
error about incompatible metatypes:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> some_type</span><span class="token punctuation">:</span><span class="token plain"> Movable </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Int </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> cond </span><span class="token keyword" style="color:#af2528">else</span><span class="token plain"> String</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Unified closures now accept default capturing conventions when there are
explicit captures already.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">captures_with_default_convention</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token punctuation">,</span><span class="token plain"> d </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"a"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"b"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"c"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"d"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">my_fn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> unified </span><span class="token punctuation">{</span><span class="token keyword" style="color:#af2528">mut</span><span class="token plain"> a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token operator" style="color:#a89984">^</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">read</span><span class="token punctuation">}</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># capture:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># `a` by mut reference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># `b` by immut reference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># `c` by moving</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># `d` by immut reference (the default 'read' convention)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    use</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token punctuation">,</span><span class="token plain"> d</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added <code>abi("C")</code> as a function effect for declaring C calling convention on
function definitions and function pointer types. Functions marked with
<code>abi("C")</code> use the platform C ABI (System V x86-64 / ARM64 AAPCS) for
struct arguments and return values, enabling safe interop with C libraries:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># C-ABI function definition (safe as a callback into C code)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">add</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Int32</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int32</span><span class="token punctuation">)</span><span class="token plain"> abi</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"C"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int32</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> a </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> b</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># C-ABI function pointer type (safe for use with DLHandle.get_function)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> f </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> handle</span><span class="token punctuation">.</span><span class="token plain">get_function</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">def</span><span class="token punctuation">(</span><span class="token plain">Float64</span><span class="token punctuation">)</span><span class="token plain"> abi</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"C"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Float64</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"sqrt"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p><code>DLHandle.get_function[]</code> now enforces that the type parameter carries
<code>abi("C")</code>, preventing silent ABI mismatches when loading C symbols.</p>
</li>
<li class="">
<p>String literals now support <code>\uXXXX</code> and <code>\UXXXXXXXX</code> unicode escape
sequences, matching Python. The resulting code point is stored as UTF-8.
Invalid code points and surrogates are rejected at parse time.</p>
</li>
<li class="">
<p>Added support for conditional <code>RegisterPassable</code> conformance.</p>
</li>
<li class="">
<p>Variadic lists and packs can be forwarded through runtime calls with <code>*pack</code>
when the callee takes a compatible variadic list/pack.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> callee</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">:</span><span class="token plain"> Writable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token plain">args</span><span class="token punctuation">.</span><span class="token plain">__len__</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">args</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> forwarder</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">:</span><span class="token plain"> Writable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    callee</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">forwarder</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hello"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3.14</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints each value on a separate line</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Heterogenous variadic packs can now be specified with a <code>SomeType</code> helper
function. These two are equivalent:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">arg_types</span><span class="token punctuation">:</span><span class="token plain"> Copyable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">arg_types</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">SomeTypeList</span><span class="token punctuation">[</span><span class="token plain">Copyable</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>T-strings can now be used in <code>comptime assert</code> messages:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">assert</span><span class="token plain"> i </span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> t</span><span class="token string" style="color:#477a5b">"expected i &gt; 5, got {i}"</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/nightly/#language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Variadic parameters lists are now passed instead of <code>ParameterList</code> and
<code>TypeList</code> instead of <code>!kgen.param_list</code>. This makes it much more ergonomic to
work with these types, e.g. simple logic just works:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> callee</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">values</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> v </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">values</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        v </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> values</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> elt </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> values</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        v </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> elt</span><br></div></code></pre></div></div>
<p>Similarly, the <code>ParameterList</code>/<code>TypeList</code> structs have other methods for
transforming the value list. As such, a variety of values from the <code>Variadic</code>
struct have started moving over to being members of these types.</p>
</li>
<li class="">
<p>All Mojo functions now has a unique "function literal type". In practice, it
means that:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># type_of(foo) != type_of(bar)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now warns on uses of the legacy <code>fn</code> keyword. Please move to <code>def</code> as
this will upgrade to an error in the future.</p>
</li>
<li class="">
<p>Import statements of the form <code>from pkg import ...</code> no longer make <code>pkg</code>
available to the module.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="library-changes">Library changes<a href="https://mojolang.static.modular-staging.com/releases/nightly/#library-changes" class="hash-link" aria-label="Direct link to Library changes" title="Direct link to Library changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Removed explicit <code>trait_downcast</code>/<code>trait_downcast_var</code> across the standard
library sources, now that Mojo applies type refinement from comptime
assumptions. Public APIs are unchanged. Updated files:</p>
<ul>
<li class=""><code>stdlib/std/builtin/</code>: <code>_stubs.mojo</code>, <code>bool.mojo</code></li>
<li class=""><code>stdlib/std/collections/</code>: <code>deque.mojo</code>, <code>dict.mojo</code>, <code>inline_array.mojo</code>,
<code>linked_list.mojo</code>, <code>list.mojo</code>, <code>optional.mojo</code>, <code>set.mojo</code></li>
<li class=""><code>stdlib/std/iter/__init__.mojo</code>, <code>stdlib/std/itertools/itertools.mojo</code></li>
<li class=""><code>stdlib/std/memory/</code>: <code>arc_pointer.mojo</code>, <code>owned_pointer.mojo</code>, <code>span.mojo</code></li>
</ul>
</li>
<li class="">
<p>Consolidated the reflection APIs in <code>std.reflection</code> behind a unified entry
point <code>reflect[T]()</code> returning a <code>Reflected[T]</code> handle. <code>reflect</code> is
auto-imported via the prelude, so it is available without an explicit
import. Methods on the handle replace the family of <code>struct_field_*</code> free
functions (dropping the <code>struct_</code> prefix — only structs have fields) and
the <code>get_type_name</code> / <code>get_base_type_name</code> free functions:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Point</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> r </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> reflect</span><span class="token punctuation">[</span><span class="token plain">Point</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">r</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">                          </span><span class="token comment" style="color:#a89984"># "Point"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">r</span><span class="token punctuation">.</span><span class="token plain">field_count</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">                   </span><span class="token comment" style="color:#a89984"># 2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">r</span><span class="token punctuation">.</span><span class="token plain">field_names</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">                </span><span class="token comment" style="color:#a89984"># x</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> y_type </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> r</span><span class="token punctuation">.</span><span class="token plain">field_type</span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"y"</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Reflected[Float64]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">y_type</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">                     </span><span class="token comment" style="color:#a89984"># "SIMD[DType.float64, 1]"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">reflect</span><span class="token punctuation">[</span><span class="token plain">List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">base_name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># "List"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> v</span><span class="token punctuation">:</span><span class="token plain"> y_type</span><span class="token punctuation">.</span><span class="token plain">T </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3.14</span><br></div></code></pre></div></div>
<p>Methods on <code>Reflected[T]</code>: <code>name[qualified_builtins=]</code>, <code>base_name</code>,
<code>is_struct</code>, <code>field_count</code>, <code>field_names</code>, <code>field_types</code>,
<code>field_index[name]</code>, <code>field_type[name]</code>,
<code>field_offset[name=]/[index=]</code>, and <code>field_ref[idx](s)</code>. The
<code>field_type[name]()</code> method returns a <code>Reflected[FieldT]</code>, so reflection
is fully composable.</p>
<p>The legacy free functions — <code>struct_field_count</code>, <code>struct_field_names</code>,
<code>struct_field_types</code>, <code>struct_field_index_by_name</code>,
<code>struct_field_type_by_name</code>, <code>struct_field_ref</code>, <code>is_struct_type</code>,
<code>offset_of</code>, <code>get_type_name</code>, <code>get_base_type_name</code> — and the
<code>ReflectedType[T]</code> wrapper are now <code>@deprecated</code> and delegate to the new
API. They will be removed in a future release.</p>
</li>
<li class="">
<p>Added <code>struct_field_ref[idx, T](ref s)</code> to <code>std.reflection</code> for accessing
struct fields by index without copying. The function returns a reference
with the same mutability as <code>s</code> and works with both concrete and generic
struct types, including parametric indices in <code>comptime for</code> loops. The
default implementations of <code>Hashable</code>, <code>Equatable</code>, and <code>Writable</code> now use
this library function instead of the <code>__struct_field_ref</code> magic.</p>
</li>
<li class="">
<p>The <code>Boolable</code>, <code>Defaultable</code>, and <code>Writable</code> traits no longer inherit from
<code>ImplicitlyDestructible</code>. Generic code that relied on receiving the
destructor bound transitively through these traits must now spell it out
explicitly, for example <code>T: Writable &amp; ImplicitlyDestructible</code>.</p>
</li>
<li class="">
<p>The <code>Variadic</code> suite of low-level operation has been refactored and migrated
to being members of the <code>TypeList</code> and <code>ParameterList</code> types, making them more
ergonomic to work with and more accessible.</p>
</li>
<li class="">
<p>Atomic operations have moved to a dedicated <code>std.atomic</code> module. The
<code>Consistency</code> type has been renamed to <code>Ordering</code> and its <code>MONOTONIC</code>
member has been renamed to <code>RELAXED</code> to align with conventions used by
other languages. Update existing code as follows:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Before</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> std</span><span class="token punctuation">.</span><span class="token plain">os </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Atomic</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> std</span><span class="token punctuation">.</span><span class="token plain">os</span><span class="token punctuation">.</span><span class="token plain">atomic </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Atomic</span><span class="token punctuation">,</span><span class="token plain"> Consistency</span><span class="token punctuation">,</span><span class="token plain"> fence</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">_ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> atom</span><span class="token punctuation">.</span><span class="token plain">load</span><span class="token punctuation">[</span><span class="token plain">ordering</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Consistency</span><span class="token punctuation">.</span><span class="token plain">MONOTONIC</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> std</span><span class="token punctuation">.</span><span class="token plain">atomic </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Atomic</span><span class="token punctuation">,</span><span class="token plain"> Ordering</span><span class="token punctuation">,</span><span class="token plain"> fence</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">_ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> atom</span><span class="token punctuation">.</span><span class="token plain">load</span><span class="token punctuation">[</span><span class="token plain">ordering</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Ordering</span><span class="token punctuation">.</span><span class="token plain">RELAXED</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>assert_raises</code> now catches custom <code>Writable</code> error types, not just <code>Error</code>.</p>
</li>
<li class="">
<p>Added UAX #29 grapheme cluster segmentation to <code>String</code> and <code>StringSlice</code>.
New APIs: <code>graphemes()</code> returns a <code>GraphemeSliceIter</code> that yields each
user-perceived "character" as a <code>StringSlice</code>, and <code>count_graphemes()</code> returns
the grapheme cluster count. This correctly handles combining marks, emoji ZWJ
sequences, flag emoji, Hangul syllables, and other multi-codepoint clusters.</p>
</li>
<li class="">
<p><code>StringSlice</code> now supports slicing by grapheme cluster via the <code>grapheme=</code>
keyword argument, mirroring the existing <code>byte=</code> indexer. For example,
<code>s[grapheme=0:3]</code> returns a <code>StringSlice</code> covering the first three grapheme
clusters, and <code>s[grapheme=i:i+1]</code> extracts the <em>i</em>-th grapheme. Out-of-range
ends are clamped to the end of the string; negative indices are not supported.
Because grapheme boundaries are discovered by a forward scan, this operation
is O(n) in the byte length — prefer <code>byte=</code> slicing when you already have
byte offsets.</p>
</li>
<li class="">
<p><code>GraphemeSliceIter</code> now supports reverse iteration. <code>next_back()</code> and
<code>peek_back()</code> return the last grapheme cluster in the remaining range, and
<code>StringSlice.graphemes_reversed()</code> / <code>String.graphemes_reversed()</code> return a
<code>GraphemeSliceIter</code> whose <code>for</code>-loop iteration walks clusters from end to
start. <code>next()</code> and <code>next_back()</code> can be interleaved on the same iterator.
Reverse iteration costs more per cluster than forward iteration because the
UAX #29 state machine is inherently forward-scanning: <code>next_back()</code> backs
up to a guaranteed grapheme boundary (the start of the string or a
Control/CR/LF codepoint) and rescans forward. The safe boundary is cached
across reverse calls — a forward <code>next()</code> invalidates it — so per-call cost
is dominated by forward-scan length: small in text containing line breaks
or whitespace, growing with the distance back to such a codepoint in long
runs without them.</p>
</li>
<li class="">
<p>Added grapheme-aware algorithms on <code>String</code> and <code>StringSlice</code>:</p>
<ul>
<li class=""><code>grapheme_indices()</code> returns a <code>GraphemeIndicesIter</code> that yields
<code>(byte_offset, grapheme)</code> pairs, mirroring Rust's
<code>str::grapheme_indices</code>. Useful for text editors or UIs that need to
map cursor byte positions back to grapheme boundaries.</li>
<li class=""><code>nth_grapheme(n)</code> returns the <code>n</code>-th grapheme cluster as an
<code>Optional[StringSlice]</code>, or <code>None</code> when <code>n</code> is out of range.</li>
<li class=""><code>split_at_grapheme(n)</code> returns <code>Tuple[StringSlice, StringSlice]</code>
holding the prefix <code>[0, n)</code> and suffix <code>[n, count)</code> of grapheme
clusters in a single pass, clamping <code>n</code> to the total count.</li>
</ul>
</li>
<li class="">
<p><code>count_graphemes()</code> now takes a fast path over runs of printable ASCII
(U+0020..U+007E). Each such byte has GBP <code>Other</code> and two consecutive
safe-ASCII bytes always have a grapheme-cluster break between them
(GB999), so safe-ASCII runs can be counted at one grapheme per byte
without entering the UAX #29 state machine. On pure-ASCII text this is
roughly 10x faster (~0.38 ms vs. ~3.85 ms for 1 MB of English), and
~5-6x faster on ASCII-dominant mixed text (Spanish UN charter). Pure
non-ASCII text (Arabic, Russian, Chinese) is unchanged.</p>
</li>
<li class="">
<p>Variadics of types have been moved to the <code>TypeList</code> struct.
One can write operations such as:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">assert</span><span class="token plain"> TypeList</span><span class="token punctuation">[</span><span class="token plain">Trait</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">AnyType</span><span class="token punctuation">,</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> String</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">contains</span><span class="token punctuation">[</span><span class="token plain">Bool</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>abort(message)</code> now includes the call site location in its output. The
location is automatically captured and printed alongside the message. You can
also pass an explicit <code>SourceLocation</code> to override it:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">abort</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"something went wrong"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># prints: ABORT: path/to/file.mojo:42:5: something went wrong</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> loc </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> current_location</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">abort</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"something went wrong"</span><span class="token punctuation">,</span><span class="token plain"> location</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">loc</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>abort(message)</code> now prints its message on Nvidia and AMDGPU, including
block and thread IDs. Previously, the message was silently suppressed on
these GPUs. On Apple GPU, the message is silently suppressed for now.</p>
</li>
<li class="">
<p><code>SourceLocation</code> fields (<code>line</code>, <code>col</code>, <code>file_name</code>) are now private.
Use the new accessor methods <code>line()</code>, <code>column()</code>, and <code>file_name()</code> instead.</p>
</li>
<li class="">
<p>Fixed default alignment in <code>TileTensor.load()</code> and <code>TileTensor.store()</code> to
use the caller-specified <code>width</code> parameter instead of <code>Self.element_size</code>.</p>
</li>
<li class="">
<p>Added uninitialized memory read detection for float loads. When compiled
with <code>-D MOJO_STDLIB_SIMD_UNINIT_CHECK=true</code>, every float load is checked
against the debug allocator's poison patterns (0xFF host fill and canonical
qNaN device fill). A match triggers <code>abort()</code> with a descriptive message.
When disabled (the default), zero runtime overhead. For MAX pipelines, set
<code>MODULAR_MAX_DEBUG_UNINITIALIZED_READ_CHECK=true</code> (or the
<code>max-debug.uninitialized-read-check</code> config key, or
<code>InferenceSession.debug.uninitialized_read_check = True</code>) to enable both the
debug allocator and the load-time checks automatically.</p>
</li>
<li class="">
<p>Added <code>CompilationTarget.is_apple_m5()</code> to <code>std.sys</code> for detecting Apple M5
targets at compile time. <code>is_apple_silicon()</code> now includes M5 in its check.</p>
</li>
<li class="">
<p>Added Apple M5 MMA intrinsics (<code>apple_mma_load</code>, <code>apple_mma_store</code>,
<code>_mma_apple</code>) in <code>std.gpu.compute.arch.mma_apple</code>, enabling hardware matrix
multiply-accumulate on Apple GPU.</p>
</li>
<li class="">
<p>Standard library types now use conditional conformances, replacing previous
<code>_constrained_conforms_to</code> checks:</p>
<ul>
<li class=""><code>Span</code>: <code>Writable</code>, <code>Hashable</code></li>
<li class=""><code>Tuple</code>, <code>Optional</code>, <code>Variant</code>, and <code>UnsafeMaybeUninit</code>: <code>RegisterPassable</code></li>
<li class=""><code>Variant</code>: <code>Copyable</code>, <code>ImplicitlyCopyable</code></li>
</ul>
</li>
<li class="">
<p><code>Tuple</code> now conditionally conforms to <code>Defaultable</code>, so generic
<code>T: Defaultable</code> code can default-construct tuples when all element types are
<code>Defaultable</code>.</p>
</li>
<li class="">
<p><code>OwnedDLHandle.get_symbol()</code> now returns <code>Optional[UnsafePointer[...]]</code>
instead of aborting when a symbol is not found. This allows callers to handle
missing symbols gracefully.</p>
</li>
<li class="">
<p><code>UnsafePointer</code> is now non-null by design. See the
<a href="https://github.com/modular/modular/blob/main/mojo/proposals/non-null-pointer.md" target="_blank" rel="noopener noreferrer" class="">non-null pointer proposal</a>
for the full design and migration timeline.</p>
<p>The default null constructor <code>__init__(out self)</code> and <code>__bool__(self)</code> method
are now deprecated, and <code>UnsafePointer</code> no longer conforms to <code>Defaultable</code> or
<code>Boolable</code>.</p>
<p>To migrate, express nullability explicitly with
<code>Optional[UnsafePointer[...]]</code>, which has the same layout as <code>UnsafePointer</code>
(the null address is the <code>None</code> niche) so nullable pointers remain
zero-overhead and can be used across C-FFIs.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Before: null default construction</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> UnsafePointer</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">,</span><span class="token plain"> origin</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After: express absence with Optional</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr</span><span class="token punctuation">:</span><span class="token plain"> Optional</span><span class="token punctuation">[</span><span class="token plain">UnsafePointer</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">,</span><span class="token plain"> origin</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Before: Bool-based null check</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> ptr</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    use</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After: check the Optional, then unwrap</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> ptr</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    use</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>If you specifically need a non-null placeholder for a field that will be
populated later (for example, a buffer that is allocated on demand) use
<code>UnsafePointer.unsafe_dangling()</code>, which returns a well-aligned but dangling
pointer. Note that <code>unsafe_dangling()</code> is not a null sentinel: types that
lazily allocate must track initialization separately.</p>
</li>
<li class="">
<p>GPU primitive id accessors (e.g. <code>thread_idx</code>) have migrated from <code>UInt</code> to
<code>Int</code>.</p>
<p>This is part of a broader migration to standardize on the <code>Int</code> type for all
sizes and offsets in Mojo.</p>
<p>To provide a gradual migration path, explicitly typed aliases are
available temporarily.</p>













































<table><thead><tr><th>Base</th><th><code>UInt</code> Accessor</th><th><code>Int</code> Accessor</th></tr></thead><tbody><tr><td><code>thread_idx</code></td><td><code>thread_idx_uint</code></td><td><code>thread_idx_int</code></td></tr><tr><td><code>thread_dim</code></td><td><code>thread_dim_uint</code></td><td><code>thread_dim_int</code></td></tr><tr><td><code>block_dim</code></td><td><code>block_dim_uint</code></td><td><code>block_dim_int</code></td></tr><tr><td><code>grid_dim</code></td><td><code>grid_dim_uint</code></td><td><code>grid_dim_int</code></td></tr><tr><td><code>global_idx</code></td><td><code>global_idx_uint</code></td><td><code>global_idx_int</code></td></tr><tr><td><code>lane_id</code></td><td><code>lane_id_uint</code></td><td><code>lane_id_int</code></td></tr><tr><td><code>warp_id</code></td><td><code>warp_id_uint</code></td><td><code>warp_id_int</code></td></tr></tbody></table>
<p>Code can preserve its prior behavior by using a renaming import of the
<code>thread_idx_uint</code> alias:</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">- from std.gpu import thread_idx</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">+ from std.gpu import thread_idx_uint as thread_idx</span><br></div></code></pre></div></div>
<p>Note that <code>thread_idx_uint</code> and the other <code>_*uint</code> aliases will eventually
be deprecated and removed as well.</p>
<p>After a temporary deprecation acting as a "speed bump" in the 2026-03-29
nightly release, <code>thread_idx</code> etc. have changed from <code>UInt</code> to <code>Int</code>.</p>
<p>Code built with a version where <code>thread_idx</code> is still <code>UInt</code>, can proactively
migrate to the eventual <code>Int</code> behavior using the <code>thread_idx_int</code> alias:</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">- from std.gpu import thread_idx</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">+ from std.gpu import thread_idx_int as thread_idx</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"># ... update file to reflect change from `UInt` to `Int` ...</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added <code>IterableOwned</code> trait to the iteration module. Types conforming to
<code>IterableOwned</code> implement <code>__iter__(var self)</code>, which consumes the collection
and returns an iterator that owns the underlying elements.</p>
<ul>
<li class=""><code>List</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Optional</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Deque</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>LinkedList</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Dict</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Set</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Counter</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>InlineArray</code> now conforms to <code>IterableOwned</code>.</li>
<li class=""><code>Span</code> now conforms to <code>IterableOwned</code> (conditional on <code>T: Copyable</code>).
The owned iterator yields copies of elements by value.</li>
<li class="">Iterator adaptors (<code>enumerate</code>, <code>zip</code>, <code>map</code>, <code>peekable</code>, <code>take_while</code>,
<code>drop_while</code>, <code>product</code>, <code>cycle</code>, <code>count</code>, <code>repeat</code>) now conform to
<code>IterableOwned</code>.</li>
<li class="">Added owned overloads of <code>enumerate()</code>, <code>zip()</code>, <code>map()</code>, <code>peekable()</code>,
<code>take_while()</code>, <code>drop_while()</code>, <code>product()</code>, and <code>cycle()</code> that consume the
input iterable.</li>
</ul>
</li>
<li class="">
<p><code>CStringSlice</code> can no longer represent a null pointer. To represent
nullability use <code>Optional[CStringSlice]</code> which is guaranteed to have the same
size and layout as <code>const char*</code>, where <code>NULL</code> is the empty <code>Optional</code>.</p>
</li>
<li class="">
<p><code>external_call</code>'s <code>return_type</code>'s requirements has been relaxed from
<code>TrivialRegisterPassable</code> to <code>RegisterPassable</code>.</p>
</li>
<li class="">
<p>Negative indexing on all stdlib collections has been removed to enable cheap
CPU bounds checks by default:</p>
<ul>
<li class=""><code>List</code></li>
<li class=""><code>Span</code></li>
<li class=""><code>InlineArray</code></li>
<li class=""><code>String</code></li>
<li class=""><code>StringSlice</code></li>
<li class=""><code>LinkedList</code></li>
<li class=""><code>Deque</code></li>
<li class=""><code>IntTuple</code></li>
</ul>
<p>Using a negative <code>IntLiteral</code> for indexing will now trigger a compile-time
error, for example:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">/tmp/main.mojo:3:12: note: call expansion failed with parameter value(s): (..., ...)</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        print(x[-1])</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            ^</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">constraint failed: negative indexing is not supported, use e.g. `x[len(x) - 1]` instead</span><br></div></code></pre></div></div>
<p>Update any <code>x[-1]</code> to <code>x[len(x) - 1]</code>, following the compiler errors to
your call sites as above.</p>
<p>This does not affect any MAX ops that support negative indexing.</p>
</li>
<li class="">
<p>Bounds checking is now on by default for all collections on CPU, and will show
you the call site in your code where you triggered the out of bounds access:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">At: /tmp/main.mojo:3:12: Assert Error: index 3 is out of bounds, valid range is 0 to 2</span><br></div></code></pre></div></div>
<p>Bounds checking is still off by default for GPU to avoid performance
penalties. To enable it for tests:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">mojo build </span><span class="token parameter variable" style="color:#af2528">-D</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#af2528">ASSERT</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">all main.mojo</span><br></div></code></pre></div></div>
<p>To turn off all asserts, including CPU bounds checking:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">mojo build </span><span class="token parameter variable" style="color:#af2528">-D</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#af2528">ASSERT</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">none main.mojo</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>alloc[T](count, alignment)</code> will now <code>abort</code> if the underlying allocation
failed.</p>
</li>
<li class="">
<p>Added <code>Variadic.contains_value</code> comptime alias to check whether a variadic
sequence contains a specific value at compile time.</p>
</li>
<li class="">
<p><code>ArcPointer</code> now conditionally conforms to <code>Hashable</code> and <code>Equatable</code> when
its inner type <code>T</code> does. Both <code>__eq__</code> and <code>__hash__</code> delegate to the managed
value, matching C++ <code>shared_ptr</code> and Rust <code>Arc</code> semantics. This makes
<code>ArcPointer</code> usable as a <code>Dict</code> key or <code>Set</code> element with value-based
equality. Pointer identity is still available via the <code>is</code> operator.</p>
</li>
<li class="">
<p><code>Path</code> now conforms to <code>Comparable</code>, enabling lexicographic ordering and use
with <code>sort()</code>.</p>
</li>
<li class="">
<p><code>range()</code> overloads that took differently-typed arguments or arguments that
were <code>Intable</code>/<code>IntableRaising</code> but not <code>Indexer</code> have been removed. Callers
should ensure they're passing consistent integral argument types when calling
<code>range()</code>.</p>
</li>
<li class="">
<p><code>Consistency</code> now has a default constructor that selects <code>RELEASE</code> ordering on
Apple GPU and <code>SEQUENTIAL</code> on all other targets. All <code>Atomic</code> methods and
<code>fence</code> use this platform-aware default instead of hard-coding <code>SEQUENTIAL</code>.</p>
</li>
<li class="">
<p><code>NDBuffer</code> has been fully removed. Please migrate to <code>TileTensor</code>.</p>
</li>
<li class="">
<p>Added a generic <code>__contains__</code> method to <code>Span</code> for any element type
conforming to <code>Equatable</code>, not just <code>Scalar</code> types.</p>
</li>
<li class="">
<p>Fixed <code>blocked_product</code> in <code>tile_layout</code> to zip block and tiler dimensions
per mode, matching the legacy <code>blocked_product</code> behavior.</p>
</li>
<li class="">
<p>Added <code>Span</code>-based overloads for <code>enqueue_copy</code>, <code>enqueue_copy_from</code>, and
<code>enqueue_copy_to</code> on <code>DeviceContext</code>, <code>DeviceBuffer</code>, and <code>HostBuffer</code>,
providing a safer alternative to raw <code>UnsafePointer</code> for host-device memory
transfers.</p>
</li>
<li class="">
<p><code>String.__len__()</code> has been deprecated. Prefer to use <code>String.byte_length()</code>
or <code>String.count_codepoints()</code>.</p>
</li>
<li class="">
<p>Added <code>map()</code> and <code>and_then()</code> methods to <code>Optional</code>. <code>map()</code> transforms
the contained value by applying a function, returning <code>Optional[To]</code>.
<code>and_then()</code> chains operations that themselves return an <code>Optional</code>, enabling
flat-mapping over fallible computations.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> o </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Optional</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">closure</span><span class="token punctuation">(</span><span class="token plain">n</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> unified </span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token plain">n </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> mapped</span><span class="token punctuation">:</span><span class="token plain"> Optional</span><span class="token punctuation">[</span><span class="token plain">String</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> o</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">map</span><span class="token punctuation">[</span><span class="token plain">To</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">String</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">closure</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">mapped</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Optional("43")</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added <code>std.memory.forget_deinit()</code> to enable low-level code to skip the usual
requirement to run a destructor for a value. This function should be used
rarely, when building low-level abstractions.</p>
</li>
<li class="">
<p><code>parallelize</code>, <code>parallelize_over_rows</code> (in
<code>std.algorithm.backend.cpu.parallelize</code>) and the <code>elementwise</code> overloads in
<code>std.algorithm.functional</code> now accept an optional trailing
<code>ctx: Optional[DeviceContext] = None</code> parameter. When supplied, the provided
CPU <code>DeviceContext</code> is forwarded to <code>sync_parallelize</code> so that parallel work
runs on that context; when omitted, the previous behavior is preserved. This
is a step toward running CPU ops on specific NUMA nodes.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/nightly/#tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The Mojo debugger now shows a <code>Variant</code> variable's active type name and
value in LLDB — e.g. <code>Int(42)</code> or <code>String("hello")</code> — instead of exposing
raw <code>_DefaultVariantStorage</code> internals.</p>
</li>
<li class="">
<p>The Mojo debugger now displays scalar types (e.g. <code>UInt8</code>, <code>Float32</code>) as
plain values instead of <code>([0] = value)</code>, and elides internal <code>_mlir_value</code>
wrapper fields from struct display.</p>
</li>
<li class="">
<p><code>mojo format</code> no longer supports the deprecated <code>fn</code> keyword, nor the
removed <code>owned</code> argument convention.</p>
</li>
<li class="">
<p>Comptime function calls now print more nicely in error messages and generated
documentation, not including <code>VariadicList</code>/<code>VariadicPack</code> and including
keyword argument labels when required.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gpu-programming">GPU programming<a href="https://mojolang.static.modular-staging.com/releases/nightly/#gpu-programming" class="hash-link" aria-label="Direct link to GPU programming" title="Direct link to GPU programming" translate="no">​</a></h2>
<ul>
<li class="">Added support for AMD MI250X accelerators.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/nightly/#-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p>The <code>escaping</code> function effect is no longer supported. Migrate
<code>def(...) escaping -&gt; T</code> closures to <code>unified</code> closures.</p>
</li>
<li class="">
<p>The deprecated <code>@doc_private</code> decorator has been removed. Use <code>@doc_hidden</code>
instead.</p>
</li>
<li class="">
<p>Removed the <code>store_release</code>, <code>store_relaxed</code>, <code>load_acquire</code>, and
<code>load_relaxed</code> helpers from <code>std.gpu.intrinsics</code>. Use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/atomic/atomic/Atomic/#store"><code>Atomic[dtype, scope=...].store</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/atomic/atomic/Atomic/#load"><code>Atomic[dtype, scope=...].load</code></a> with
the desired <a class="" href="https://mojolang.static.modular-staging.com/docs/std/atomic/atomic/Ordering/"><code>Ordering</code></a> instead:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Before</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> std</span><span class="token punctuation">.</span><span class="token plain">gpu</span><span class="token punctuation">.</span><span class="token plain">intrinsics </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> store_release</span><span class="token punctuation">,</span><span class="token plain"> load_acquire</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">store_release</span><span class="token punctuation">[</span><span class="token plain">scope</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Scope</span><span class="token punctuation">.</span><span class="token plain">GPU</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> v </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> load_acquire</span><span class="token punctuation">[</span><span class="token plain">scope</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Scope</span><span class="token punctuation">.</span><span class="token plain">GPU</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> std</span><span class="token punctuation">.</span><span class="token plain">atomic </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Atomic</span><span class="token punctuation">,</span><span class="token plain"> Ordering</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Atomic</span><span class="token punctuation">[</span><span class="token plain">dtype</span><span class="token punctuation">,</span><span class="token plain"> scope</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"device"</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">store</span><span class="token punctuation">[</span><span class="token plain">ordering</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Ordering</span><span class="token punctuation">.</span><span class="token plain">RELEASE</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> v </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Atomic</span><span class="token punctuation">[</span><span class="token plain">dtype</span><span class="token punctuation">,</span><span class="token plain"> scope</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"device"</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">load</span><span class="token punctuation">[</span><span class="token plain">ordering</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">Ordering</span><span class="token punctuation">.</span><span class="token plain">ACQUIRE</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/nightly/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p>Fixed <code>math.sqrt</code> on <code>Float64</code> on NVIDIA GPU producing a cryptic
<code>could not find LLVM intrinsic: "llvm.nvvm.sqrt.approx.d"</code> failure at LLVM
IR translation time. <code>math.sqrt</code> now rejects <code>Float64</code> on NVIDIA GPU at
compile time with the message <code>DType.float64 isn't supported for approx sqrt on NVIDIA GPU</code>. The existing <code>math.sin</code> and <code>math.cos</code> constraint
messages were also sharpened to name the op (<code>DType.float64 isn't supported for sin/cos on NVIDIA GPU</code>).
(<a href="https://github.com/modular/modular/issues/6434" target="_blank" rel="noopener noreferrer" class="">Issue #6434</a>)</p>
</li>
<li class="">
<p>Fixed pack inference failing with <code>could not infer type of parameter pack ... given value with unresolved type</code> when passing list, dict, set, or slice
literals to a <code>*Ts</code>-bound variadic pack parameter (e.g.
<code>def foo[*Ts: Iterable](*args: *Ts)</code>). Pack inference now applies the same
default-type fallback that single-argument trait-bound parameters already
use, so <code>foo([1, 2, 3], [4, 5, 6])</code> resolves each literal to its default
type (e.g. <code>List[Int]</code>) before binding the pack.</p>
</li>
<li class="">
<p>Fixed <code>mojo</code> aborting at startup with <code>std::filesystem::filesystem_error</code>
when <code>$HOME</code> is not traversable by the running UID (common in containerized
CI where the image's build-time UID differs from the runtime UID). The
config search now treats permission errors as "not found" and falls through
to the next candidate.
(<a href="https://github.com/modular/modular/issues/6412" target="_blank" rel="noopener noreferrer" class="">Issue #6412</a>)</p>
</li>
<li class="">
<p><code>mojo run</code> and <code>mojo debug</code> now honor <code>-Xlinker</code> flags by loading the
referenced shared libraries into the in-process JIT. Previously the flags
were dropped (with a <code>-Xlinker argument unused</code> warning), leaving programs
that called into external shared libraries via <code>external_call</code> unable to
resolve those symbols at runtime (so <code>mojo build</code> worked but <code>mojo run</code> did
not). The supported forms mirror what the system linker accepts: <code>-Xlinker -L&lt;dir&gt;</code>, <code>-Xlinker -l&lt;name&gt;</code>, <code>-Xlinker -rpath &lt;dir&gt;</code>, and <code>-Xlinker &lt;absolute-path-to-shared-library&gt;</code>. Flags that have no meaning under JIT
are reported as a warning and ignored.
(<a href="https://github.com/modular/modular/issues/6155" target="_blank" rel="noopener noreferrer" class="">Issue #6155</a>)</p>
</li>
<li class="">
<p>Fixed <code>libpython</code> auto-discovery failing for Python 3.14 free-threaded builds.
The discovery script constructed the library filename without the ABI flags
suffix (e.g. looked for <code>libpython3.14.dylib</code> instead of
<code>libpython3.14t.dylib</code>).
(<a href="https://github.com/modular/modular/issues/6366" target="_blank" rel="noopener noreferrer" class="">Issue #6366</a>)</p>
</li>
<li class="">
<p>Fixed <code>RTLD.LOCAL</code> having the wrong value on Linux. It was set to <code>4</code>
(<code>RTLD_NOLOAD</code>) instead of <code>0</code>, causing <code>dlopen</code> with <code>RTLD.NOW | RTLD.LOCAL</code>
to fail. (<a href="https://github.com/modular/modular/issues/6410" target="_blank" rel="noopener noreferrer" class="">Issue #6410</a>)</p>
</li>
<li class="">
<p>Fixed <code>mojo format</code> crashing after upgrading Mojo versions due to a stale
grammar cache. (<a href="https://github.com/modular/modular/issues/6144" target="_blank" rel="noopener noreferrer" class="">Issue #6144</a>)</p>
</li>
<li class="">
<p>Fixed <code>atof</code> producing incorrect results for floats near the
normal/subnormal boundary (e.g., <code>Float64("4.4501363245856945e-308")</code>
returned half the correct value).
(<a href="https://github.com/modular/modular/issues/6196" target="_blank" rel="noopener noreferrer" class="">#6196</a>)</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5872" target="_blank" rel="noopener noreferrer" class="">Issue #5872</a>: Fixed a
compiler crash ("'get_type_name' requires a concrete type") when using
default <code>Writable</code>, <code>Equatable</code>, or <code>Hashable</code> implementations on structs
with MLIR-type fields (e.g. <code>__mlir_type.index</code>). The compiler now correctly
reports that the field does not implement the required trait.</p>
</li>
<li class="">
<p>Fixed <code>Atomic.store</code> silently dropping the requested <code>scope</code>. The previous
implementation lowered to <code>atomicrmw xchg</code> without forwarding <code>syncscope</code>,
so <code>Atomic[..., scope="device"].store(...)</code> was emitting a system-scope
store on NVPTX (extra L2/NVLink fences) and an over-synchronized store on
AMDGPU. <code>Atomic.store</code> now lowers via <code>pop.store atomic syncscope(...)</code>,
emitting <code>st.release.&lt;scope&gt;</code> on NVPTX and a properly-scoped LLVM atomic
store on AMDGPU. The Mojo API surface is unchanged.</p>
</li>
<li class="">
<p>Fixed <code>Process.run()</code> not inheriting the parent's environment variables.
Child processes spawned via <code>Process.run()</code> now correctly receive the
parent's environment.</p>
</li>
<li class="">
<p>Fixed <code>\xhh</code> and <code>\ooo</code> escape sequences in string literals being
interpreted as raw bytes instead of Unicode code points, which produced
malformed UTF-8 for values <code>&gt;= 0x80</code>. The escapes now match Python <code>str</code>
semantics (and the existing <code>\u</code>/<code>\U</code> handling): <code>"\x85"</code> encodes U+0085
(NEL) as two UTF-8 bytes and <code>ord("\x85")</code> returns <code>133</code> instead of <code>5</code>.
Code that relied on <code>\xhh</code> to emit a single raw byte for non-ASCII values
must construct the bytes explicitly (for example via a <code>List[Byte]</code>
literal).
(<a href="https://github.com/modular/modular/issues/2842" target="_blank" rel="noopener noreferrer" class="">Issue #2842</a>)</p>
</li>
<li class="">
<p>Fixed incorrect data layout for <code>MI250X</code> AMDGPU architectures.
(<a href="https://github.com/modular/modular/issues/6451" target="_blank" rel="noopener noreferrer" class="">Issue #6451</a></p>
</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v0.26.2]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.26.2/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.26.2/"/>
        <updated>2026-03-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Official Modular AI agent skills.</strong> Modular has released
<a href="https://github.com/modular/skills" target="_blank" rel="noopener noreferrer" class="">official AI agent skills</a> for working
with MAX and Mojo. The four skills—<code>new-modular-project</code>, <code>mojo-syntax</code>,
<code>mojo-gpu-fundamentals</code>, and <code>mojo-python-interop</code>—help AI coding agents
create new projects with the right tooling, generate correct modern Mojo
syntax, follow GPU programming best practices, and handle Python-Mojo
interop. The skills follow the open
<a href="https://agentskills.io/specification" target="_blank" rel="noopener noreferrer" class="">Agent Skills Standard</a> and work with
Claude Code and other compatible agents. Install them with
<code>npx skills add modular/skills</code>.</p>
</li>
<li class="">
<p><strong>Conditional trait conformances.</strong> Structs can now declare trait
conformances that apply only when type parameters satisfy certain
conditions, using <code>where</code> clauses in the conformance list. Nine standard
library types—including <code>List</code>, <code>Dict</code>, <code>Set</code>, and <code>Optional</code>—now use
this feature to enforce trait requirements at compile time. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-language-enhancements" class="">Language enhancements</a> and
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-conditional-conformances" class="">Conditional conformances</a>.</p>
</li>
<li class="">
<p><strong><code>def</code>/<code>fn</code> unification.</strong> <code>def</code> is now Mojo's standard function
declaration keyword. <code>def</code> functions no longer implicitly raise and now
have the same semantics as <code>fn</code>: non-raising by default, with explicit
<code>raises</code> for functions that can throw. <code>fn</code> is deprecated and will be
removed in a future release. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-language-enhancements" class="">Language enhancements</a>.</p>
</li>
<li class="">
<p><strong>T-strings.</strong> Mojo now supports template strings with the <code>t"..."</code> prefix.
T-strings produce a <code>TString</code> value that captures both the static format
string and runtime arguments, enabling structured string processing without
immediate allocation. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-language-enhancements" class="">Language enhancements</a>.</p>
</li>
<li class="">
<p><strong><code>comptime if</code> and <code>comptime for</code>.</strong> The new <code>comptime if</code> and
<code>comptime for</code> syntax replaces the legacy <code>@parameter if</code> and
<code>@parameter for</code> decorator forms for compile-time conditionals and loops.
Both syntaxes are accepted in this release; the <code>@parameter</code> forms will be
deprecated soon. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-language-enhancements" class="">Language enhancements</a>.</p>
</li>
<li class="">
<p><strong><code>assert</code> statement.</strong> Mojo now supports a standalone <code>assert</code> statement,
similar to Python's <code>assert</code>. It checks a condition at runtime and aborts
if the condition is false, with an optional message. Under the hood,
<code>assert</code> desugars to <code>debug_assert()</code> and respects the <code>-D ASSERT</code> flag.
See <a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-language-enhancements" class="">Language enhancements</a>.</p>
</li>
<li class="">
<p><strong><code>@align(N)</code> decorator.</strong> Structs can now specify minimum alignment with
<code>@align(N)</code>, similar to C++ <code>alignas</code> and Rust <code>#[repr(align(N))]</code>. The
alignment value can be a struct parameter, enabling generic cache-aligned
and hardware-aligned types. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-language-enhancements" class="">Language enhancements</a>.</p>
</li>
<li class="">
<p><strong>Implicit <code>Int</code> to <code>SIMD</code> conversions deprecated.</strong> Implicit conversions
from <code>Int</code> to <code>SIMD</code> scalar types like <code>Int8</code> or <code>Float32</code> are now
deprecated. Code relying on these conversions should use explicit
constructors instead. The <code>mojo build --experimental-fixit</code> command can
assist with migration. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-math" class="">Math and numeric types</a>.</p>
</li>
<li class="">
<p><strong>Init unification.</strong> The <code>__moveinit__()</code> and <code>__copyinit__()</code> methods
are now renamed to <code>__init__()</code> with keyword-only <code>take</code> and <code>copy</code>
arguments, respectively. The legacy names are still accepted but should be
migrated to the modern form. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-init-unification" class="">Init unification</a>.</p>
</li>
<li class="">
<p><strong><code>Stringable</code> and <code>Representable</code> deprecated.</strong> These traits are replaced
by the unified <code>Writable</code> trait, which provides default implementations.
Most standard library types have already had their <code>Stringable</code> and
<code>Representable</code> conformances removed. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-string" class="">String and text</a>.</p>
</li>
<li class="">
<p><strong>UTF-8 safety improvements.</strong> <code>String</code> and <code>StringSlice</code> subscripting
now panics when an index falls in the middle of a multi-byte codepoint,
and <code>String.resize()</code> panics on operations that would produce invalid
UTF-8. Byte-position subscripting now returns an entire Unicode codepoint
instead of a single byte. See <a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-string" class="">String and text</a>.</p>
</li>
<li class="">
<p><strong><code>trait</code> no longer inherits <code>ImplicitlyDestructible</code>.</strong> Trait declarations
no longer automatically conform to <code>ImplicitlyDestructible</code>; traits that
need it must now opt in explicitly. This continues v0.26.1's work on
explicitly-destroyed types and encourages the ecosystem to support linear
types by default. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-other-language-changes" class="">Other changes</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-documentation">Documentation<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">
<p>Added a new <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/python-to-mojo/">Mojo tips for Python devs</a> page
to the Mojo Manual, covering key differences Python developers encounter
when learning Mojo. Topics include variable declarations with <code>var</code>,
type annotations, integer vs. floating-point division, implicit conversions,
and other common gotchas. If you're coming from Python, this page helps you
avoid surprises and write idiomatic Mojo faster.</p>
</li>
<li class="">
<p>Added a new
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/lifecycle/object-initialization/">Instance initialization deep dive</a>
page to the Mojo Manual. This page explains the difference between logical and
fieldwise initialization, how to write <code>__init__</code> constructors that satisfy
the compiler's field-by-field initialization requirements, and how copy and
move constructors fit into the initialization model. Essential reading for
anyone working with non-trivial struct types.</p>
</li>
<li class="">
<p>Added a new <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/generics/generics/">Generics</a> page to the Mojo
Manual with worked examples of conditional trait conformance. The page shows
how to use <code>where</code> clauses to declare that a generic type conforms to a
trait only when its type parameters meet certain conditions, such as making
a container <code>Equatable</code> only when its element type is.</p>
</li>
<li class="">
<p>Restructured and expanded the <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/metaprogramming/">metaprogramming</a>
section of the Mojo Manual. This includes a new introduction page, which
provides an overview of Mojo's compile-time metaprogramming model, and new
pages on compile-time evaluation, reflection, and materialization, as well as
the previously-mentioned page on generics. Together these changes cover
several previously undocumented topics and provide a smoother learning path
from basic parameters to advanced metaprogramming techniques.</p>
</li>
<li class="">
<p>Updated the <a class="" href="https://mojolang.static.modular-staging.com/docs/tools/notebooks/">Jupyter Notebooks</a> page with Apple
Silicon GPU examples and setup instructions, so macOS users with M-series
chips can run GPU-accelerated Mojo code in notebooks without needing an
external GPU.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-language-enhancements">Language enhancements<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-language-enhancements" class="hash-link" aria-label="Direct link to Language enhancements" title="Direct link to Language enhancements" translate="no">​</a></h2>
<ul>
<li class="">
<p><code>def</code> is now Mojo's standard function declaration keyword. <code>def</code> functions no
longer implicitly raise and now have the same semantics as <code>fn</code>: they are
non-raising by default, accept a <code>raises</code> specifier, and support typed errors.
<code>fn</code> is now deprecated and will be removed in a future release. We recommend
switching all <code>fn</code> declarations to <code>def</code>.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Previously</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain">                        </span><span class="token comment" style="color:#a89984"># Implicitly raised Error.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain">                         </span><span class="token comment" style="color:#a89984"># Did not raise.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">baz</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises</span><span class="token punctuation">:</span><span class="token plain">                  </span><span class="token comment" style="color:#a89984"># Explicitly raised Error.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">qux</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises EmptyDictError</span><span class="token punctuation">:</span><span class="token plain">   </span><span class="token comment" style="color:#a89984"># Raised a typed error.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Now</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain">                        </span><span class="token comment" style="color:#a89984"># Does not raise.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises</span><span class="token punctuation">:</span><span class="token plain">                 </span><span class="token comment" style="color:#a89984"># Explicitly raises Error.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">baz</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises EmptyDictError</span><span class="token punctuation">:</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Raises a typed error.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">qux</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain">                         </span><span class="token comment" style="color:#a89984"># Deprecated: use 'def' instead.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">qux</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises</span><span class="token punctuation">:</span><span class="token plain">                  </span><span class="token comment" style="color:#a89984"># Deprecated: use 'def' instead.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">qux</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises EmptyDictError</span><span class="token punctuation">:</span><span class="token plain">   </span><span class="token comment" style="color:#a89984"># Deprecated: use 'def' instead.</span><br></div></code></pre></div></div>
<p>This change clarifies function contracts by making error handling explicit:
a <code>def</code> without <code>raises</code> guarantees that errors are handled locally or cannot
occur, and the compiler enforces this no-throw guarantee.</p>
</li>
<li class="">
<p>Mojo now supports <strong>conditional trait conformances</strong> on struct declarations.
A struct can declare that it conforms to a trait only when its type parameters
satisfy certain conditions, using <code>where</code> clauses in the conformance list.
The <code>where</code> clause accepts any
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/Bool/"><code>Bool</code></a>-typed parameter
expression. For example,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a> now uses this to
conditionally conform to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/comparable/Equatable/"><code>Equatable</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/Writable/"><code>Writable</code></a> only when its
element type does:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">List</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Movable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    Copyable</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    Equatable where conforms_to</span><span class="token punctuation">(</span><span class="token plain">T</span><span class="token punctuation">,</span><span class="token plain"> Equatable</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    Movable</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    Writable where conforms_to</span><span class="token punctuation">(</span><span class="token plain">T</span><span class="token punctuation">,</span><span class="token plain"> Writable</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>Here is a small self-contained example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@fieldwise_init</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Wrapper</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Copyable </span><span class="token operator" style="color:#a89984">&amp;</span><span class="token plain"> ImplicitlyDestructible</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    Writable where conforms_to</span><span class="token punctuation">(</span><span class="token plain">T</span><span class="token punctuation">,</span><span class="token plain"> Writable</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">.</span><span class="token plain">T</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@fieldwise_init</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">NotWritable</span><span class="token punctuation">(</span><span class="token plain">Copyable</span><span class="token punctuation">,</span><span class="token plain"> ImplicitlyDestructible</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> data</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> w </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Wrapper</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">w</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># OK — Int is Writable. Prints: Wrapper[Int](value=42)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> w2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Wrapper</span><span class="token punctuation">[</span><span class="token plain">NotWritable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">NotWritable</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># OK to construct</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">w2</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># errors at parse time</span><br></div></code></pre></div></div>
<p><strong>Current limitations</strong>: Conditional conformance to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/RegisterPassable/"><code>RegisterPassable</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/TrivialRegisterPassable/"><code>TrivialRegisterPassable</code></a>,
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/anytype/ImplicitlyDestructible/"><code>ImplicitlyDestructible</code></a>
is not yet supported.</p>
</li>
<li class="">
<p>Mojo now supports t-strings (template strings) for building structured
string templates with interpolated expressions. T-strings use the <code>t"..."</code>
prefix and produce a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/tstring/TString/"><code>TString</code></a> value that
captures both the static format string and any runtime
arguments, rather than immediately producing a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/"><code>String</code></a>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">20</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">t</span><span class="token string" style="color:#477a5b">"{x} + {y} = {x + y}"</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints: 10 + 20 = 30</span><br></div></code></pre></div></div>
<p>Use <code>{{</code> and <code>}}</code> to include literal braces in the output:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">t</span><span class="token string" style="color:#477a5b">"Use {{braces}} like this"</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints: Use {braces} like this</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now supports <code>comptime if</code> and <code>comptime for</code> as the preferred syntax
for compile-time conditional and loop constructs, replacing the legacy
<code>@parameter if</code> and <code>@parameter for</code> decorator forms:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Old syntax (still accepted, deprecated in a future release)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> some_condition</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># New syntax</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> some_condition</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>Both syntaxes are accepted in this release. The <code>@parameter</code> forms will be
deprecated soon, and the parser will generate a warning and a fixit suggestion
to migrate to the new syntax.</p>
</li>
<li class="">
<p>Mojo now supports a standalone <code>assert</code> statement, similar to Python's
<code>assert</code>. It checks a condition at runtime and aborts the program if the
condition is false:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">assert</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"x must be positive"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">assert</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">items</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">!=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><br></div></code></pre></div></div>
<p>The condition must be a <code>Bool</code> expression and the optional
message can be any <code>Writable</code> expression (<code>StringLiteral</code>,
<code>String</code>, <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Int/"><code>Int</code></a>, etc.). Under
the hood, <code>assert</code> desugars to a call to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/debug_assert/debug_assert/"><code>debug_assert()</code></a>,
so it respects the
existing <code>-D ASSERT</code> flag: assertions are active when compiled with
<code>-D ASSERT=all</code> and are no-ops otherwise.</p>
</li>
<li class="">
<p>Mojo now supports the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/align/"><code>@align</code></a><code>(N)</code> decorator to
specify minimum alignment for structs, similar to C++'s
<code>alignas</code> and Rust's <code>#[repr(align(N))]</code>. The value
<code>N</code> must be a positive power of 2 and specifies the minimum alignment in
bytes. The actual alignment is <code>max(N, natural_alignment)</code>—you cannot
use <code>@align</code> to reduce alignment below the struct's natural alignment. For
example, <code>@align(1)</code> on a struct containing an <code>Int</code> (8-byte aligned) will
emit a warning and the struct will remain 8-byte aligned.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> sys </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> align_of</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@align</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">64</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">CacheAligned</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> data</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">align_of</span><span class="token punctuation">[</span><span class="token plain">CacheAligned</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Prints 64</span><br></div></code></pre></div></div>
<p>Both stack and heap allocations respect <code>@align</code>.</p>
<p>The alignment value can also be a struct parameter, enabling generic
aligned types:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@align</span><span class="token punctuation">(</span><span class="token plain">Self</span><span class="token punctuation">.</span><span class="token plain">alignment</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">AlignedBuffer</span><span class="token punctuation">[</span><span class="token plain">alignment</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> data</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">align_of</span><span class="token punctuation">[</span><span class="token plain">AlignedBuffer</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">64</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">   </span><span class="token comment" style="color:#a89984"># Prints 64</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">align_of</span><span class="token punctuation">[</span><span class="token plain">AlignedBuffer</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">128</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Prints 128</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now supports specifying a default value for an inferred parameter,
making it easier to create a partially bound type:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Pointer</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">mut</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">False</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token plain"> o</span><span class="token punctuation">:</span><span class="token plain"> Origin</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">mut</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Default to immutable pointer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> ImmPointer </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Pointer</span><span class="token punctuation">[</span><span class="token plain">_</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Explicitly set to mutable pointer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> mutPointer </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Pointer</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">mut</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">True</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Inferred mutability from `SomeOrigin()`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> InferredPointer </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Pointer</span><span class="token punctuation">[</span><span class="token plain">SomeOrigin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Parametric mutability pointer.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> ParametricPointer </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Pointer</span><span class="token punctuation">[</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now enforces more explicit parameter binding rules:</p>
<ul>
<li class="">
<p><code>[]</code> is mandatory to make type more concrete:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">SomeStruct</span><span class="token punctuation">[</span><span class="token plain">a </span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># SS1 is a parametric type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> SS1 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># SS2 a concrete type alias of `SomeStruct[1]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> SS2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
</li>
<li class="">
<p>When <code>[]</code> is used, it must produce a concrete type unless <code>_</code>/<code>...</code> is used
to unbind a specific/multiple missing parameters.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">SomeStruct</span><span class="token punctuation">[</span><span class="token plain">a </span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Error: can not infer `b`, since `[]` must produce a concrete type, without `_`/`...``</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> SS1 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># This is a concrete type alias of `SomeStruct[1, 1, 2]`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> SS2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Using `...` defers binding of b and c, and produces `SomeStruct[1, ?, ?]` (preserving possible defaults)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> SS3 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Even though SS3 unbinds `c`, Mojo keeps track of the fact that there is a default value for c:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># This install b (using 1) and c (using default value), and produce `SomeStruct[1, 1, 2]`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> SS4 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SS3</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># This installs the default and is identical to `SomeStruct[1, ?, 2]`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> SS5 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># This unbind the default explicitly and is identical to `SomeStruct[1, ?, ?]`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> SS6 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># The following two are equivalent:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> SS7 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> SS8 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">[</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
</li>
</ul>
</li>
<li class="">
<p>Mojo now supports more flexible default arguments and parameters, which can
mismatch on declared type when their types are parametric. This allows
inferring parameters from these when they are used as a default value, for
example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> take_string_slice</span><span class="token punctuation">[</span><span class="token plain">o</span><span class="token punctuation">:</span><span class="token plain"> ImmOrigin</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">:</span><span class="token plain"> StringSlice</span><span class="token punctuation">[</span><span class="token plain">o</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">""</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">use_it</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    take_string_slice</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Ok, defaults to empty string, inferring "o".</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Explicit calls also work of course.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    take_string_slice</span><span class="token punctuation">(</span><span class="token plain">StaticString</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"hello"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Default value is checked for validity at the call site.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> defaultArgumentBadType2</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> T </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1.0</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">callDefaultArgumentBadType2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token comment" style="color:#a89984"># Ok!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      defaultArgumentBadType2</span><span class="token punctuation">[</span><span class="token plain">Float64</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token comment" style="color:#a89984"># error: value passed to 'a' cannot be converted from 'FloatLiteral[1]' to 'Int'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      defaultArgumentBadType2</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now allows move constructors to take their "take" argument as either
<code>deinit</code> or <code>var</code>. <code>deinit</code> should be generally preferred, but <code>var</code> can be
useful in unusual cases where you want C++-like behavior where the destructor
still runs on the value after the move constructor is done with it.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> take</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">data </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> munge</span><span class="token punctuation">(</span><span class="token plain">take</span><span class="token punctuation">.</span><span class="token plain">data</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># take.__del__() runs here.</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-init-unification">Init unification<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-init-unification" class="hash-link" aria-label="Direct link to Init unification" title="Direct link to Init unification" translate="no">​</a></h3>
<ul>
<li class="">
<p>As part of "init unification", the <code>__moveinit__()</code> and <code>__copyinit__()</code>
methods
<a href="https://github.com/modular/modular/blob/main/mojo/proposals/remove_move_and_copy_init.md" target="_blank" rel="noopener noreferrer" class="">are now renamed</a>
to <code>fn __init__(out self, *, take: Self)</code> and
<code>fn __init__(out self, *, copy: Self)</code> respectively. Mojo now accepts these
names for initializers, but also supports the legacy <code>__moveinit__()</code> and
<code>__copyinit__()</code> names as well (for now). However, the argument name for these
legacy methods must now be named <code>take</code> and <code>copy</code> respectively. Please move
to the more modern <code>__init__</code> names when possible.</p>
</li>
<li class="">
<p>As part of init unification, the <code>__moveinit__is_trivial</code> and
<code>__copyinit__is_trivial</code> members of
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Movable/"><code>Movable</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Copyable/"><code>Copyable</code></a> have been
renamed
to <code>__move_ctor_is_trivial</code> and <code>__copy_ctor_is_trivial</code> respectively.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-language-deprecations">Deprecations<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-language-deprecations" class="hash-link" aria-label="Direct link to Deprecations" title="Direct link to Deprecations" translate="no">​</a></h3>
<ul>
<li class="">
<p><code>@register_passable("trivial")</code> is now deprecated. Conform to the
<code>TrivialRegisterPassable</code> trait instead. The decorator will be removed
after the next release.</p>
</li>
<li class="">
<p><code>@register_passable</code> is now deprecated. Conform to the <code>RegisterPassable</code>
trait instead. The decorator will be removed after the next release.</p>
</li>
<li class="">
<p><code>LegacyUnsafePointer</code> is now deprecated. Use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a>
instead.
Check the docstrings in <code>unsafe_pointer.mojo</code> for guidance on migration.
<code>LegacyUnsafePointer</code> will be removed after the next release.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-comptime-assert"><code>comptime assert</code><a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-comptime-assert" class="hash-link" aria-label="Direct link to 0-26-2-comptime-assert" title="Direct link to 0-26-2-comptime-assert" translate="no">​</a></h3>
<ul>
<li class="">
<p>Unstable <code>__comptime_assert</code> syntax is now finalized as <code>comptime assert</code>. A
deprecation warning is emitted with a fixit for the old syntax.</p>
</li>
<li class="">
<p><code>comptime assert</code> no longer errors on always-false conditions. The assertion
will only trigger if its parent scope is concretized.</p>
</li>
<li class="">
<p>A statically False <code>comptime assert</code> now ends a scope. Any code following it
in the same scope is now a warning, and can be removed.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-other-language-changes">Other changes<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-other-language-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h3>
<ul>
<li class="">
<p><code>**_</code> and <code>*_</code> are no longer supported in parameter binding lists. Use a more
concise <code>...</code> to unbind any unspecified parameter explicitly.</p>
</li>
<li class="">
<p>Homogeneous variadic parameters are now passed with the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicParamList/"><code>VariadicParamList</code></a>
type (formerly known as <code>VariadicList</code>) and arguments are
now consistently passed with
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicList/"><code>VariadicList</code></a>
(formerly <code>VariadicListMem</code>) instead
of trivial types being passed directly.</p>
</li>
<li class="">
<p>Slice literals in subscripts have changed to be more similar to collection
literals. They now pass an empty tuple as a required <code>__slice_literal__</code>
keyword argument to disambiguate slices. If you have defined your own range
types, please add a <code>__slice_literal__: () = ()</code> argument to their
constructors.</p>
</li>
<li class="">
<p><code>trait</code> declarations no longer automatically inherit from
<code>ImplicitlyDestructible</code>. <code>struct</code> declarations are not changed, and continue
to inherit from <code>ImplicitlyDestructible</code>.</p>
<p>Previously, the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/explicit-destroy/"><code>@explicit_destroy</code></a>
annotation was required to opt-out of
<code>ImplicitlyDestructible</code> conformance. Now, if a trait's usage depends on
implicit destructibility, it must opt-in explicitly:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Before</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> Foo</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> Foo</span><span class="token punctuation">(</span><span class="token plain">ImplicitlyDestructible</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>Conversely, if a trait wanted to support non-implicitly-destructible types,
it no longer needs to be annotated with <code>@explicit_destroy</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Before</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@explicit_destroy</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> Foo</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> Foo</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>Making <code>struct</code> continue to inherit from <code>ImplicitlyDestructible</code> and not
<code>trait</code> is intended to balance usability and familiarity in the common case,
with the need to foster broad Mojo ecosystem support for explicitly destroyed
types.</p>
<p>It's not a problem if the majority of <code>struct</code> types are
<code>ImplicitlyDestructible</code> in practice. However, if many ecosystem libraries are
written with unnecessary <code>ImplicitlyDestructible</code> bounds, that would hamper
the usability of any individual <code>struct</code> type that opts-in to being explicitly
destroyed.</p>
<p>Libraries with generic algorithms and types should be written to accommodate
linear types. Making <code>ImplicitlyDestructible</code> opt-in for traits
encourages a default stance of support, with specific types and functions
only opting-in to the narrower <code>ImplicitlyDestructible</code> requirement if they
truly need it.</p>
<p>The majority of generic algorithms that take their inputs by reference should
not be affected.</p>
</li>
<li class="">
<p>Re-exported symbols from a package's <code>__init__.mojo</code> are no longer shadowed
by a submodule of the same name. For example, if <code>pkg/foo.mojo</code> defines
<code>fn foo</code> and <code>pkg/__init__.mojo</code> does <code>from .foo import foo</code>, then
<code>from pkg import foo</code> and <code>from pkg import *</code> now correctly resolve to the
function rather than the module.</p>
</li>
<li class="">
<p><code>is_compile_time()</code> has been renamed to <code>__is_run_in_comptime_interpreter</code>,
which is now a keyword rather than a function call. It provides a mechanism
for supporting different code execution paths in the comptime interpreter
versus runtime-generated code. This value cannot be used as a constant in any
comptime expressions because it is always evaluated as <code>True</code> for comptime
expressions. Use the check as a condition for runtime <code>if</code>. The compiler now
warns if it is used as a condition for <code>comptime if</code>.</p>
</li>
<li class="">
<p>Mojo supports indexing with subscripts and names using the standard Python
<code>__getitem__()</code> and <code>__getattr__()</code> methods. Previously it used a heuristic to
determine whether a <code>__get*__</code> method was operated with dynamic or parameter
indexes. Mojo now has a simple and explicit policy: if a type implements a
<code>__getitem_param__()</code> or <code>__getattr_param__()</code> method and the indices are
valid parameter expressions, the compiler will pick it (but will not support a
<code>__setitem__()</code> pair). If not or if the indices are only valid runtime values,
Mojo will try <code>__getitem__()</code>/<code>__setitem__()</code> as usual. This makes the
behavior more predictable and explicit, but requires types to switch to the
<code>param</code> method names if they desire parameter-style subscripting. This only
affects a small number of special types like <code>Tuple</code> and <code>VariadicPack</code>.</p>
</li>
<li class="">
<p>The <code>@doc_private</code> decorator has been renamed to <code>@doc_hidden</code> to better
reflect its purpose of hiding declarations from documentation generation,
rather than implying any change in access control. The old <code>@doc_private</code> name
is still accepted but deprecated and will be removed in a future release.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-library-changes">Library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-library-changes" class="hash-link" aria-label="Direct link to Library changes" title="Direct link to Library changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-conditional-conformances">Conditional conformances<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-conditional-conformances" class="hash-link" aria-label="Direct link to Conditional conformances" title="Direct link to Conditional conformances" translate="no">​</a></h3>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a> now uses real
conditional conformances for <code>Writable</code>. The <code>Dict</code> type
only conforms to <code>Writable</code> when both its key and value types do, enforced at
compile time via <code>where</code> clauses.</p>
</li>
<li class="">
<p>Standard library types now use conditional conformances, replacing previous
<code>_constrained_conforms_to</code> checks:</p>
<ul>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/deque/Deque/"><code>Deque</code></a>:
<code>Equatable</code>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/hashlib/hash/Hashable/"><code>Hashable</code></a>, <code>Writable</code></li>
<li class=""><code>Dict</code>: <code>Writable</code>, <code>Equatable</code>, <code>Hashable</code></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlineArray</code></a>:
<code>Copyable</code>, <code>Equatable</code>, <code>Hashable</code>, <code>Writable</code></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/"><code>LinkedList</code></a>:
<code>Equatable</code>, <code>Hashable</code>, <code>Writable</code></li>
<li class=""><code>List</code>: <code>Equatable</code>, <code>Hashable</code>, <code>Writable</code></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a>:
<code>Hashable</code>, <code>Writable</code>, <code>Copyable</code>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/ImplicitlyCopyable/"><code>ImplicitlyCopyable</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a>: <code>Copyable</code>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/comparable/Comparable/"><code>Comparable</code></a>,
<code>Equatable</code>, <code>Hashable</code>, <code>Writable</code></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/tuple/Tuple/"><code>Tuple</code></a>: <code>Copyable</code>,
<code>Equatable</code>, <code>Hashable</code>, <code>ImplicitlyCopyable</code>, <code>Writable</code></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/variant/Variant/"><code>Variant</code></a>: <code>Writable</code></li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-collections">Collections and iterators<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-collections" class="hash-link" aria-label="Direct link to Collections and iterators" title="Direct link to Collections and iterators" translate="no">​</a></h3>
<ul>
<li class="">
<p><code>Dict</code> internals have been replaced with a Swiss Table implementation using
SIMD group probing for lookups. This improves lookup, insertion, and deletion
performance—especially when looking up keys not in the dict—while
increasing the load factor from 2/3 to 7/8 for better memory efficiency.
The <code>power_of_two_initial_capacity</code> keyword argument has been renamed to
<code>capacity</code> and now accepts any positive integer (it is rounded up to the
next power of two internally, minimum 16).</p>
</li>
<li class="">
<p><code>Dict</code> now performs in-place tombstone rehashing when the table is full of
tombstones but the live element count is low. This prevents unnecessary
capacity doubling after repeated insert/delete cycles.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/static_tuple/StaticTuple/"><code>StaticTuple</code></a> now supports
comparison operators. <code>__eq__()</code>/<code>__ne__()</code> are available when
<code>element_type: Equatable</code>, and <code>__lt__()</code>/<code>__le__()</code>/<code>__gt__()</code>/ <code>__ge__()</code>
are available when <code>element_type: Comparable</code>. All use lexicographic ordering
with compile-time unrolled loops.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/#pop"><code>Set.pop()</code></a> now uses
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#popitem"><code>Dict.popitem()</code></a>
directly, avoiding a redundant rehash.
Order changes from FIFO to LIFO, matching Python's unordered <code>set.pop()</code>.</p>
</li>
<li class="">
<p><code>Set.__gt__()</code> and <code>Set.__lt__()</code> now use an O(1) <code>len()</code> check plus a single
<code>issubset()</code> traversal instead of two full traversals.</p>
</li>
<li class="">
<p><code>InlineArray</code> now requires explicitly using literals for construction.
For example:</p>
<div class="language-Mojo language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"> InlineArray</span><span class="token punctuation">[</span><span class="token plain">UInt8</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># instead of InlineArray[UInt8, 4](1, 2, 3, 4)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The following types now correctly implement <code>write_repr_to()</code>:</p>
<ul>
<li class=""><code>List</code>, <code>Set</code></li>
</ul>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/itertools/"><code>itertools</code></a> module now includes
three new iterator combinators:</p>
<ul>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/itertools/itertools/cycle/"><code>cycle(iterable)</code></a>:
Creates an iterator that cycles through elements
indefinitely</li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/itertools/itertools/take_while/"><code>take_while[predicate](iterable)</code></a>:
Yields elements while the predicate returns True</li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/itertools/itertools/drop_while/"><code>drop_while[predicate](iterable)</code></a>:
Drops elements while the predicate returns True, then yields the rest</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-string">String and text<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-string" class="hash-link" aria-label="Direct link to String and text" title="Direct link to String and text" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <code>Stringable</code> and <code>Representable</code> traits are now deprecated. Use <code>Writable</code>
instead to make your types formattable as strings.
<code>Writable</code> provides a default implementation, so in many cases simply adding
<code>Writable</code> conformance is enough without manually implementing <code>write_to()</code>
or <code>write_repr_to()</code>, however, you can manually implement these to get custom
output.</p>
</li>
<li class="">
<p>The <code>stdlib</code> is beginning to remove support for the <code>Stringable</code>
and <code>Representable</code> traits in favor of the unified <code>Writable</code> trait.
Most stdlib types have had their conformance to <code>Stringable</code> and
<code>Representable</code> removed and the associated <code>__str__()</code>
and <code>__repr__()</code> methods have been deprecated.</p>
</li>
<li class="">
<p>The <code>__reversed__()</code> method on <code>String</code>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a>,
and <code>StringLiteral</code>
has been deprecated in favor of the new <code>codepoints_reversed()</code> method. The
new method name makes it explicit that iteration is over Unicode codepoints
in reverse order, maintaining consistency with the existing <code>codepoints()</code>
and <code>codepoint_slices()</code> methods. The deprecated <code>__reversed__()</code> methods
will continue to work but will emit deprecation warnings.</p>
</li>
<li class="">
<p>The <code>StringSlice</code> constructor from <code>String</code> now propagates mutability. If you
have a mutable reference to a <code>String</code>, <code>StringSlice(str)</code> returns a mutable
<code>StringSlice</code>. The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#as_string_slice"><code>String.as_string_slice()</code></a>
method is now deprecated in
favor of the <code>StringSlice(str)</code> constructor, and
<code>String.as_string_slice_mut()</code>
has been removed.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#ljust"><code>String.ljust()</code></a>,
<code>String.rjust()</code>, and <code>String.center()</code> have been renamed
to
<code>String.ascii_ljust()</code>, <code>String.ascii_rjust()</code>, and <code>String.ascii_center()</code>.
Likewise for their equivalents on <code>StringSlice</code> and <code>StaticString</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#resize"><code>String.resize()</code></a>
will now panic if the new length would truncate a
codepoint.
Previously it would result in a string with invalid UTF-8.</p>
</li>
<li class="">
<p><code>String.resize()</code> will now panic if <code>fill_byte</code> is &gt;=128. Previously it would
create invalid UTF-8.</p>
</li>
<li class="">
<p>Subscripting into <code>String</code> and <code>StringSlice</code> will now panic if the index falls
in the middle of a UTF-8 encoded codepoint. Previously they would
return invalid
UTF-8. This panic is unconditional. Use <code>.as_bytes()[...]</code> if you really want
the previous behavior.</p>
</li>
<li class="">
<p><code>StringSlice[byte=]</code> subscripting now returns a <code>StringSlice</code> instead of a
<code>String</code>. This is consistent with range-based subscripting.</p>
</li>
<li class="">
<p>Subscripting <code>String</code> and <code>StringSlice</code> by byte position will
now return an entire Unicode codepoint. Previously it would
return a single byte, and produce invalid UTF-8 if the index fell on
the starting byte of a multi-byte codepoint.</p>
</li>
<li class="">
<p><code>String</code>, <code>StringSlice</code>, and <code>StringLiteral</code>'s <code>.format()</code> method now require
their arguments to be <code>Writable</code>.</p>
</li>
<li class="">
<p><code>TString.write_to()</code> now uses a compact encoding for format
strings. The
format string is flattened at compile time into NUL-terminated literal
segments, producing considerably smaller static data and faster runtime than
the previous struct-based precompiled entries.</p>
</li>
<li class="">
<p>Formatting compile-time format strings (<code>StringLiteral</code>s) no longer allocates
memory. It uses <code>global_constant</code> to store what would be heap-allocated
parsed formatting data.</p>
</li>
<li class="">
<p>T-strings now support the raw prefix (<code>rt"..."</code>) which preserves backslashes
as literal characters while still supporting interpolation.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> name </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"Mojo"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">t</span><span class="token string" style="color:#477a5b">"C:\{name}\Documents"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># prints "C:\Mojo\Documents"</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Subscripting <code>String</code> and <code>StringSlice</code> now requires a named parameter for
range indexing. For example, <code>s[1:3]</code> is now <code>s[byte=1:3]</code>.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-type-system">Type system and traits<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-type-system" class="hash-link" aria-label="Direct link to Type system and traits" title="Direct link to Type system and traits" translate="no">​</a></h3>
<ul>
<li class="">
<p><code>Bool</code> no longer conforms to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Indexer/"><code>Indexer</code></a> trait. Previously,
<code>Bool</code> could be
used to index into collections (for example, <code>nums[True]</code>), which
is not desirable
behavior for a strongly-typed language. Use <code>Int(my_bool)</code> to explicitly
convert a <code>Bool</code> to an index.</p>
</li>
<li class="">
<p>The following types now conform to <code>Writable</code> and have custom implementations
of <code>write_to()</code> and <code>write_repr_to()</code>.</p>
<ul>
<li class=""><code>Tuple</code></li>
<li class=""><code>Variant</code></li>
<li class=""><code>Optional</code></li>
</ul>
</li>
<li class="">
<p>All traits and structs with the <code>@register_passable("trivial")</code> decorator now
extend the <code>TrivialRegisterPassable</code> trait. The decorator is removed
from them.</p>
</li>
<li class="">
<p>A new <code>utils/type_functions</code> module was added for holding type functions. Type
functions are <code>comptime</code> declarations that produce a type from compile-time
parameter inputs. Unlike regular <code>fn</code> functions which accept and
return runtime
values, type functions operate entirely at compile time—they take <code>comptime</code>
parameters and evaluate to a type, with no runtime component.</p>
<ul>
<li class=""><code>ConditionalType</code>—A type function that conditionally selects between two
types based on a compile-time boolean condition. It is the type-level
equivalent of the ternary conditional expression <code>Then if If else Else</code>.</li>
</ul>
</li>
<li class="">
<p><code>reflection/traits</code> has been added, providing compile-time meta functions
(<code>AllWritable</code>, <code>AllMovable</code>, <code>AllCopyable</code>, <code>AllImplicitlyCopyable</code>,
<code>AllDefaultable</code>, <code>AllEquatable</code>) that evaluate to <code>True</code> if all types in a
variadic type list conform to the corresponding trait.</p>
</li>
<li class="">
<p>Added the <code>UnsafeNicheable</code> and <code>UnsafeSingleNicheable</code> traits to
<code>std.utils</code>. These traits allow types to expose known-invalid bit patterns
("niches") that can be used by containers like <code>Optional</code> and
<code>Variant</code> to avoid
storing a separate tag, so that <code>size_of[Optional[T]]() == size_of[T]()</code>.
<code>UnsafeSingleNicheable</code> is a simplified subtrait for the common case where a
type has exactly one niche value.</p>
<ul>
<li class=""><code>Variant</code> and <code>Optional</code> now automatically take advantage of this: when the
variant types qualify, the discriminant tag is elided entirely, reducing the
size of the variant. For example, <code>size_of[Optional[T]]() == size_of[T]()</code>
for any <code>T</code> that implements <code>UnsafeNicheable</code>.</li>
<li class=""><code>Variant</code> also only works with <code>Movable</code> types in the interim instead of
<code>AnyType</code> due to some compiler limitations.</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-math">Math and numeric types<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-math" class="hash-link" aria-label="Direct link to Math and numeric types" title="Direct link to Math and numeric types" translate="no">​</a></h3>
<ul>
<li class="">
<p>Implicit conversions from <code>Int</code> to <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> are
now deprecated, and will be removed in a future version of Mojo. This includes
deprecating conversions from <code>Int</code> to specific <code>SIMD</code> scalar types like <code>Int8</code>
or <code>Float32</code>.</p>
<blockquote>
<p>Note: The experimental <code>mojo build --experimental-fixit</code> command may be
useful in assisting with migrating your code to reflect this change.</p>
</blockquote>
<p>Code currently relying on implicit conversions, for example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token plain">arg</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Float32</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> arg</span><br></div></code></pre></div></div>
<p>should be changed to use an explicit conversion:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token plain">arg</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Float32</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> Float32</span><span class="token punctuation">(</span><span class="token plain">arg</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Occasionally, when an implicit conversion was happening from a scalar <code>Int</code> to
a wider <code>SIMD</code> value, the compiler will suggest a change to make the
conversion explicit that is somewhat verbose, performing both the type
conversion and the "splat" in a single step:</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">var bits: SIMD[DType.uint8, 16] = ...</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">- var y = bits &gt;&gt; (j * 4)</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">+ var y = bits &gt;&gt; SIMD[DType.uint8, 16](j * 4)</span><br></div></code></pre></div></div>
<p>a simpler change is to make the type conversion explicit, and let the "splat"
continue to happen implicitly (which will remain supported):</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">var bits: SIMD[DType.uint8, 16] = ...</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">- var y = bits &gt;&gt; (j * 4)</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">+ var y = bits &gt;&gt; UInt8(j * 4)</span><br></div></code></pre></div></div>
<p>A similar overly verbose suggestion can be emitted relating to
<code>LayoutTensor.element_type</code>, where the compiler may suggest a change of the
form:</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">- tensor[i] = i * l</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">+ tensor[i] = LayoutTensor[DType.uint32, Layout(IntTuple(-1)), stack].element_type(i * l)</span><br></div></code></pre></div></div>
<p>where a simpler change is sufficient:</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">- tensor[i] = i * l</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">+ tensor[i] = UInt32(i * l)</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"># Note: If the tensor's `dtype` is not statically known, this works as well:</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">+ tensor[i] = Scalar[tensor.dtype](i * l)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>SIMD</code>'s safe division operators (<code>__floordiv__</code>, <code>__mod__</code>, <code>__divmod__</code>)
now return safe results in an elementwise fashion. They previously returned a
zero result if <em>any</em> element of the divisor was zero:</p>
<div class="language-Mojo language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> Int32x2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int32</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Int32x2</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">99</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">99</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> b </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Int32x2</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Now returns [24, 0]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Previously returned [0, 0]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">.</span><span class="token plain">__floordiv__</span><span class="token punctuation">(</span><span class="token plain">b</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Int/#__truediv__"><code>Int.__truediv__()</code></a>
now performs truncating integer division, returning <code>Int</code>
instead of the previously deprecated <code>Float64</code>. Use explicit <code>Float64</code> casts
for floating-point division.</p>
</li>
<li class="">
<p>Documentation for
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#__round__"><code>SIMD.__round__()</code></a>
now clarifies the pre-existing behavior
that ties are rounded to the nearest even, not away from zero.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Int/#write_padded"><code>Int.write_padded()</code></a>
now accounts for a negative sign when calculating the
width, resulting in a consistent width regardless of sign:</p>
<div class="language-Mojo language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">Int</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">write_padded</span><span class="token punctuation">(</span><span class="token plain">s</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># writes "   1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Int</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">-</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">write_padded</span><span class="token punctuation">(</span><span class="token plain">s</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># writes "  -1"</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>SIMD</code> now has a <code>write_padded()</code> method for integral
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/dtype/DType/"><code>DType</code></a>s, matching the
behavior of <code>Int.write_padded()</code>. The padding is added elementwise. Unlike
<code>SIMD</code> regular printing, there are no spaces added between elements by
default:</p>
<div class="language-Mojo language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">Int32</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">write_padded</span><span class="token punctuation">(</span><span class="token plain">s</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># writes "   1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Int32</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">-</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">write_padded</span><span class="token punctuation">(</span><span class="token plain">s</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># writes "  -1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># "[   1,  -1,   0,1234]"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int32</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token operator" style="color:#a89984">-</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">,</span><span class="token number" style="color:#924f79">1234</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">write_padded</span><span class="token punctuation">(</span><span class="token plain">s</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># "[255,255]"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">uint8</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">255</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">write_padded</span><span class="token punctuation">(</span><span class="token plain">s</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/comb/"><code>comb(n, k)</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/perm/"><code>perm(n, k)</code></a> to <code>std.math</code>,
matching Python's
<code>math.comb()</code> and <code>math.perm()</code>. <code>comb(n, k)</code> computes the binomial
coefficient C(n, k) without computing full factorials, returning 0 when
<code>k &gt; n</code>. <code>perm(n, k)</code> computes permutations P(n, k); omitting <code>k</code> (default
<code>-1</code>) returns <code>n!</code>.</p>
</li>
<li class="">
<p>The <code>builtin.math</code> module has been merged into
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/"><code>math</code></a>. The traits
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/Absable/"><code>Absable</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/DivModable/"><code>DivModable</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/Powable/"><code>Powable</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/Roundable/"><code>Roundable</code></a> and functions
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/abs/"><code>abs()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/divmod/"><code>divmod()</code></a>, <code>max()</code>,
<code>min()</code>, <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/pow/"><code>pow()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/round/"><code>round()</code></a> are now part of the
<code>math</code> module and
continue to be available in the prelude. Code that explicitly imported from
<code>builtin.math</code> should update to import from <code>math</code> instead.</p>
</li>
<li class="">
<p>Math functions in <code>std.math</code> (<code>exp()</code>, <code>exp2()</code>, <code>log2()</code>, <code>erf()</code>, <code>tanh()</code>,
<code>sin()</code>, <code>cos()</code>, <code>tan()</code>, <code>acos()</code>, <code>asin()</code>, <code>atan()</code>, <code>atan2()</code>,
<code>acosh()</code>, <code>asinh()</code>, <code>atanh()</code>, <code>cosh()</code>, <code>sinh()</code>, <code>expm1()</code>, <code>log10()</code>,
<code>log1p()</code>, <code>logb()</code>, <code>cbrt()</code>, <code>erfc()</code>, <code>j0()</code>, <code>j1()</code>, <code>y0()</code>, <code>y1()</code>)
now use <code>where dtype.is_floating_point()</code> clauses on their
signatures instead of <code>__comptime_assert</code> checks in their bodies.
This provides better compile-time error messages at the call site. Callers
using these functions with generic <code>dtype</code> parameters may need to add
evidence proving (either a <code>where</code> clause or <code>__comptime_assert</code>) that their
type is floating point.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-memory">Pointer and memory<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-memory" class="hash-link" aria-label="Direct link to Pointer and memory" title="Direct link to Pointer and memory" translate="no">​</a></h3>
<ul>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/memory/uninit_move_n/"><code>uninit_move_n()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/memory/uninit_copy_n/"><code>uninit_copy_n()</code></a>,
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/memory/destroy_n/"><code>destroy_n()</code></a>
functions to the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/"><code>memory</code></a> module for
efficient bulk memory operations. These functions handle
moving, copying, and destroying multiple values in contiguous memory, with
automatic optimization for trivial types using <code>memcpy</code>. They encapsulate the
common pattern of checking <code>__move_ctor_is_trivial</code>, <code>__copy_ctor_is_trivial</code>,
or <code>__del__is_trivial</code> and selecting the appropriate implementation.
The <code>List</code>
collection now uses these functions internally for improved code clarity and
maintainability.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/type_aliases/Origin/"><code>Origin</code></a>
struct now takes the underlying MLIR origin as a parameter
instead of storing it. This follows the design of <code>IntLiteral</code> and related
types, and fixes some memory safety problems.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_maybe_uninit/UnsafeMaybeUninit/"><code>UnsafeMaybeUninit</code></a>
has been renamed as such, and its methods have had their
names updated to reflect the <code>init</code> name. It also now exposes a
<code>zeroed()</code> method
to get zeroed out uninitialized memory. It also no longer calls <code>abort()</code> when
being copied or moved, allowing for more practical uses.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a><code>[T]</code> is no longer
restricted to <code>Copyable</code> types. It now works with
<code>T: AnyType</code>.
There are a few restrictions including iteration requiring <code>T: Copyable</code>.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-gpu">GPU programming<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-gpu" class="hash-link" aria-label="Direct link to GPU programming" title="Direct link to GPU programming" translate="no">​</a></h3>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/primitives/warp/lane_group_sum/"><code>lane_group_sum()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/primitives/warp/lane_group_max/"><code>lane_group_max()</code></a>,
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/primitives/warp/lane_group_min/"><code>lane_group_min()</code></a>
in
<code>std.gpu.primitives.warp</code> now always broadcast the reduction result to all
participating lanes, using optimized hardware-specific paths (AMD DPP,
Blackwell redux, or butterfly shuffle pattern). The previous
<code>lane_group_sum_and_broadcast()</code>, <code>lane_group_max_and_broadcast()</code> functions
are deprecated—use the short names instead.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/layout/tile_tensor/TileTensor/"><code>TileTensor</code></a> now supports
hierarchical indexing. For example, a <code>TileTensor</code> with shape <code>(4, (3, 2))</code>
can be indexed by <code>(1)</code>, <code>(1, 1)</code>, or <code>(1, (1, 1))</code>.</p>
</li>
<li class="">
<p><code>TileTensor</code> now supports flattening up to depth-4.</p>
</li>
<li class="">
<p>Many kernels in <code>nn</code> have been migrated to use <code>TileTensor</code>. We will have
more documentation on <code>TileTensor</code> and its uses over the coming weeks.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-ffi">FFI and system<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-ffi" class="hash-link" aria-label="Direct link to FFI and system" title="Direct link to FFI and system" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/ffi/"><code>ffi</code></a> module is now a top-level module
in the standard library, rather
than being nested under <code>sys</code>. This improves discoverability of FFI
functionality. Update your imports from <code>from sys.ffi import ...</code> to
<code>from ffi import ...</code>.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/ffi/unsafe_union/UnsafeUnion/"><code>UnsafeUnion</code></a><code>[*Ts]</code>,
a C-style untagged union type for FFI
interoperability. Unlike <code>Variant</code>, <code>UnsafeUnion</code> does not track which type
is stored (no discriminant), making it suitable for interfacing with C unions
and low-level type punning. The memory layout exactly matches C unions (size
is max of elements, alignment is max of elements).</p>
<p>All element types must have trivial copy, move, and destroy operations,
matching C union semantics where types don't have constructors or destructors.</p>
<p>Construction is explicit (no implicit conversion) to emphasize the unsafe
nature of this type. All accessor methods are prefixed with <code>unsafe_</code> to make
it clear that these operations are unsafe.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> ffi </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> UnsafeUnion</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Define a union that can hold Int32 or Float32</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> IntOrFloat </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> UnsafeUnion</span><span class="token punctuation">[</span><span class="token plain">Int32</span><span class="token punctuation">,</span><span class="token plain"> Float32</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> u </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> IntOrFloat</span><span class="token punctuation">(</span><span class="token plain">Int32</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">u</span><span class="token punctuation">.</span><span class="token plain">unsafe_get</span><span class="token punctuation">[</span><span class="token plain">Int32</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># =&gt; 42</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">u</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># =&gt; UnsafeUnion[Int32, Float32](size=4, align=4)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Type punning (reinterpreting bits)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> u2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> IntOrFloat</span><span class="token punctuation">(</span><span class="token plain">Float32</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1.0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">u2</span><span class="token punctuation">.</span><span class="token plain">unsafe_get</span><span class="token punctuation">[</span><span class="token plain">Int32</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># =&gt; 1065353216 (IEEE 754 bits)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>env_get_bool()</code>, <code>env_get_int()</code>, <code>env_get_string()</code>, and
<code>env_get_dtype()</code> functions in the <code>sys.param_env</code> module have been renamed to
<code>get_defined_bool()</code>, <code>get_defined_int()</code>, <code>get_defined_string()</code>, and
<code>get_defined_dtype()</code> in the new <code>sys.defines</code> module. The
new names better reflect that these functions read
compile-time defines (set via <code>-D</code>), not runtime environment
variables. The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/defines/is_defined/"><code>is_defined()</code></a> function
has also moved to
<code>sys.defines</code> without renaming. The old names in <code>sys.param_env</code> are
deprecated but still available.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-testing">Testing<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-testing" class="hash-link" aria-label="Direct link to Testing" title="Direct link to Testing" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/"><code>testing</code></a> module now provides
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/testing/assert_equal/"><code>assert_equal</code></a>
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/testing/assert_not_equal/"><code>assert_not_equal</code></a>
overloads for <code>Tuple</code>, enabling direct tuple-to-tuple comparisons in tests
instead of element-by-element assertions. Element types must conform to
<code>Equatable &amp; Writable</code>.</p>
</li>
<li class="">
<p><code>assert_equal</code> and <code>assert_not_equal</code> now work with types implementing
<code>Writable</code>.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-other-library">Other library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-other-library" class="hash-link" aria-label="Direct link to Other library changes" title="Direct link to Other library changes" translate="no">​</a></h3>
<ul>
<li class="">
<p>Changed
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/info/CompilationTarget/#unsupported_target_error"><code>CompilationTarget.unsupported_target_error()</code></a>
to return <code>Never</code>
and
removed its <code>result</code> type parameter.</p>
</li>
<li class="">
<p>Removed <code>DType.get_dtype[T]()</code> and <code>DType.is_scalar[T]()</code>. These
were low-level
operations for extracting the <code>DType</code> of a <code>SIMD</code> in generic code. There are
better alternatives available in Mojo today using reflection capabilities.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/time/time/perf_counter_ns/"><code>perf_counter_ns()</code></a> now returns
correct nanoseconds on GPU instead of raw cycle counts. Previously on NVIDIA
GPUs it used <code>clock64</code> (a cycle counter dependent on GPU core clock
frequency); it now uses <code>globaltimer</code> which provides actual nanosecond
resolution. On AMD GPUs, it now uses <code>s_memrealtime</code> (a constant-speed
real-time clock) instead of <code>s_memtime</code> (a cycle counter).</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/kernels/buffer/dimlist/DimList/"><code>DimList</code></a> type has moved to
representing its dimensions as parameters to the type instead of values inside
the type, directly reflecting that the dimensions are known at compile time.
Change <code>DimList(x, y)</code> to <code>DimList[x, y]()</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The Mojo compiler now accepts conjoined <code>-D</code> options in addition to the
non-conjoined form as before. Now, both <code>-Dfoo</code> and <code>-D foo</code> are accepted.</p>
</li>
<li class="">
<p><code>mojo build</code> now supports several <code>--print-*</code> options for discovering target
configuration and supported architectures:</p>
<ul>
<li class=""><code>--print-effective-target</code>: Shows the resolved target configuration after
processing all command-line flags.</li>
<li class=""><code>--print-supported-targets</code>: Lists all available LLVM target architectures.</li>
<li class=""><code>--print-supported-cpus</code>: Lists valid CPU names for a given target triple
(requires <code>--target-triple</code>).</li>
<li class=""><code>--print-supported-accelerators</code>: Lists all supported GPU and accelerator
architectures (NVIDIA, AMD, Apple Metal).</li>
</ul>
</li>
<li class="">
<p><code>mojo format</code> now only formats Mojo files (<code>.mojo</code>, <code>.🔥</code>) by default when
run on a directory. Previously it would also format Python files, which
conflicted with Python-specific formatters in pre-commit hooks. Users who
want to format Python files can use <code>mblack</code> directly.</p>
</li>
<li class="">
<p><code>mojo format</code> now supports <code>--print-cache-dir</code> (hidden, use <code>--help-hidden</code>
to see it) to display the path to the formatter cache directory.</p>
</li>
<li class="">
<p><code>mojo build --emit=asm</code> now also emits GPU kernel assembly files alongside
the host <code>.s</code> output. For NVIDIA targets, PTX is written as
<code>&lt;out&gt;_&lt;kernelfn&gt;.ptx</code>; for Apple Metal targets, LLVM IR is written as
<code>&lt;out&gt;_&lt;kernelfn&gt;.ll</code>; for AMD targets, <code>.amdgcn</code> files are written.
Multiple kernels generated from the same function are disambiguated with a
numeric suffix (for example, <code>&lt;out&gt;_&lt;kernelfn&gt;_1.ptx</code>).</p>
</li>
<li class="">
<p><code>mojo doc</code> is now more consistent with Python in its treatment of private
members. Any member name starting with an underscore (<code>_</code>) is treated as
private unless it is a "dunder" member (starting and ending with
double-underscores). In practice this means that members that start but don't
end with double underscores (<code>__example()</code>) are now treated as private. Dunder
methods that start with <code>__mlir</code> are now treated as public unless marked with
the <code>@doc_private</code> decorator.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p>The <code>.🔥</code> (flame) and <code>📦</code> (package) emoji file extensions are no longer
supported. Use <code>.mojo</code> for all Mojo source files and <code>__init__.mojo</code> for
package initialization files. The emoji extensions were removed
to simplify the tooling and improve compatibility across different
systems and editors.</p>
</li>
<li class="">
<p>The <code>owned</code> keyword has been removed. Use <code>var</code> for parameters or <code>deinit</code>
for <code>__moveinit__</code>/<code>__del__</code> arguments as appropriate.</p>
</li>
<li class="">
<p><code>Dict.EMPTY</code> and <code>Dict.REMOVED</code> comptime aliases have been removed. These
were internal implementation details of the old hash table design.</p>
</li>
<li class="">
<p>The <code>@nonmaterializable</code> decorator has been renamed to <code>@__nonmaterializable</code>.
This decorator should not be used outside the standard library, and might be
removed in a future release.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p>Fixed a bug where Mojo incorrectly passed or returned structs in <code>extern</code> C
function calls. The compiler now applies platform ABI coercion (System V
AMD64 on x86-64, AAPCS on ARM64) when lowering external calls, decomposing
structs into the register types the C ABI requires—matching the behavior of
Clang and Rust. This resolves silent wrong-answer bugs when calling C
functions that take or return struct types.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5845" target="_blank" rel="noopener noreferrer" class="">Issue #5845</a>: Functions
raising custom type with conversion fails when returning StringSlice</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5722" target="_blank" rel="noopener noreferrer" class="">Issue #5722</a>: <code>__del__</code>
incorrectly runs when <code>__init__</code> raises before all fields are initialized.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5875" target="_blank" rel="noopener noreferrer" class="">Issue #5875</a>: Storing
<code>SIMD[DType.bool, N]</code> with width &gt; 1 to a pointer and reading back
element-wise now returns correct values.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#find"><code>StringSlice.find</code></a>:
Fixed integer overflow bug in SIMD string search that caused searches to fail
when searching for strings longer than <code>simd_width_of[DType.bool]()</code> and
haystacks larger than UInt16.MAX.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/#reverse"><code>LinkedList.reverse()</code></a>:
Fixed missing <code>prev</code> pointer updates, which caused <code>__reversed__()</code> to produce
wrong results after reversing.</p>
</li>
<li class="">
<p>Mojo would previously consider types <code>Movable</code> if they had a <code>__moveinit__()</code>
method, even if they didn't conform to <code>Movable</code>. Movability is now tied to
the conformance which implies the method.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-26-2-special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.26.2/#0-26-2-special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h3>
<p>Special thanks to our community contributors:</p>
<p>Amit Vijairania (<a href="https://github.com/avijaira" target="_blank" rel="noopener noreferrer" class="">@avijaira</a>),
Bernardo Taveira (<a href="https://github.com/bertaveira" target="_blank" rel="noopener noreferrer" class="">@bertaveira</a>),
Brian Carroll (<a href="https://github.com/brian-carroll" target="_blank" rel="noopener noreferrer" class="">@brian-carroll</a>),
Brian Grenier (<a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>),
Byungchul Chae (<a href="https://github.com/byungchul-sqzb" target="_blank" rel="noopener noreferrer" class="">@byungchul-sqzb</a>),
Derek Veit (<a href="https://github.com/DerekVeit" target="_blank" rel="noopener noreferrer" class="">@DerekVeit</a>),
Dylan Walker Brown (<a href="https://github.com/walkerbrown" target="_blank" rel="noopener noreferrer" class="">@walkerbrown</a>),
elpres (<a href="https://github.com/elpres" target="_blank" rel="noopener noreferrer" class="">@elpres</a>),
Evan Owen (<a href="https://github.com/ulmentflam" target="_blank" rel="noopener noreferrer" class="">@ulmentflam</a>),
Joseph Wakeling (<a href="https://github.com/JosephWakeling" target="_blank" rel="noopener noreferrer" class="">@JosephWakeling</a>),
josiahls (<a href="https://github.com/josiahls" target="_blank" rel="noopener noreferrer" class="">@josiahls</a>),
Krish Gupta (<a href="https://github.com/KrxGu" target="_blank" rel="noopener noreferrer" class="">@KrxGu</a>),
lamija-i (<a href="https://github.com/lamija-i" target="_blank" rel="noopener noreferrer" class="">@lamija-i</a>),
Mahendra Singh Rathore
(<a href="https://github.com/mahendrarathore1742" target="_blank" rel="noopener noreferrer" class="">@mahendrarathore1742</a>),
Manuel Saelices (<a href="https://github.com/msaelices" target="_blank" rel="noopener noreferrer" class="">@msaelices</a>),
martinvuyk (<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>),
minkyu (<a href="https://github.com/kkimmk" target="_blank" rel="noopener noreferrer" class="">@kkimmk</a>),
nejraberberovic
(<a href="https://github.com/nejraberberovic" target="_blank" rel="noopener noreferrer" class="">@nejraberberovic</a>),
Parsa Bahraminejad
(<a href="https://github.com/prsabahrami" target="_blank" rel="noopener noreferrer" class="">@prsabahrami</a>),
pei0033 (<a href="https://github.com/pei0033" target="_blank" rel="noopener noreferrer" class="">@pei0033</a>),
Sören Brunk (<a href="https://github.com/sbrunk" target="_blank" rel="noopener noreferrer" class="">@sbrunk</a>),
Taesu Kim (<a href="https://github.com/tae-su-kim" target="_blank" rel="noopener noreferrer" class="">@tae-su-kim</a>),
Tolga Cangöz (<a href="https://github.com/tolgacangoz" target="_blank" rel="noopener noreferrer" class="">@tolgacangoz</a>),
turakz (<a href="https://github.com/turakz" target="_blank" rel="noopener noreferrer" class="">@turakz</a>)</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v0.26.1]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.26.1/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.26.1/"/>
        <updated>2026-01-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Expanded reflection module.</strong> The <code>reflection</code> module now provides extensive
compile-time introspection: struct field enumeration, types, and byte offsets;
source location tracking; and trait conformance checking on dynamically
obtained types. These APIs enable advanced metaprogramming patterns like
automatic serialization and debug formatting. See <a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-reflection" class="">Reflection and
introspection</a>.</p>
</li>
<li class="">
<p><strong>Explicitly-destroyed types.</strong> Mojo now has first-class support for
explicitly-destroyed types (sometimes referred to as "linear types"). The
<code>AnyType</code>, <code>Movable</code>, and <code>Copyable</code> traits no longer require a <code>__del__()</code>
method; use <code>ImplicitlyDestructible</code> when you need implicit destruction.
Explicitly-destroyed types let you encode powerful invariants requiring
explicit resource handling. See <a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-language-changes" class="">Language changes</a> and
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-explicitly-destroyed-types" class="">Explicitly-destroyed types</a>.</p>
</li>
<li class="">
<p><strong>Typed errors.</strong> Functions can now specify what type they raise instead of
defaulting to <code>Error</code> (for example, <code>fn foo() raises CustomError -&gt; Int</code>).
Typed errors are highly efficient—they compile to an alternate return value
with no stack unwinding—making them suitable for GPU and embedded targets.
See <a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-language-enhancements" class="">Language enhancements</a>.</p>
</li>
<li class="">
<p><strong>Traits with default implementations.</strong> The <code>Hashable</code>, <code>Writable</code>, and
<code>Equatable</code> traits now provide default implementations that automatically
derive behavior from struct fields using reflection. Simple structs can
conform to these traits without writing any boilerplate—just ensure all fields
conform to the same trait. See <a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-trait-defaults" class="">Traits with default
implementations</a>.</p>
</li>
<li class="">
<p><strong><code>UInt</code> type redesign.</strong> The <code>UInt</code> struct has been replaced by a type alias
to <code>Scalar[DType.uint]</code>, enabling more powerful generic programming over
unsigned SIMD data types of machine word size. See <a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-other-library" class="">Other library
changes</a>.</p>
</li>
<li class="">
<p><strong>String UTF-8 safety.</strong> <code>String</code> now offers three explicit constructors for
raw bytes: <code>from_utf8=</code> (validates and raises on error), <code>from_utf8_lossy=</code>
(replaces invalid sequences with �), and <code>unsafe_from_utf8=</code> (no validation).
This makes UTF-8 handling guarantees explicit at construction time. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-string-and-text" class="">String and text</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-documentation">Documentation<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class="">
<p>The new <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/quickstart/">Mojo quickstart</a> page provides a "5-minute"
introduction to installing Mojo and exploring basic language features.</p>
</li>
<li class="">
<p>The new <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/reflection/">Reflection</a> page
describes Mojo's new compile-time reflection capabilities, including
example use cases.</p>
</li>
<li class="">
<p>Added a section to the <em>Value destruction</em> page about how to implement
and use <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/lifecycle/death/#explicitly-destroyed-types">explicitly-destroyed
types</a>.</p>
</li>
<li class="">
<p>The new <a class="" href="https://mojolang.static.modular-staging.com/docs/tools/notebooks/">Jupyter Notebooks</a> page provides
step-by-step instructions for programming with Mojo in Google Colab and
local JupyterLab environments, including GPU programming examples.</p>
</li>
<li class="">
<p>The new <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/metaprogramming/materialization/">Materialization</a> page
describes how to make compile-time values available at run time.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-language-enhancements">Language enhancements<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-language-enhancements" class="hash-link" aria-label="Direct link to Language enhancements" title="Direct link to Language enhancements" translate="no">​</a></h2>
<ul>
<li class="">
<p>Mojo now supports raising "typed errors", where a function can specify what
type it raises instead of defaulting to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/error/Error/"><code>Error</code></a> type. This is done by specifying it
after the <code>raises</code> keyword, for example, <code>fn foo() raises CustomError -&gt; Int</code>.</p>
<p>Raised errors in Mojo are very efficient - they work as an alternate return
value: for example, a function like <code>fn () raises Int -&gt; Float32:</code> compiles
into code that returns either an <code>Int</code> or a <code>Float32</code> and uses an implicit
boolean result to determine which one is valid - there is no expensive stack
unwinding or slow dynamic logic that is implied. This means that thrown errors
work fine on GPUs and other embedded targets.</p>
<p>The 'caught' type in a <code>try</code> block is automatically inferred to be the first
thrown type inside of the <code>try</code> body, for example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">try</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">except</span><span class="token plain"> err</span><span class="token punctuation">:</span><span class="token plain">       </span><span class="token comment" style="color:#a89984"># "err" is typed as CustomError</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">err</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Typed throws "just work" with generics, allowing the definition of higher
order functions like:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> parametric_raise_example</span><span class="token punctuation">[</span><span class="token plain">ErrorType</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">fp</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises ErrorType</span><span class="token punctuation">)</span><span class="token plain"> raises ErrorType</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># ... presumably some iteration or other exciting stuff happening here.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    fp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>This dovetails with other support to allow contextually generic thrown types,
for example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> call_parametric_raise_example</span><span class="token punctuation">[</span><span class="token plain">GenTy</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">func_ptr</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises GenTy</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">raise_int</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises Int</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">try</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      parametric_raise_example</span><span class="token punctuation">(</span><span class="token plain">raise_int</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">except</span><span class="token plain"> err_int</span><span class="token punctuation">:</span><span class="token plain">   </span><span class="token comment" style="color:#a89984"># Typed as Int</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> err_int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">raise_string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises String</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">try</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    parametric_raise_example</span><span class="token punctuation">(</span><span class="token plain">raise_string</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">except</span><span class="token plain"> err_string</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Typed as String</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> s</span><span class="token punctuation">:</span><span class="token plain"> String </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> err_string</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">try</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    parametric_raise_example</span><span class="token punctuation">(</span><span class="token plain">func_ptr</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">except</span><span class="token plain"> err_gen</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Typed as GenTy</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> s</span><span class="token punctuation">:</span><span class="token plain"> GenTy </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> err_gen</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Non-raising functions infer an error type of `Never`, allowing these</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># functions to propagate non-raisability across generic higher-order</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># functions conveniently.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">doesnt_raise</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Note this isn't in a try block. Mojo knows 'parametric_raise_example'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># doesn't raise because the 'doesnt_raise' function doesn't.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  parametric_raise_example</span><span class="token punctuation">(</span><span class="token plain">doesnt_raise</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>As part of this, context managers have been extended to support typed throws,
and can also infer an error type if they need to handle it, for example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">MyGenericExitCtxtMgr</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Called on entry to the with block.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__enter__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Called on exit from the with block when no error is thrown.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__exit__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Called on exit from the with block if an error is thrown.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> __exit__</span><span class="token punctuation">[</span><span class="token plain">ErrType</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> err</span><span class="token punctuation">:</span><span class="token plain"> ErrType</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Bool</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now supports a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/type_aliases/#never"><code>Never</code></a> type,
which can never be instantiated. This type can be used for functions (like
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/abort/"><code>abort()</code></a>) which do not have a
normal return value, and for functions that are guaranteed to raise without
returning a normal value. Functions that are declared to raise <code>Never</code> (and
generic functions instantiated with <code>Never</code> as their error type) compile into
the same ABI as functions that don't <code>raise</code>.</p>
</li>
<li class="">
<p>Mojo now allows the use of a <code>comptime(x)</code> expression to force a subexpression
to be evaluated at compile time. This can help make working with certain
types more elegant when you can't (or don't want to) materialize them into a
runtime value. For example, if you just want the size from a compile time
layout:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> takes_layout</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Layout</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># materializes entire layout value just to get the size out of it</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">.</span><span class="token plain">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Could already work around this with a comptime declaration, verbosely.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> a_size </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> a</span><span class="token punctuation">.</span><span class="token plain">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">a_size</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Can now tell Mojo to evaluate the expression at comptime.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">comptime</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">.</span><span class="token plain">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now differentiates between <code>...</code> and <code>pass</code> in trait methods. The use of
<code>...</code> continues to denote no default implementation—<code>pass</code> now specifies a
default do-nothing implementation. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> T</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># No default implementation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Default implementation that does nothing</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bar</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><br></div></code></pre></div></div>
<p>The compiler will error on the use of <code>pass</code> to define a default
implementation for a trait method with results:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> T</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    foo</span><span class="token punctuation">.</span><span class="token plain">mojo</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">26</span><span class="token punctuation">:</span><span class="token plain"> error</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> method has results but default implementation returns no value</span><span class="token punctuation">;</span><span class="token plain"> did you mean </span><span class="token string" style="color:#477a5b">'...'</span><span class="token plain">?</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">                         </span><span class="token operator" style="color:#a89984">^</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">trait</span><span class="token punctuation">.</span><span class="token plain">mojo</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">:</span><span class="token plain"> note</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">'foo'</span><span class="token punctuation">,</span><span class="token plain"> declared here</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">       </span><span class="token operator" style="color:#a89984">^</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now allows implicit conversions between function types from a non-raising
function to a raising function. It also allows implicit conversions between
function types whose result types are implicitly convertible.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">takes_raising_float</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> raises </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Float32</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">returns_int</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">example</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># This is now ok.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    takes_raising_float</span><span class="token punctuation">(</span><span class="token plain">returns_int</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now allows functions that return references to convert to functions that
return values if the type is implicitly copyable or implicitly convertible to
the destination type:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">fn_returns_ref</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> SomeType</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain">x</span><span class="token punctuation">.</span><span class="token plain">field</span><span class="token punctuation">]</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">examples</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># OK, Int result from fn_returns_ref can be implicitly copied.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> f1 </span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> SomeType</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> fn_returns_ref</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># OK, Int result from fn_returns_ref implicitly converts to Float64.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> f2 </span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> SomeType</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Float64 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> fn_returns_ref</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Context managers (used in <code>with</code> statements) can now define consuming exit
methods—that is, <code>fn __exit__(var self)</code>—which can be useful for
explicitly-destroyed context managers. This also works with <code>deinit</code>.</p>
</li>
<li class="">
<p>The <code>deinit</code> argument convention can now be applied to any argument of a
struct method, but the argument type still must be of the enclosing struct
type.</p>
</li>
<li class="">
<p>Mojo now supports the <code>...</code> expression. It is a logically empty value of
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/type_aliases/#ellipsistype"><code>EllipsisType</code></a>. It can be used
in overloaded functions, for example, <code>getitem()</code> calls:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">YourType</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__getitem__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> idx</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># ... behavior when passed x[i]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__getitem__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> idx</span><span class="token punctuation">:</span><span class="token plain"> EllipsisType</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># ... behavior when passed x[...]</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The Mojo language basic trait hierarchy has changed to expand first-class
support for explicitly-destroyed types (sometimes referred to as "linear
types").</p>
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/anytype/AnyType/"><code>AnyType</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Movable/"><code>Movable</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Copyable/"><code>Copyable</code></a> traits no longer require that a
type provide a <code>__del__()</code> method that may be called by the compiler
implicitly whenever an owned value is unused. Instead, the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/anytype/ImplicitlyDestructible/"><code>ImplicitlyDestructible</code></a>
trait should be used in generic code to require that a type is implicitly
destructible.</p>
<p>Explicitly-destroyed types enable Mojo programs to encode powerful invariants
in the type system, by modeling a type in such a way that a user is required
to take an action "in the future", rather than simply implicitly dropping an
instance "on the floor".</p>
<p>Code using <code>T: AnyType</code> can change to use <code>T: ImplicitlyDestructible</code> to
preserve its pre-existing behavior following this change.</p>
<p>Relatedly, the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/anytype/#unknowndestructibility"><code>UnknownDestructibility</code></a>
trait is now no longer required, as it is equivalent to the new <code>AnyType</code>
behavior.</p>
</li>
<li class="">
<p>Mojo no longer supports overloading functions on parameters alone: it will not
try to disambiguate between <code>fn foo[a: Int8]():</code> and <code>fn foo[a: Int32]():</code> for
example. Mojo never fully implemented the previous support in a reliable way,
and removing this simplifies the language. It still supports overloading on
function arguments of course.</p>
</li>
<li class="">
<p>The <code>__next_ref__()</code> method in for-each loops has been removed. Now you can
implement the <code>__next__()</code> method of your iterator to return either a value
or a reference. When directly using the collection, Mojo will use the
ref-returning variant, but will allow it to conform to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/Iterator/"><code>Iterator</code></a> for use with generic algorithms (which
use a copied value).</p>
</li>
<li class="">
<p>The <code>origin_of(x)</code> operator now returns a value of type <code>Origin</code> instead of an
internal MLIR type, and aliases like <code>ImmutOrigin</code> are now <code>Origin</code> type as
well.</p>
</li>
<li class="">
<p>The <code>Origin.cast_from[x]</code> syntax has been replaced with a safe implicit
conversion from any origin to an immutable origin (<code>ImmutOrigin(x)</code>) and an
explicit unsafe conversion (<code>unsafe_origin_mutcast[origin, mut=m]</code>).</p>
</li>
<li class="">
<p>The <code>*_</code> and <code>**_</code> syntax for explicitly unpacked parameters has been replaced
with a simplified <code>...</code> syntax. Instead of <code>T[4, 5, *_, **_]</code> you can now use
<code>T[4, 5, ...]</code>. The <code>...</code> delays binding of both keyword and non-keyword
parameters.</p>
</li>
<li class="">
<p>The compiler will now warn on the use of <code>alias</code> keyword and suggest
<code>comptime</code> instead.</p>
</li>
<li class="">
<p>The compiler will now warn on unqualified access to struct parameters, for
example</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@fieldwise_init</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">MyStuff</span><span class="token punctuation">[</span><span class="token plain">my_param</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">give_me_stuff</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token comment" style="color:#a89984"># Warning: unqualified access to struct parameter 'my_param'; use 'Self.my_param' instead</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> my_param</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The Mojo compiler generates more clear error messages when diagnosing invalid
calls: it mentions the argument name, instead of "argument #4".</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-library-changes">Library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-library-changes" class="hash-link" aria-label="Direct link to Library changes" title="Direct link to Library changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-reflection">Reflection and introspection<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-reflection" class="hash-link" aria-label="Direct link to Reflection and introspection" title="Direct link to Reflection and introspection" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/reflection/"><code>reflection</code></a> module has been significantly
expanded with new compile-time introspection capabilities. The module has
moved from <code>compile.reflection</code> to a top-level <code>reflection</code> module (update
imports from
<code>from compile.reflection import ...</code> to <code>from reflection import ...</code>).
Internally, the module is now organized into <code>type_info</code> and <code>struct_fields</code>
submodules, though the public API via <code>from reflection import ...</code> remains
unchanged.</p>
<p><strong>Struct field introspection</strong> - New APIs for compile-time struct analysis:</p>
<ul>
<li class=""><code>struct_field_count[T]()</code> - Returns the number of fields in a struct</li>
<li class=""><code>struct_field_names[T]()</code> - Returns field names as
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlineArray</code></a>
<code>[StaticString, N]</code></li>
<li class=""><code>struct_field_types[T]()</code> - Returns a variadic of all field types</li>
<li class=""><code>struct_field_index_by_name[T, name]()</code> - Returns field index by name</li>
<li class=""><code>struct_field_type_by_name[T, name]()</code> - Returns field type wrapped in
<code>ReflectedType</code></li>
</ul>
<p>These APIs work with both concrete types and generic type parameters:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> print_fields</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> names </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> struct_field_names</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> types </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> struct_field_types</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token plain">struct_field_count</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">names</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"> get_type_name</span><span class="token punctuation">[</span><span class="token plain">types</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p><strong>Field access by index</strong> - Two new magic functions enable index-based field
access without copying:</p>
<ul>
<li class=""><code>__struct_field_type_at_index(T, idx)</code> - Returns field type at index</li>
<li class=""><code>__struct_field_ref(idx, ref s)</code> - Returns a reference to the field</li>
</ul>
<p>Unlike <code>kgen.struct.extract</code> which copies, <code>__struct_field_ref()</code> returns a
reference, enabling reflection utilities to work with non-copyable types:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> print_all_fields</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> s</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> names </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> struct_field_names</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token plain">struct_field_count</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">names</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"="</span><span class="token punctuation">,</span><span class="token plain"> __struct_field_ref</span><span class="token punctuation">(</span><span class="token plain">i</span><span class="token punctuation">,</span><span class="token plain"> s</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p><strong>Field byte offsets</strong> - <code>offset_of[T, name=field_name]()</code> returns the byte
offset of a named field within a struct, enabling no-copy serialization and
other low-level memory operations. The offset is computed at compile time
using the target's data layout, correctly accounting for alignment padding.
This is analogous to C/C++'s <code>offsetof</code> and Rust's <code>offset_of!</code> macro. An
<code>offset_of[T, index=i]()</code> overload is also available to look up by field
index.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> reflection </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> offset_of</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Point</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int      </span><span class="token comment" style="color:#a89984"># offset 0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Float64  </span><span class="token comment" style="color:#a89984"># offset 8 (aligned)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> x_off </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> offset_of</span><span class="token punctuation">[</span><span class="token plain">Point</span><span class="token punctuation">,</span><span class="token plain"> name</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"x"</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># 0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> y_off </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> offset_of</span><span class="token punctuation">[</span><span class="token plain">Point</span><span class="token punctuation">,</span><span class="token plain"> name</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"y"</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># 8</span><br></div></code></pre></div></div>
<p><strong>Type introspection utilities:</strong></p>
<ul>
<li class="">
<p><code>is_struct_type[T]()</code> - Returns <code>True</code> if <code>T</code> is a Mojo struct type. Useful
for guarding reflection code that uses struct-specific APIs to avoid
compiler errors on non-struct types (for example, MLIR primitive types). Use
<code>@parameter if</code> since these APIs are evaluated at compile time.
(<a href="https://github.com/modular/modular/issues/5734" target="_blank" rel="noopener noreferrer" class="">Issue #5734</a>)</p>
</li>
<li class="">
<p><code>get_base_type_name[T]()</code> - Returns the unqualified name of a parameterized
type's base type. For example, <code>get_base_type_name[List[Int]]()</code> returns
<code>"List"</code>. Useful for identifying collection types regardless of element
types. (<a href="https://github.com/modular/modular/issues/5735" target="_blank" rel="noopener noreferrer" class="">Issue #5735</a>)</p>
</li>
</ul>
<p><strong>Source location introspection:</strong></p>
<ul>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/reflection/location/SourceLocation/"><code>SourceLocation</code></a> - A struct
holding filename, line, and column information</li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/reflection/location/source_location/"><code>source_location()</code></a> -
Returns the location where it's called</li>
<li class=""><code>call_location()</code> - Returns the location where the caller was invoked
(requires the caller to be <code>@always_inline</code>)</li>
</ul>
<p>These were previously internal APIs (<code>_SourceLocation</code>, <code>__source_location</code>,
<code>__call_location</code>) in <code>builtin._location</code>. The old module has been removed.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> reflection </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> source_location</span><span class="token punctuation">,</span><span class="token plain"> call_location</span><span class="token punctuation">,</span><span class="token plain"> SourceLocation</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> loc </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> source_location</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">loc</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># main.mojo:5:15</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@always_inline</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">log_here</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> caller_loc </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> call_location</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Called from:"</span><span class="token punctuation">,</span><span class="token plain"> caller_loc</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Note: These APIs do not work correctly in parameter expressions (comptime
contexts return placeholder values).</p>
<p><strong>Trait conformance checking</strong> - The <code>conforms_to()</code> builtin now accepts types
from reflection APIs like <code>struct_field_types[T]()</code>, enabling conformance
checks on dynamically obtained field types:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token plain">struct_field_count</span><span class="token punctuation">[</span><span class="token plain">MyStruct</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> field_type </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> struct_field_types</span><span class="token punctuation">[</span><span class="token plain">MyStruct</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> conforms_to</span><span class="token punctuation">(</span><span class="token plain">field_type</span><span class="token punctuation">,</span><span class="token plain"> Copyable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Field"</span><span class="token punctuation">,</span><span class="token plain"> i</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"is Copyable"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-trait-defaults">Traits with default implementations<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-trait-defaults" class="hash-link" aria-label="Direct link to Traits with default implementations" title="Direct link to Traits with default implementations" translate="no">​</a></h3>
<ul>
<li class="">
<p>Several traits now have default implementations that use reflection to
automatically derive behavior from struct fields. This means simple structs
can conform to these traits without implementing any methods - all fields
just need to conform to the same trait:</p>
<p><strong><a class="" href="https://mojolang.static.modular-staging.com/docs/std/hashlib/hash/Hashable/"><code>Hashable</code></a></strong> - Default <code>__hash__()</code>
hashes all fields:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@fieldwise_init</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Point</span><span class="token punctuation">(</span><span class="token plain">Hashable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token builtin" style="color:#b4730e">hash</span><span class="token punctuation">(</span><span class="token plain">Point</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1.5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2.7</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Works automatically</span><br></div></code></pre></div></div>
<p><strong><a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/Writable/"><code>Writable</code></a></strong> - Default <code>write_to()</code> formats
all fields:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@fieldwise_init</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Point</span><span class="token punctuation">(</span><span class="token plain">Writable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">Point</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1.5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2.7</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Point(x=1.5, y=2.7)</span><br></div></code></pre></div></div>
<p><strong><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/comparable/Equatable/"><code>Equatable</code></a></strong> - Default <code>__eq__()</code>
compares all fields:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@fieldwise_init</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Point</span><span class="token punctuation">(</span><span class="token plain">Equatable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">Point</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> Point</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># True</span><br></div></code></pre></div></div>
<p>Note: The default <code>Equatable</code> performs memberwise equality, which may not be
appropriate for types with floating-point fields (due to NaN semantics).
Override any of these methods for custom behavior.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-collections">Collections and iterators<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-collections" class="hash-link" aria-label="Direct link to Collections and iterators" title="Direct link to Collections and iterators" translate="no">​</a></h3>
<ul>
<li class="">
<p>Removed <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a> variadic initializer.</p>
<ul>
<li class="">
<p>Statements like:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int32</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>can be updated to:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int32</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Expressions like:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> foo</span><span class="token punctuation">(</span><span class="token plain">List</span><span class="token punctuation">[</span><span class="token plain">Float32</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>can be updated to move the explicit type "hint" around the first element:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> foo</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token plain">Float32</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Expressions like:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> data </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Span</span><span class="token punctuation">(</span><span class="token plain">List</span><span class="token punctuation">[</span><span class="token plain">Byte</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>can be updated to move the explicit element type to the <code>Span</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> data </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Span</span><span class="token punctuation">[</span><span class="token plain">Byte</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
</li>
<li class="">
<p><code>List</code> slicing without a stride now returns a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a>, instead of a <code>List</code> and no longer
allocates memory.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlineArray</code></a> no longer
conforms to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/ImplicitlyCopyable/"><code>ImplicitlyCopyable</code></a>. Users
must explicitly copy arrays or take references.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/index/IndexList/"><code>IndexList</code></a> is no longer implicitly
constructible from <code>Int</code>. Previously, the
fill constructor (which broadcasts a single <code>Int</code> to all elements) was marked
<code>@implicit</code>, allowing code like <code>var x: IndexList[3] = 5</code> which would create
<code>(5, 5, 5)</code>. This implicit conversion has been removed to improve type safety.
Use explicit construction instead: <code>IndexList[3](5)</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a> now raises a custom
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/DictKeyError/"><code>DictKeyError</code></a> type on failure,
making lookup failures more efficient to handle.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> d </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Dict</span><span class="token punctuation">[</span><span class="token plain">String</span><span class="token punctuation">,</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> key </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"missing_key"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">try</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    _ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> d</span><span class="token punctuation">[</span><span class="token plain">key</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">except</span><span class="token plain"> e</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">e</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Prints: DictKeyError</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>New <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/builtin_slice/ContiguousSlice/"><code>ContiguousSlice</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/builtin_slice/StridedSlice/"><code>StridedSlice</code></a> types were
added to the <code>builtin_slice</code> module to support specialization for slicing
without strides.</p>
</li>
<li class="">
<p><code>Span</code> now conforms to <a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/Iterable/"><code>Iterable</code></a>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/any/"><code>any()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/all/"><code>all()</code></a> now work over <code>Iterable</code>s, which means
they can act over the result of <a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/map/"><code>map()</code></a>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/tuple/Tuple/"><code>Tuple</code></a>s have been improved:</p>
<ul>
<li class="">Tuples can now be concatenated with <code>Tuple.concat()</code>.</li>
<li class="">Tuples can now be reversed with <code>Tuple.reverse()</code>.</li>
</ul>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/peekable/"><code>peekable()</code></a> function has been added to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/"><code>iter</code></a>. This allows users to peek at the next element of an
iterator without advancing it.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-string-and-text">String and text<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-string-and-text" class="hash-link" aria-label="Direct link to String and text" title="Direct link to String and text" translate="no">​</a></h3>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/"><code>String</code></a> has had its UTF-8
guarantees strengthened.</p>
<ul>
<li class="">It now has three separate constructors when converting raw bytes
(<code>Span[Byte]</code>) to a <code>String</code>:
<ul>
<li class=""><code>String(from_utf8=...)</code>: Raises an error if the bytes are invalid UTF-8</li>
<li class=""><code>String(from_utf8_lossy=...)</code>: Converts invalid UTF-8 byte sequences
into the <code>(U+FFFD, �)</code> replacement character and does not raise an
error.</li>
<li class=""><code>String(unsafe_from_utf8=...)</code>: Unsafely assumes the input bytes are valid
UTF-8 without any checks.</li>
</ul>
</li>
<li class=""><code>append_byte()</code> has been deprecated and has been replaced with
<code>append()</code>.</li>
</ul>
</li>
<li class="">
<p>The <code>strip()</code>, <code>lstrip()</code>, and <code>rstrip()</code> methods of <code>String</code> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a> now
support stripping multi-byte unicode codepoints. Additionally <code>lstrip()</code> and
<code>strip()</code> will no longer produce invalid UTF-8 if the "chars" string contains
characters sharing their first byte with a character in the string to be
stripped.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/#format"><code>StringLiteral.format()</code></a>
now emits a compile-time constraint error if the format string is invalid
(instead of a runtime error).</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token string" style="color:#477a5b">"Hello, {!invalid}"</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">format</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"world"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># note: constraint failed: Conversion flag "invalid" not recognized.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>StringSlice.char_length()</code> has been renamed <code>count_codepoints()</code>. The same
function was added to <code>String</code> and <code>StringLiteral</code>.</p>
</li>
<li class="">
<p>Added a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/ffi/cstring/CStringSlice/"><code>CStringSlice</code></a> as a
type-safe way to interact with nul-terminated c-style strings (<code>const char*</code>).</p>
</li>
<li class="">
<p>Removed <code>String.join(*Writable)</code> overload that takes a variadic sequence
of arguments, as it could be ambiguous with the remaining
<code>String.join(Span[Writable])</code> overload.</p>
</li>
<li class="">
<p>Removed the <code>Int.__init__(self, value: StringSlice, base: UInt)</code> constructor.
Users should call <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/atol/"><code>atol()</code></a>
directly.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-pointer-and-memory">Pointer and memory<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-pointer-and-memory" class="hash-link" aria-label="Direct link to Pointer and memory" title="Direct link to Pointer and memory" translate="no">​</a></h3>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/ffi/OwnedDLHandle/#get_symbol"><code>OwnedDLHandle.get_symbol()</code></a>
now returns <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a>
<code>[T, MutAnyOrigin]</code> instead of <code>UnsafePointer[T, ImmutAnyOrigin]</code>.
The vast majority of symbols loaded from shared libraries are meant to be used
mutably, and it's safer to go from mutable → immutable (via
<code>.as_immutable()</code>) than from immutable → mutable (via
<code>.unsafe_mut_cast[True]()</code>). Users who need
immutable pointers can now simply call <code>.as_immutable()</code> on the result.</p>
</li>
<li class="">
<p>The "LegacyUnsafePointer" type has been changed to take its mutability as a
first inferred parameter without a default, rather than a later explicit
parameter with a default value of true. We recommend moving off of this type
as soon as possible, but to roughly emulate the prior behavior, try out:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> memory </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> LegacyUnsafePointer</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> UnsafePointer </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> LegacyUnsafePointer</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">mut</span><span class="token operator" style="color:#a89984">=</span><span class="token boolean" style="color:#af2528">True</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">**</span><span class="token plain">_</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>External origins are now expressed using type level
<code>{Mut,Immut,}ExternalOrigin</code> aliases instead of being spelled like
<code>Origin[True].external</code>, improving consistency with other origin types.</p>
</li>
<li class="">
<p><code>UnsafePointer</code> can now be initialized from a raw memory address using the
<code>unsafe_from_address</code> initializer.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/alloc/"><code>alloc()</code></a> now has a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/debug_assert/debug_assert/"><code>debug_assert()</code></a> ensuring count
is non-negative.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-explicitly-destroyed-types">Explicitly-destroyed types<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-explicitly-destroyed-types" class="hash-link" aria-label="Direct link to Explicitly-destroyed types" title="Direct link to Explicitly-destroyed types" translate="no">​</a></h3>
<ul>
<li class="">
<p>Basic support for explicitly-destroyed types in the standard library is now
available. Explicitly-destroyed types—sometimes referred to as "linear
types"—are types that don't define a <code>__del__()</code> method that the compiler can
call automatically to destroy an instance. Instead, a explicitly-destroyed
type must provide a named method taking <code>deinit self</code> that the programmer is
required to call explicitly whenever an owned instance is no longer used.</p>
<p>The updated <code>AnyType</code> trait can be used in parameters to denote generic code
that supports object instances that can't be implicitly destroyed.</p>
<ul>
<li class=""><code>Span</code>, <code>UnsafePointer</code>, <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/Pointer/"><code>Pointer</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/owned_pointer/OwnedPointer/"><code>OwnedPointer</code></a> can point to
explicitly-destroyed types.
<ul>
<li class="">Added <code>UnsafePointer.destroy_pointee_with()</code>, for destroying
explicitly-destroyed types in-place using a function pointer to the type's
destructor.</li>
</ul>
</li>
<li class=""><code>List</code>, <code>InlineArray</code>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/variant/Variant/"><code>Variant</code></a>,
<code>VariadicListMem</code>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicPack/"><code>VariadicPack</code></a> can now contain
explicitly-destroyed types.
<ul>
<li class=""><code>Variant.take()</code> now takes <code>deinit self</code> instead of <code>mut self</code>.</li>
<li class="">Added <code>Variant.destroy_with()</code> for destroying an explicitly-destroyed type
in-place by passing in the type's destructor function.</li>
<li class="">The <code>*args</code> language syntax for arguments now supports
explicitly-destroyed types.</li>
</ul>
</li>
<li class=""><code>Iterator.Element</code> no longer requires <code>ImplicitlyDestructible</code>.</li>
<li class=""><code>UnsafeMaybeUninitialized</code>
can now contain explicitly-destroyed types.</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-type-system">Type system and traits<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-type-system" class="hash-link" aria-label="Direct link to Type system and traits" title="Direct link to Type system and traits" translate="no">​</a></h3>
<ul>
<li class="">
<p>Using a new 'unconditional conformances' technique leveraging <code>conforms_to()</code>
and <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/rebind/trait_downcast/"><code>trait_downcast()</code></a> to perform
"late" element type conformance checking, some standard library types are now
able to conform to traits that they could not previously:</p>
<ul>
<li class=""><code>List</code>, <code>Dict</code>, <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/deque/Deque/"><code>Deque</code></a>, <code>InlineArray</code>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/"><code>LinkedList</code></a> now conform to
<code>Writable</code>, <code>Stringable</code>, and
<code>Representable</code>. <code>List</code> also
conforms to <code>Equatable</code>.</li>
<li class=""><code>Pointer</code>, <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/arc_pointer/ArcPointer/"><code>ArcPointer</code></a>, and
<code>OwnedPointer</code> now conform to <code>Writable</code>.</li>
<li class=""><code>Iterator</code>, <code>Tuple</code>, <code>Variant</code>, and <code>Optional</code> no longer require their
element types to be <code>Copyable</code>.</li>
</ul>
</li>
<li class="">
<p>The <code>Iterator</code> trait and for-each loop have removed the <code>__has_next__()</code>
method and now use a <code>__next__()</code> method that <code>raises</code>
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/StopIteration/"><code>StopIteration</code></a>. This follows Python precedent
better, is more convenient to implement, and can be a minor performance win
in some cases.</p>
</li>
<li class="">
<p>The <code>ImplicitlyBoolable</code> trait has been removed. This trait enabled types to
implicitly convert to <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/Bool/"><code>Bool</code></a>. This behavior was
rarely used, and could lead to subtle bugs, for example mistakenly passing
types like <code>Int</code> or <code>UnsafePointer</code> to an argument expecting a <code>Bool</code> would
silently compile successfully.</p>
</li>
<li class="">
<p>The <code>Error</code> type no longer conforms to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/Boolable/"><code>Boolable</code></a> or
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Defaultable/"><code>Defaultable</code></a>. Errors must now be
constructed with meaningful context, and optionality should be expressed
through <code>Optional[Error]</code> rather than treating errors as boolean values.</p>
</li>
<li class="">
<p>The <code>Copyable</code> trait now refines the <code>Movable</code> trait. This means that structs
and generic algorithms that already require <code>Copyable</code> don't need to also
mention they require <code>Movable</code>.</p>
</li>
<li class="">
<p>The <code>EqualityComparable</code> trait has been deprecated in favor of <code>Equatable</code>,
which has identical functionality.</p>
</li>
<li class="">
<p>We have removed
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/identifiable/Identifiable/"><code>Identifiable</code></a> from enum-like
types (such as <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/dtype/DType/"><code>DType</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/AddressSpace/"><code>AddressSpace</code></a>). This change is
related to the idea that <code>Identifiable</code> is for comparing memory addresses.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-python-interop">Python interoperability<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-python-interop" class="hash-link" aria-label="Direct link to Python interoperability" title="Direct link to Python interoperability" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <code>ConvertibleFromPython</code> trait and associated initializers now have a
required keyword argument. Before: <code>Int(pyObj)</code>. After: <code>Int(py=pyObj)</code>. This
avoids ambiguities in cases where either multiple overloads could apply, or
where implicit conversions to <code>PythonObject</code> could mask that a Python
operation was happening.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> now supports
implicit conversion from <code>None</code>, allowing more natural Python-like code:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> obj</span><span class="token punctuation">:</span><span class="token plain"> PythonObject </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">None</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Now works without explicit PythonObject(None)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">returns_none</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> PythonObject</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">None</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Implicit conversion</span><br></div></code></pre></div></div>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-file-io">File I/O and OS<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-file-io" class="hash-link" aria-label="Direct link to File I/O and OS" title="Direct link to File I/O and OS" translate="no">​</a></h3>
<ul>
<li class="">
<p>Basic file I/O operations in the <code>io</code> module are now implemented natively in
Mojo using direct <code>libc</code> system calls (<code>open()</code>, <code>close()</code>, <code>read()</code>,
<code>write()</code>, <code>lseek()</code>). The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/io/file/FileHandle/"><code>FileHandle</code></a> type
no longer depends on CompilerRT functions, providing better performance and
transparency. Error handling now includes errno-based messages for improved
diagnostics.</p>
</li>
<li class="">
<p>The <code>os.process</code> submodule has been added with utilities to spawn and
wait on processes. These use <code>posix_spawn()</code> and do not go through the
system shell.</p>
</li>
<li class="">
<p>Various OS wrapper functions now include the value of <code>errno</code> in the raised
error message.</p>
</li>
<li class="">
<p>The <code>os</code> module now exposes a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/link/"><code>link()</code></a> function,
wrapping the unix <code>link(2)</code> system call.</p>
</li>
<li class="">
<p>The <code>os</code> module now exposes a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/symlink/"><code>symlink()</code></a>
function, wrapping the unix <code>symlink(2)</code> syscall.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-gpu">GPU programming<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-gpu" class="hash-link" aria-label="Direct link to GPU programming" title="Direct link to GPU programming" translate="no">​</a></h3>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/layout/layout/Layout/"><code>Layout</code></a> no longer conforms to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/ImplicitlyCopyable/"><code>ImplicitlyCopyable</code></a>. The
motivation for this change is that it was easy to accidentally materialize a
<code>Layout</code> at runtime
using methods such as <code>Layout.size()</code>. There are a few downstream changes
users will have to adapt to with this change. Below are some common patterns
which will help with this transition:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> layout </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Layout</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Layout</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Layout</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> a</span><span class="token punctuation">.</span><span class="token plain">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># `a` needs to be explicitly copied.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bar</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"> Layout</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Layout</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> a</span><span class="token operator" style="color:#a89984">^</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># If a is taken by value, one can use the transfer operator.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">baz</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> a </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Layout</span><span class="token punctuation">.</span><span class="token plain">row_major</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># `a` needs to be materialized because `foo` returns a type that</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># is not ImplicitlyCopyable (`Layout`).</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> b </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> foo</span><span class="token punctuation">(</span><span class="token plain">materialize</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># `bar` moves `b` by value, but `foo` also takes `b` by reference,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># so we need to explicitly copy.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    _ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> bar</span><span class="token punctuation">(</span><span class="token plain">b</span><span class="token punctuation">.</span><span class="token plain">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    _ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> foo</span><span class="token punctuation">(</span><span class="token plain">b</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Since we are no longer using `b`, it's fine to take it by value here.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    _ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> bar</span><span class="token punctuation">(</span><span class="token plain">b</span><span class="token operator" style="color:#a89984">^</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Since `Layout.size()` returns an `Int`, we can use a `comptime`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># expression to compute the return value without materializing `a`.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">.</span><span class="token plain">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>DeviceContext.enqueue_function_checked()</code> and
<code>DeviceStream.enqueue_function_checked()</code> have been renamed to
<code>enqueue_function()</code>. Similarly, <code>DeviceContext.compile_function_checked()</code>
has been renamed to <code>compile_function()</code>.</p>
</li>
<li class="">
<p><code>DeviceContext.enqueue_function()</code> and
<code>DeviceContext.enqueue_function_experimental()</code> now automatically infer
<code>func_attribute</code> to
<code>FuncAttribute.MAX_DYNAMIC_SHARED_SIZE_BYTES(shared_mem_bytes)</code> when
<code>shared_mem_bytes</code> is specified but <code>func_attribute</code> is not, for NVIDIA GPUs
with allocations &gt; 48KB. This eliminates the need to specify the same shared
memory size twice in many cases, reducing boilerplate and preventing
mismatched values. On AMD GPUs or for allocations ≤ 48KB, explicit
<code>func_attribute</code> values should be provided when needed.</p>
</li>
<li class="">
<p>The <code>inlined_assembly()</code> function is now publicly exported from the <code>sys</code>
module, allowing users to embed raw assembly instructions directly into Mojo
code.
This provides fine-grained control over hardware operations using LLVM-style
inline assembly syntax. Example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> sys </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> inlined_assembly</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Convert bfloat16 to float32 on NVIDIA GPU using PTX assembly.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> result </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> inlined_assembly</span><span class="token punctuation">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token string" style="color:#477a5b">"cvt.f32.bf16 $0, $1;"</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    Float32</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    constraints</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"=f,h"</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    has_side_effect</span><span class="token operator" style="color:#a89984">=</span><span class="token boolean" style="color:#af2528">False</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">my_bf16_as_int16</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-formatting">Formatting and output<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-formatting" class="hash-link" aria-label="Direct link to Formatting and output" title="Direct link to Formatting and output" translate="no">​</a></h3>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/Writer/"><code>Writer</code></a> has been reworked to support only UTF-8
data instead of arbitrary <code>Byte</code> sequences. The <code>write_bytes()</code> method has
been replaced with <code>write_string()</code>.</p>
<ul>
<li class="">In line with these changes, <code>String</code>'s <code>write_bytes()</code> method has also been
deprecated, and its initializer <code>__init__(out self, *, bytes: Span[Byte])</code>
has had its keyword argument renamed to <code>unsafe_from_utf8</code>. This brings it
more in line with the existing <code>StringSlice</code> constructors and explicitly
states that construction from arbitrary bytes is inherently unsafe.</li>
</ul>
</li>
<li class="">
<p><code>Writer</code> and <code>Writable</code> have been moved into a new <code>format</code> module and out of
<code>io</code>. These traits are not directly related to binary i/o, but are rather
closely tied to type/value string formatting.</p>
</li>
<li class="">
<p>The <code>Writable</code> trait now supports debug formatting through an optional
<code>write_repr_to()</code> method, called by <a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/repr/repr/"><code>repr()</code></a>
and the <code>{!r}</code> format specifier.
Additionally, <code>repr()</code> and string formatting methods (<code>.format()</code> on <code>String</code>,
<code>StringSlice</code>, and <code>StringLiteral</code>) now accept <code>Writable</code> types, enabling
efficient formatting without intermediate string allocations. To preserve
existing behavior, types implementing both <code>Stringable &amp; Representable</code> and
<code>Writable</code> will continue using <code>Stringable &amp; Representable</code> methods; only
types implementing <code>Writable</code> alone will use the new code paths.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/counter/Counter/"><code>Counter</code></a> now conforms to <code>Writable</code>,
<code>Stringable</code>, and <code>Representable</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/benchmark/compiler/black_box/"><code>black_box()</code></a> has been added to the
<code>benchmark</code> utilities as a way to prevent the compiler from aggressively
optimizing out values. Similar to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/benchmark/compiler/keep/"><code>keep()</code></a>, however, it returns its
argument.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-other-library">Other library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-other-library" class="hash-link" aria-label="Direct link to Other library changes" title="Direct link to Other library changes" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/#uint"><code>UInt</code></a> struct has been replaced by a new
<code>UInt</code> type alias to <code>Scalar[DType.uint]</code>. This is a major change that enables
more powerful
generic programming by abstracting over unsigned SIMD data dtypes of machine
word size.</p>
<p>This change will likely break code that relies on implicit conversions to/from
<code>UInt</code> and <code>Int</code>/<code>SIMD</code>. The <code>SIMD</code> type is also slightly less foldable at
compile time, which can cause some code in where clauses, comptime
expressions, and other code in parametric contexts to now fail or crash. These
shortcomings will be addressed in subsequent patches as needed.</p>
</li>
<li class="">
<p>Implicit conversion between <code>Int</code> and <code>UInt</code> has been removed.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/random/"><code>random</code></a> module now uses a pure Mojo implementation
based on the Philox algorithm (via an internal wrapper), replacing the
previous <code>CompilerRT</code> C++ dependency. The Philox algorithm provides excellent
statistical quality, works on both CPU and GPU, and makes random number
generation fully transparent and source-available. Note that this changes the
random number sequence for a given seed value, which may affect tests or code
relying on reproducible sequences.</p>
</li>
<li class="">
<p><code>StringableRaising</code> has been deprecated and its usages in the stdlib have
been removed.</p>
</li>
<li class="">
<p><code>Variadic</code> now has <code>zip_types()</code>, <code>zip_values()</code>, and <code>slice_types()</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The Mojo compiler now supports the <code>-Werror</code> flag, which treats all warnings
as compilation errors. This is useful for enforcing stricter code quality
standards, particularly in CI/CD pipelines. The flag works with the Mojo
compiler tools (<code>mojo run</code>, <code>mojo build</code>, <code>mojo package</code>, <code>mojo doc</code>).
When used with <code>--disable-warnings</code>, warnings are promoted to errors first,
so the errors are not suppressed.</p>
<ul>
<li class="">The counterpart <code>-Wno-error</code> flag disables treating warnings as errors.
When both flags are specified, the last one wins.</li>
</ul>
</li>
<li class="">
<p>Specifying CUDA architectures with <code>--target-accelerator</code> now expects a sm
version string rather than just a compute capability. For example,
<code>--target-accelerator=nvidia:80</code> should be changed to
<code>--target-accelerator=nvidia:sm_80</code>. If an incorrect format is used for the
version, the compiler will default to the lowest supported sm version.</p>
</li>
<li class="">
<p>The Mojo LSP server now debounces document updates to reduce CPU usage during
rapid typing. Previously, every keystroke triggered a full document parse;
now updates are coalesced with a 150ms delay, reducing parse frequency by
10-50x during active editing.</p>
</li>
<li class="">
<p>The Mojo compiler now "diffs" very long types in error messages to explain
what is going on in an easier to understand way.</p>
</li>
<li class="">
<p>Elaboration error printing with different levels of verbosity
offers control on how parameter values are displayed as part of
elaboration errors when function instantiation fails.
<code>--elaboration-error-verbose=value</code> now takes a value, where:</p>
<ul>
<li class=""><code>no-params</code> means don't display any concrete parameter values.
This is helpful to collapse recursion-related error messages
into shorter blobs.</li>
<li class=""><code>simple-params</code> means display concretized parameter values for simple types,
including numeric types and strings, in a user-friendly format
(default value).</li>
<li class=""><code>all-params</code> means show all concrete parameter values.
This is for advanced programmers who don't mind reading
MLIR attributes but want more visibility of parameter values.</li>
</ul>
</li>
<li class="">
<p><code>--elaboration-max-depth</code> is added to control maximum elaborator
instantiation depth. This (unsigned) value helps to detect compile time
recursion. The default is <code>std::numeric_limits&lt;unsigned&gt;::max()</code>.</p>
</li>
<li class="">
<p>Docstring validation with <code>--validate-doc-strings</code> now emits an error when an
<code>fn</code> function is declared to raise an error (<code>raises</code>) but it's missing a
<a href="https://github.com/modular/modular/blob/main/mojo/stdlib/docs/docstring-style-guide.md#errors" target="_blank" rel="noopener noreferrer" class=""><code>Raises</code> docstring</a>
(previously it emitted only a warning). Because Mojo automatically treats all
<code>def</code> functions as
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/functions/#raising-and-non-raising-functions">raising functions</a>,
we don't enforce <code>Raises</code> docs for <code>def</code> functions (to avoid noisy false
positives).</p>
</li>
<li class="">
<p>Docstring validation now includes <code>comptime</code> aliases. The
<code>--diagnose-missing-doc-strings</code> flag now checks that public aliases have
properly formatted docstrings (summary ends with period, starts with capital
letter). Parametric aliases are also checked for proper <code>Parameters:</code>
sections.</p>
</li>
<li class="">
<p>The <code>--validate-doc-strings</code> flag has been deprecated for <code>mojo doc</code> and
removed from other tools (<code>mojo build</code>, <code>mojo run</code>, <code>mojo package</code>). Use
<code>-Werror</code> instead to treat warnings as errors.</p>
</li>
<li class="">
<p>The Mojo compiler now supports the <code>-Xlinker</code> flag to pass options on
directly to the linker, for example:</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">mojo build -Xlinker -lfoo main.mojo</span><br></div></code></pre></div></div>
<p>Note: this option only has an effect with <code>mojo build</code>. With <code>mojo run</code>, the
arguments are ignored and a warning is issued.</p>
</li>
<li class="">
<p>The Mojo compiler now supports the <code>--experimental-export-fixit</code> flag for
<code>mojo build</code>, <code>mojo run</code>, and <code>mojo package</code>. This flag exports fix-its to a
YAML file compatible with <code>clang-apply-replacements</code>, instead of applying them
directly. This is useful for integrating Mojo's fix-it suggestions into
external tooling workflows. The flag is mutually exclusive with
<code>--experimental-fixit</code> (which applies fix-its directly).</p>
</li>
<li class="">
<p>The Mojo Debugger <code>mojo break-on-raise</code> feature now works correctly with
multiple targets in a debugger instance. The setting is per-target.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-experimental-changes">Experimental changes<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-experimental-changes" class="hash-link" aria-label="Direct link to Experimental changes" title="Direct link to Experimental changes" translate="no">​</a></h2>
<p>Changes described in this section are experimental and may be changed, replaced,
or removed in future releases.</p>
<ul>
<li class="">
<p>Mojo now supports compile-time trait conformance check (via <code>conforms_to()</code>)
and downcast (via <code>trait_downcast()</code>). This allows users to implement features
like static dispatching based on trait conformance. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> maybe_print</span><span class="token punctuation">[</span><span class="token plain">T </span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">maybe_printable </span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> conforms_to</span><span class="token punctuation">(</span><span class="token plain">T</span><span class="token punctuation">,</span><span class="token plain"> Writable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">trait_downcast</span><span class="token punctuation">[</span><span class="token plain">Writable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">maybe_printable</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">else</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"[UNPRINTABLE]"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added support for <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/dtype/DType/"><code>DType</code></a> expressions in
<code>where</code> clauses:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">dt</span><span class="token punctuation">:</span><span class="token plain"> DType</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int where dt </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> DType</span><span class="token punctuation">.</span><span class="token plain">int32</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><br></div></code></pre></div></div>
<p>Currently, the following expressions are supported:</p>
<ul>
<li class="">equality and inequality</li>
<li class=""><code>is_signed()</code>, <code>is_unsigned()</code>, <code>is_numeric()</code>, <code>is_integral()</code>,
<code>is_floating_point()</code>, <code>is_float8()</code>, <code>is_half_float()</code></li>
</ul>
</li>
<li class="">
<p>Added support for <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> expressions in <code>where</code>
clauses:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">dt</span><span class="token punctuation">:</span><span class="token plain"> DType</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int where SIMD</span><span class="token punctuation">[</span><span class="token plain">dt</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">dt</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><br></div></code></pre></div></div>
<p>Currently, the following expressions are supported:</p>
<ul>
<li class="">default construction and construction from <code>Int</code> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int_literal/IntLiteral/"><code>IntLiteral</code></a></li>
<li class="">equality, inequality, and other comparison operators</li>
<li class="">addition, subtraction, and multiplication</li>
<li class="">bitwise logical operations, excluding shifts</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-removed">Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-removed" class="hash-link" aria-label="Direct link to Removed" title="Direct link to Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p>The following deprecated GPU compatibility modules have been removed:</p>
<ul>
<li class=""><code>gpu.id</code> - Use <code>from gpu import block_idx, thread_idx, ...</code> instead</li>
<li class=""><code>gpu.block</code> - Use <code>from gpu.primitives.block import ...</code> instead</li>
<li class=""><code>gpu.warp</code> - Use <code>from gpu.primitives.warp import ...</code> instead</li>
<li class=""><code>gpu.cluster</code> - Use <code>from gpu.primitives.cluster import ...</code> instead</li>
<li class=""><code>gpu.grid_controls</code> - Use <code>from gpu.primitives.grid_controls import ...</code>
instead</li>
<li class=""><code>gpu.mma</code> - Use <code>from gpu.compute.mma import ...</code> instead</li>
<li class=""><code>gpu.mma_operand_descriptor</code> - Use
<code>from gpu.compute.mma_operand_descriptor import ...</code> instead</li>
<li class=""><code>gpu.mma_util</code> - Use <code>from gpu.compute.mma_util import ...</code> instead</li>
<li class=""><code>gpu.mma_sm100</code> - Use <code>from gpu.compute.arch.mma_nvidia_sm100 import ...</code>
instead</li>
<li class=""><code>gpu.semaphore</code> - Use <code>from gpu.sync.semaphore import ...</code> instead</li>
<li class=""><code>gpu.tcgen05</code> - Use <code>from gpu.compute.arch.tcgen05 import ...</code> instead</li>
</ul>
</li>
<li class="">
<p>The DeviceContext <code>enqueue_function_unchecked()</code> and
<code>compile_function_unchecked()</code> have been removed. Please migrate the code to
use <code>enqueue_function()</code> and <code>compile_function()</code>.</p>
</li>
<li class="">
<p><code>NDBuffer</code> has been removed. Use
<a class="" href="https://mojolang.static.modular-staging.com/docs/layout/layout_tensor/LayoutTensor/"><code>LayoutTensor</code></a> instead.</p>
</li>
<li class="">
<p>The <code>UnsafePointer.offset()</code> method is now deprecated. Use pointer arithmetic
instead:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Before</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">new_ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> ptr</span><span class="token punctuation">.</span><span class="token plain">offset</span><span class="token punctuation">(</span><span class="token plain">n</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">new_ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> ptr </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> n</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="26-1-fixed">Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#26-1-fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<ul>
<li class="">Several reflection-related compiler crashes have been fixed:
<ul>
<li class=""><a href="https://github.com/modular/modular/issues/5731" target="_blank" rel="noopener noreferrer" class="">Issue #5731</a>: Reflection
functions now work correctly on builtin types like <code>Int</code>, <code>NoneType</code>, and
<code>Origin</code>.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5732" target="_blank" rel="noopener noreferrer" class="">Issue #5732</a>:
<code>get_type_name()</code> now handles types with constructor calls in their
parameters (like <code>A[B(True)]</code>) when extracted via <code>struct_field_types()</code>.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5723" target="_blank" rel="noopener noreferrer" class="">Issue #5723</a>:
<code>get_type_name()</code> now handles nested parametric types from
<code>struct_field_types()</code>.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5754" target="_blank" rel="noopener noreferrer" class="">Issue #5754</a>:
<code>struct_field_type_by_name()</code> now works correctly when using
<code>ReflectedType.T</code> as a type annotation.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5808" target="_blank" rel="noopener noreferrer" class="">Issue #5808</a>:
<code>rebind()</code> and <code>rebind_var()</code> now accept downcasted types from
<code>struct_field_types()</code>, allowing patterns like
<code>rebind_var[types[i]](downcast[types[i], Trait]()^)</code>.</li>
</ul>
</li>
<li class=""><a href="https://github.com/modular/modular/issues/5618" target="_blank" rel="noopener noreferrer" class="">Issue #5618</a>: Compiler crash
when should be implicit conversion error.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5361" target="_blank" rel="noopener noreferrer" class="">Issue #5361</a>: mojo doc
crashes on alias of parametrized function with origin.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5137" target="_blank" rel="noopener noreferrer" class="">Issue #5137</a>: Tail call
optimization doesn't happen for tail recursive functions with raises.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5138" target="_blank" rel="noopener noreferrer" class="">Issue #5138</a>: Tail call
optimization doesn't happen for functions with local stack temporaries.</li>
<li class="">Mojo no longer complains about "cannot infer parameter X" when unrelated type
checking errors happen in complex parametric code. It now gives much more
useful and actionable error messages in these cases.</li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/time/time/sleep/"><code>time.sleep()</code></a> now works correctly for durations
longer than 1 millisecond on NVIDIA GPUs. Previously, sleep durations were
silently capped at 1ms due to a hardware limitation in the underlying
<code>nanosleep</code> intrinsic. AMD GPUs now have basic sleep support using the
<code>s_sleep</code> instruction, which is sufficient for spin-wait backoff operations
though it doesn't provide accurate wall-clock timing. Additionally,
<code>global_perf_counter_ns()</code> is now exported from the <code>time</code> package for GPU
code that needs nanosecond-resolution timing.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5578" target="_blank" rel="noopener noreferrer" class="">Issue #5578</a>: ownership
overloading not working when used with <code>ref</code>.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1850" target="_blank" rel="noopener noreferrer" class="">Issue #1850</a>: Mojo assumes
string literal at start of a function is a doc comment</li>
<li class=""><a href="https://github.com/modular/modular/issues/4501" target="_blank" rel="noopener noreferrer" class="">Issue #4501</a>: Incorrect
parsing of incomplete assignment</li>
<li class=""><a href="https://github.com/modular/modular/issues/4765" target="_blank" rel="noopener noreferrer" class="">Issue #4765</a>: Parser
accepts pointless var ref a = n binding form</li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/#unsafe_decode_utf8_codepoint"><code>Codepoint.unsafe_decode_utf8_codepoint()</code></a>
no longer returns <code>Codepoint(0)</code> (NUL) when passed an empty span. Instead, a
<code>debug_assert()</code> now enforces the requirement that the input span be
non-empty, consistent with the function's existing safety contract.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5635" target="_blank" rel="noopener noreferrer" class="">Issue #5635</a>:
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/deque/Deque/"><code>Deque</code></a> shrink reallocation incorrectly
handled empty deque with <code>capacity &gt; min_capacity</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.26.1/#special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h2>
<p>Special thanks to our community contributors:</p>
<p>Alex Maldonado (<a href="https://github.com/aalexmmaldonado" target="_blank" rel="noopener noreferrer" class="">@aalexmmaldonado</a>),
Bernhard Merkle (<a href="https://github.com/bmerkle" target="_blank" rel="noopener noreferrer" class="">@bmerkle</a>),
Brian Grenier (<a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>),
Christoph Schlumpf (<a href="https://github.com/christoph-schlumpf" target="_blank" rel="noopener noreferrer" class="">@christoph-schlumpf</a>),
Duba Sirisha (<a href="https://github.com/SirishaDuba" target="_blank" rel="noopener noreferrer" class="">@SirishaDuba</a>),
Ethan Wu (<a href="https://github.com/YichengDWu" target="_blank" rel="noopener noreferrer" class="">@YichengDWu</a>),
Gunasekar (<a href="https://github.com/sdgunaa" target="_blank" rel="noopener noreferrer" class="">@sdgunaa</a>),
Hristo (Izo) G. (<a href="https://github.com/izo0x90" target="_blank" rel="noopener noreferrer" class="">@izo0x90</a>),
Johannes Laute (<a href="https://github.com/jaidmin" target="_blank" rel="noopener noreferrer" class="">@jaidmin</a>),
Jordan Rinder (<a href="https://github.com/jrinder42" target="_blank" rel="noopener noreferrer" class="">@jrinder42</a>),
josiahls (<a href="https://github.com/josiahls" target="_blank" rel="noopener noreferrer" class="">@josiahls</a>),
Krish Gupta (<a href="https://github.com/KrxGu" target="_blank" rel="noopener noreferrer" class="">@KrxGu</a>),
Magi Sharma J (<a href="https://github.com/magi8101" target="_blank" rel="noopener noreferrer" class="">@magi8101</a>),
Manuel Saelices (<a href="https://github.com/msaelices" target="_blank" rel="noopener noreferrer" class="">@msaelices</a>),
martinvuyk (<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>),
Richard Johnsson (<a href="https://github.com/jmikaelr" target="_blank" rel="noopener noreferrer" class="">@jmikaelr</a>),
Ritesh Goru (<a href="https://github.com/BlackWingedKing" target="_blank" rel="noopener noreferrer" class="">@BlackWingedKing</a>),
Ross Campbell (<a href="https://github.com/RossCampbellDev" target="_blank" rel="noopener noreferrer" class="">@RossCampbellDev</a>),
RWayne93 (<a href="https://github.com/RWayne93" target="_blank" rel="noopener noreferrer" class="">@RWayne93</a>),
soraros (<a href="https://github.com/soraros" target="_blank" rel="noopener noreferrer" class="">@soraros</a>),
Sören Brunk (<a href="https://github.com/sbrunk" target="_blank" rel="noopener noreferrer" class="">@sbrunk</a>),
turakz (<a href="https://github.com/turakz" target="_blank" rel="noopener noreferrer" class="">@turakz</a>),
Valentin Erokhin (<a href="https://github.com/saviorand" target="_blank" rel="noopener noreferrer" class="">@saviorand</a>),
YeonguChoe (<a href="https://github.com/YeonguChoe" target="_blank" rel="noopener noreferrer" class="">@YeonguChoe</a>)</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v0.25.7]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.25.7/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.25.7/"/>
        <updated>2025-11-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p>A new, improved
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> type has
been added, and the old version renamed to
<code>LegacyUnsafePointer</code>.
The new version fixes several issues with the old <code>LegacyUnsafePointer</code>.</p>
<ul>
<li class=""><code>LegacyUnsafePointer</code> had constructors that allowed unsafe implicit
mutability and origin casts, making it easy to make unsafe changes by
accident. The new <code>UnsafePointer</code> eliminates these.</li>
<li class="">The new <code>UnsafePointer</code> now has an inferred mutability parameter,
simplifying the API.</li>
<li class=""><code>UnsafePointer</code> does not have a default value for its origin parameter, so
it must be explicitly specified or unbound. <code>LegacyUnsafePointer</code> defaults
to <code>MutAnyOrigin</code>, which results in the lifetimes of many values being
extended needlessly.</li>
</ul>
<p>For more information, see
<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-pointer-and-memory-changes" class="">Pointer and memory changes</a>.</p>
</li>
<li class="">
<p>Many enhancements to compile-time errors, including suppressing extraneous
messages and preserving more human-readable display for many aliases and
parameters. For details, see <a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-tooling-changes" class="">Tooling changes</a>.</p>
</li>
<li class="">
<p>Added a new document on
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/gpu/block-and-warp/">GPU block and warp operations and synchronization</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-7-language-enhancements">Language enhancements<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-language-enhancements" class="hash-link" aria-label="Direct link to Language enhancements" title="Direct link to Language enhancements" translate="no">​</a></h2>
<ul>
<li class="">
<p>Mojo now supports the <code>comptime</code> keyword as a synonym for <code>alias</code>. The
<code>comptime</code> keyword can be used interchangeably with <code>alias</code> for compile-time
declarations. Both keywords are fully supported and produce identical
behavior. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token plain">      </span><span class="token comment" style="color:#a89984"># New preferred syntax</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> y </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">10</span><span class="token plain">        </span><span class="token comment" style="color:#a89984"># Still fully supported</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> MyType</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> T  </span><span class="token comment" style="color:#a89984"># Works with parametric declarations</span><br></div></code></pre></div></div>
<p>Note: Future updates will migrate error messages and internal terminology to
use "comptime". The <code>alias</code> keyword will remain supported for backward
compatibility for now.</p>
</li>
<li class="">
<p>Mojo now supports unpacking an alias/comptime tuple with a single statement
when it is not inside a struct or trait. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> i</span><span class="token punctuation">,</span><span class="token plain"> f </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3.0</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">comptime</span><span class="token plain"> q</span><span class="token punctuation">,</span><span class="token plain"> v </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">divmod</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3925" target="_blank" rel="noopener noreferrer" class="">Issue #3925</a>: Mojo now allows
methods to be overloaded based on "owned" vs "by-ref" argument conventions,
selecting the owned overload when given an owned value, and selecting the
by-ref version otherwise. This allows somewhat more efficient algorithms,
e.g. consuming vs borrowing iterators:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">MyCollection</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__iter__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Self</span><span class="token punctuation">.</span><span class="token plain">ConsumingIterator</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__iter__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Self</span><span class="token punctuation">.</span><span class="token plain">BorrowingIterator</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Collection literals now have a default type. For example, you can now bind
<code>[1,2,3]</code> to <code>T</code> in a call to a function defined as
<code>fn zip[T: Iterable](impl:T)</code> because it will default to the standard
library's <code>List</code> type.</p>
</li>
<li class="">
<p>Mojo now has a <code>__functions_in_module()</code> experimental intrinsic that allows
reflection over the functions declared in the module where it is called. For
example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bar</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> funcs </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> __functions_in_module</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># equivalent to:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> same_funcs </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Tuple</span><span class="token punctuation">(</span><span class="token plain">foo</span><span class="token punctuation">,</span><span class="token plain"> bar</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>The intrinsic is currently limited for use from within the <code>main()</code> function.
For an example of using <code>__functions_in_module()</code> in a test suite, see
<a class="" href="https://mojolang.static.modular-staging.com/docs/tools/testing/#running-tests-with-testsuite">Running tests with TestSuite</a></p>
</li>
<li class="">
<p>The <code>@implicit</code> decorator now accepts an optional <code>deprecated</code> keyword
argument. This can be used to phase out implicit conversions instead of just
removing the decorator (which can result in another, unintended implicit
conversion path). For example, the compiler now warns about the following:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">MyStuff</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token decorator annotation punctuation">@implicit</span><span class="token punctuation">(</span><span class="token plain">deprecated</span><span class="token operator" style="color:#a89984">=</span><span class="token boolean" style="color:#af2528">True</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">deprecated_implicit_conversion</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># warning: deprecated implicit conversion from 'IntLiteral[1]' to 'MyStuff'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">_</span><span class="token punctuation">:</span><span class="token plain"> MyStuff </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  _ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> MyStuff</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># this is okay, because the conversion is already explicit.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>@deprecated</code> decorator can now take a target symbol with the <code>use</code>
keyword argument. This is mutually exclusive with the existing positional
string argument. A deprecation warning will be automatically generated.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@deprecated</span><span class="token punctuation">(</span><span class="token plain">use</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">new</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">old</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  old</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># 'old' is deprecated, use 'new' instead</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>In struct instances that declare a parametric <code>__call__()</code> method, but not
one of the subscript methods (<code>__getitem__()</code>, <code>__setitem__()</code>, or
<code>__getattr__()</code>), the <code>__call__()</code> method can now be invoked with parameters:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Callable</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> __call__</span><span class="token punctuation">[</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> y</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> c </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Callable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">c</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># 3</span><br></div></code></pre></div></div>
<p>Previously you would have needed to explicitly look up <code>__call__()</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">c</span><span class="token punctuation">.</span><span class="token plain">__call__</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added <code>DType.float4_e2m1fn</code> as the 4bit float <code>e2m1</code> format. This
<code>Float4_e2m1</code> type is defined by the
<a href="https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf" target="_blank" rel="noopener noreferrer" class="">Open Compute MX Specification</a>.</p>
</li>
<li class="">
<p><code>deinit</code> methods may now transfer all of <code>self</code> to another <code>deinit</code> method.</p>
</li>
<li class="">
<p>Mojo now uses system allocators in programs built with
<code>mojo build --sanitize address</code>. This means ASan can see Mojo heap allocations
and should now be able to detect many more heap memory errors.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-7-language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The <code>__type_of()</code> magic function has been renamed to <code>type_of()</code>. Using the
old spelling will yield an error. Similarly, <code>__origin_of()</code> has been renamed
to <code>origin_of()</code>.</p>
</li>
<li class="">
<p>An expression like <code>(Int, Float64)</code> is no longer syntax sugar for a tuple
types like <code>Tuple[Int, Float64]</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-7-library-changes">Library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-library-changes" class="hash-link" aria-label="Direct link to Library changes" title="Direct link to Library changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-7-pointer-and-memory-changes">Pointer and memory changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-pointer-and-memory-changes" class="hash-link" aria-label="Direct link to Pointer and memory changes" title="Direct link to Pointer and memory changes" translate="no">​</a></h3>
<ul>
<li class="">
<p><code>UnsafePointer</code> has been renamed to <code>LegacyUnsafePointer</code> and a new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> has
<a href="https://forum.modular.com/t/proposal-unsafepointer-v2/2411?u=nate" target="_blank" rel="noopener noreferrer" class="">taken its place</a>.
Similarly, <code>OpaquePointer</code> has been renamed to <code>LegacyOpaquePointer</code> and a new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/#opaquepointer"><code>OpaquePointer</code></a> has taken
its place. The primary difference is the ordering of parameters, which now
looks like this:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">UnsafePointer</span><span class="token punctuation">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">mut</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Inferred mutability</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  origin</span><span class="token punctuation">:</span><span class="token plain"> Origin</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">mut</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Non-defaulted origin</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token operator" style="color:#a89984">*</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  address_space</span><span class="token punctuation">:</span><span class="token plain"> AddressSpace </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> AddressSpace</span><span class="token punctuation">.</span><span class="token plain">GENERIC</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> OpaquePointer</span><span class="token punctuation">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">mut</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Inferred mutability</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  origin</span><span class="token punctuation">:</span><span class="token plain"> Origin</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">mut</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Non-defaulted origin</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token operator" style="color:#a89984">*</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  address_space</span><span class="token punctuation">:</span><span class="token plain"> AddressSpace </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> AddressSpace</span><span class="token punctuation">.</span><span class="token plain">GENERIC</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> UnsafePointer</span><span class="token punctuation">[</span><span class="token plain">NoneType</span><span class="token punctuation">,</span><span class="token plain"> origin</span><span class="token punctuation">,</span><span class="token plain"> address_space</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">address_space</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
<p>Its implicit constructors now no longer allow for unsafe casting between
pointers with different mutability and origin values. Code will need to update
to the new <code>UnsafePointer</code>, however, in the interim, users can
find-and-replace their current usages of <code>UnsafePointer</code> and rename them to
<code>LegacyUnsafePointer</code>. Another option is users can add the following import
statement to the beginning of any files relying on the old pointer type:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> memory </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> LegacyUnsafePointer </span><span class="token keyword" style="color:#af2528">as</span><span class="token plain"> UnsafePointer</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">**</span><span class="token plain">_</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># and/or if you use OpaquePointer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> memory </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> LegacyOpaquePointer </span><span class="token keyword" style="color:#af2528">as</span><span class="token plain"> OpaquePointer</span><br></div></code></pre></div></div>
<p>Users can also use the <code>as_legacy_pointer()</code> and <code>as_unsafe_pointer()</code>
conversion methods to convert between the two pointer types during this
migration period.</p>
<p><em>Note</em>: <code>LegacyUnsafePointer</code> and <code>LegacyOpaquePointer</code> will eventually be
deprecated and removed in a future version of Mojo.</p>
<p>There are a few new helpful type aliases for <code>UnsafePointer</code>:</p>
<ul>
<li class=""><code>MutUnsafePointer</code></li>
<li class=""><code>ImmutUnsafePointer</code></li>
<li class=""><code>MutOpaquePointer</code></li>
<li class=""><code>ImmutOpaquePointer</code></li>
</ul>
<p>Lastly, <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/alloc/"><code>alloc()</code></a> has been moved
from a static method on <code>UnsafePointer</code> to a free standing <code>alloc()</code> function.
Therefore, code that was written as:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> UnsafePointer</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">alloc</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Must be changed to:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> alloc</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>For more details on migrating to the new <code>UnsafePointer</code>, see the migration
guide provided in the</p>
<p><a href="https://github.com/modular/modular/blob/main/mojo/proposals/unsafe-pointer-v2.md#migration-guide-from-legacyunsafepointer-to-the-new-unsafepointer" target="_blank" rel="noopener noreferrer" class="">UnsafePointer v2 proposal</a>.</p>
</li>
<li class="">
<p>Added a <code>swap_pointees()</code> function to <code>UnsafePointer</code> as an alternative to
<code>swap()</code> when the pointers may potentially alias each other.</p>
</li>
<li class="">
<p><code>origin_cast()</code> for
<a class="" href="https://mojolang.static.modular-staging.com/docs/layout/layout_tensor/LayoutTensor/"><code>LayoutTensor</code></a>,
<code>NDBuffer</code> and <code>UnsafePointer</code> has
been deprecated and removed. <code>LayoutTensor</code> and <code>NDBuffer</code> now support a safer
<code>as_any_origin()</code> origin casting method. <code>UnsafePointer</code> has the same safe
alternative and in addition, it has a safe <code>as_immutable()</code>
casting function and explicitly unsafe <code>unsafe_mut_cast()</code> and
<code>unsafe_origin_cast()</code> casting methods.</p>
</li>
<li class="">
<p>The <code>empty</code> origin has been renamed to <code>external</code>. This origin represents a
value that's not tracked by the Mojo lifetime checker. Newly-allocated memory
from <code>alloc()</code> is returned with the origin <code>MutOrigin.external</code>.</p>
</li>
<li class="">
<p>Renamed <code>MutableOrigin</code> to <code>MutOrigin</code> and <code>ImmutableOrigin</code> to <code>ImmutOrigin</code>.</p>
</li>
<li class="">
<p>Renamed <code>MutableAnyOrigin</code> to <code>MutAnyOrigin</code> and <code>ImmutableAnyOrigin</code> to
<code>ImmutAnyOrigin</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/memory/memcpy/"><code>memcpy()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/algorithm/memory/parallel_memcpy/"><code>parallel_memcpy()</code></a> without
keyword arguments are deprecated.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="collections-and-iterators">Collections and iterators<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#collections-and-iterators" class="hash-link" aria-label="Direct link to Collections and iterators" title="Direct link to Collections and iterators" translate="no">​</a></h3>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a>
constructors now accept <code>Int</code> for length parameters instead of <code>UInt</code>. This
change makes these types more ergonomic to use with integer literals and other
<code>Int</code>-based APIs.</p>
</li>
<li class="">
<p>Added <code>Span.binary_search_by()</code> which allows binary searching with a custom
comparator function.</p>
</li>
<li class="">
<p>Added <code>unsafe_get()</code>, <code>unsafe_swap_elements()</code> and <code>unsafe_subspan()</code> to
the <code>Span</code> struct.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a> now conforms to
<code>Iterable</code> and <code>Iterator</code> acting as a collection of size 1 or 0.</p>
</li>
<li class="">
<p>New <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/builtin_slice/ContiguousSlice/"><code>ContiguousSlice</code></a>
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/builtin_slice/StridedSlice/"><code>StridedSlice</code></a>
types were added to the <code>builtin_slice</code> module to support specialization for
slicing without strides.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a> slicing without a stride now
returns a <code>Span</code>, instead of a <code>List</code> and no longer allocates memory.</p>
</li>
<li class="">
<p>Several standard library APIs have been updated to use <code>Int</code> instead of <code>UInt</code>
for improved ergonomics, eliminating the need for explicit casts when using
<code>Int</code> values (the default type for integer literals and loop indices):</p>
<ul>
<li class=""><code>BitSet[size: Int]</code> - Changed parameter from <code>UInt</code> to <code>Int</code></li>
<li class=""><code>BitSet.set(idx: Int)</code>, <code>BitSet.clear(idx: Int)</code>, <code>BitSet.toggle(idx: Int)</code>,
<code>BitSet.test(idx: Int)</code> - Changed from <code>UInt</code> to <code>Int</code></li>
<li class=""><code>String(unsafe_uninit_length: Int)</code> - Changed from <code>UInt</code> to <code>Int</code></li>
<li class=""><code>String.capacity() -&gt; Int</code> - Changed return type from <code>UInt</code> to <code>Int</code></li>
<li class=""><code>String.reserve(new_capacity: Int)</code> - Changed from <code>UInt</code> to <code>Int</code></li>
<li class=""><code>List(length: Int, fill: T)</code> - Changed from <code>UInt</code> to <code>Int</code></li>
<li class=""><code>Codepoint.unsafe_write_utf8() -&gt; Int</code> - Changed return type from <code>UInt</code> to
<code>Int</code></li>
<li class=""><code>Codepoint.utf8_byte_length() -&gt; Int</code> - Changed return type from <code>UInt</code> to
<code>Int</code></li>
</ul>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/itertools/itertools/repeat/"><code>repeat()</code></a> function to the
<code>itertools</code> module that creates an iterator which repeats an element a
specified number of times. Unlike Python's <code>itertools.repeat()</code>, infinite
iteration is not currently supported - the <code>times</code> parameter is required.
Example usage:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> itertools </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> repeat</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> val </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> repeat</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">,</span><span class="token plain"> times</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">val</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Prints: 42, 42, 42</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Tuples now support comparison operations if the element types are also
comparable. For example, one can now write <code>(1, "a") == (1, "a")</code> or
<code>(1, "a") &lt; (1, "b")</code>.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="string-and-text">String and text<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#string-and-text" class="hash-link" aria-label="Direct link to String and text" title="Direct link to String and text" translate="no">​</a></h3>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/"><code>Codepoint</code></a> now
conforms to <a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/Writable/"><code>Writable</code></a>.</p>
</li>
<li class="">
<p><code>Codepoint</code> now conforms to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/comparable/Comparable/"><code>Comparable</code></a> adding <code>__le__()</code>,
<code>__lt__()</code>, <code>__ge__()</code>, and <code>__gt__()</code> implementations.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="math-and-numeric-types">Math and numeric types<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#math-and-numeric-types" class="hash-link" aria-label="Direct link to Math and numeric types" title="Direct link to Math and numeric types" translate="no">​</a></h3>
<ul>
<li class="">
<p>The deprecated <code>DType.index</code> is now removed in favor of the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/dtype/DType/#int"><code>DType.int</code></a>.</p>
</li>
<li class="">
<p>Added <code>DType.float4_e2m1fn</code> as the 4bit float <code>e2m1</code> format. This
<code>Float4_e2m1</code> type is defined by the
<a href="https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf" target="_blank" rel="noopener noreferrer" class="">Open Compute MX Specification</a>.</p>
</li>
<li class="">
<p><code>math.isqrt()</code> has been renamed to <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/rsqrt/"><code>rsqrt()</code></a>
since it performs reciprocal square root functionality.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/"><code>math</code></a> package now has a Mojo native
implementation of <code>acos()</code>, <code>asin()</code>, <code>cbrt()</code>, and <code>erfc()</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> now implements the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/DivModable/"><code>DivModable</code></a> trait.</p>
</li>
<li class="">
<p>Implicit conversions between <code>Int</code> and <code>UInt</code> are now deprecated.</p>
<p>The <code>@implicit</code> decorator on <code>Int.__init__(UInt)</code> and <code>UInt.__init__(Int)</code>
will be removed in a future version of Mojo. Code that currently performs
implicit conversions between <code>Int</code> and <code>UInt</code> will issue a deprecation
warning, and should be updated to explicitly read <code>Int(uint_val)</code> or
<code>UInt(int_val)</code> respectively.</p>
</li>
<li class="">
<p>The <code>ImplicitlyIntable</code> trait has been removed. Types implementing this trait
could be implicitly converted to <code>Int</code>.</p>
<p><code>Bool</code> was the only Mojo standard library type to implement
<code>ImplicitlyIntable</code>. Conversions from <code>Bool</code> to <code>Int</code> can now be performed
explicitly, using <code>Int(bool-val)</code> (via the remaining <code>Intable</code> trait, which
only supports <em>explicit</em> conversions).</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gpu-support">GPU support<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#gpu-support" class="hash-link" aria-label="Direct link to GPU support" title="Direct link to GPU support" translate="no">​</a></h3>
<ul>
<li class="">
<p>Added support for NVIDIA GeForce GTX 970.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/sync/sync/syncwarp/"><code>gpu.sync.syncwarp()</code></a> now supports
Apple GPUs via <code>SIMDGROUP</code> barrier implementation. On Apple GPUs, this
provides execution synchronization for all active lanes using a <code>SIMDGROUP</code>
barrier with no memory fence. For threadgroup memory ordering, use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/sync/sync/barrier/"><code>barrier()</code></a> instead. Note that lane
masks are not supported on Apple GPUs, so the mask argument is ignored.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/primitives/warp/"><code>gpu.primitives.warp</code></a> now supports Apple
GPUs with native SIMD-group shuffle operations. This enables <code>shuffle_idx()</code>,
<code>shuffle_up()</code>, <code>shuffle_down()</code>, and <code>shuffle_xor()</code> on Apple hardware by
mapping Metal <code>simd_shuffle*</code> intrinsics to AIR
(<code>llvm.air.simd_shuffle[_up/_down/_xor]</code>) instructions, achieving feature
parity with NVIDIA and AMD backends.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/intrinsics/store_release/"><code>gpu.intrinsics.store_release()</code></a>
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/intrinsics/load_acquire/"><code>gpu.intrinsics.load_acquire()</code></a>
now support Apple silicon GPUs, expanding support for proper memory
synchronization on these devices.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/"><code>gpu</code></a> package has been reorganized into logical
subdirectories for better code organization:</p>
<ul>
<li class=""><code>gpu/primitives/</code> - Low-level GPU execution primitives (warp, block,
cluster, id, grid_controls)</li>
<li class=""><code>gpu/memory/</code> - Memory operations (async_copy, TMA, address spaces)</li>
<li class=""><code>gpu/sync/</code> - Synchronization primitives (barriers, semaphores)</li>
<li class=""><code>gpu/compute/</code> - Compute operations (mma, tensor cores, tcgen05)</li>
</ul>
<p><strong>Backward compatibility</strong>: All existing imports continue to work unchanged.
Deprecated import paths (<code>gpu.id</code>, <code>gpu.mma</code>, <code>gpu.cluster</code>,
<code>gpu.grid_controls</code>, <code>gpu.warp</code>, <code>gpu.semaphore</code>, <code>gpu.mma_sm100</code>,
<code>gpu.tcgen05</code>, <code>gpu.mma_util</code>, <code>gpu.mma_operand_descriptor</code>, and
<code>gpu.tensor_ops</code>) are preserved as re-export wrappers with deprecation
notices. Users can migrate to the new recommended import patterns at their
own pace:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Old (deprecated but still works):</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">id</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> block_idx</span><span class="token punctuation">,</span><span class="token plain"> thread_idx</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">mma </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> mma</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">mma_sm100 </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> UMMAKind</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">tcgen05 </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> tcgen05_alloc</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">semaphore </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Semaphore</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">cluster </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> cluster_sync</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># New (recommended):</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> block_idx</span><span class="token punctuation">,</span><span class="token plain"> thread_idx</span><span class="token punctuation">,</span><span class="token plain"> cluster_sync</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">compute</span><span class="token punctuation">.</span><span class="token plain">mma </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> mma</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">compute</span><span class="token punctuation">.</span><span class="token plain">mma_sm100 </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> UMMAKind</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">compute</span><span class="token punctuation">.</span><span class="token plain">tcgen05 </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> tcgen05_alloc</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">sync</span><span class="token punctuation">.</span><span class="token plain">semaphore </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Semaphore</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>_GPUAddressSpace</code> type has been removed and consolidated into
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/AddressSpace/"><code>AddressSpace</code></a>. GPU-specific
address space constants (<code>GLOBAL</code>, <code>SHARED</code>, <code>CONSTANT</code>, <code>LOCAL</code>,
<code>SHARED_CLUSTER</code>) are now available as aliases on the unified <code>AddressSpace</code>
type. The <code>GPUAddressSpace</code> alias has also been removed in favor of using
<code>AddressSpace</code> directly. Since <code>AddressSpace</code> is part of the prelude, it no
longer needs to be explicitly imported in most code.</p>
</li>
<li class="">
<p>TMA (Tensor Memory Accelerator) types have been moved to a dedicated module.
The types <code>TMADescriptor</code>, <code>TensorMapSwizzle</code>, <code>TensorMapDataType</code>,
<code>TensorMapInterleave</code>, <code>TensorMapL2Promotion</code>, <code>TensorMapFloatOOBFill</code>, and
the functions <code>create_tma_descriptor()</code> and <code>prefetch_tma_descriptor()</code> are
now available from <a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/host/nvidia/tma/"><code>gpu.host.nvidia.tma</code></a>
instead of <code>gpu.host._nvidia_cuda</code>.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-7-testing">Testing<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-testing" class="hash-link" aria-label="Direct link to Testing" title="Direct link to Testing" translate="no">​</a></h3>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/testing/assert_equal/"><code>assert_equal()</code></a> now displays
colored character-by-character diffs when string comparisons fail, making it
easier to spot differences. Differing characters are highlighted in red for
the left string and green for the right string.</p>
</li>
<li class="">
<p>The <code>mojo test</code> command has been removed. The recommended testing strategy is
to define test functions, call them explicitly from <code>main()</code> (or use the new
<code>TestSuite</code> framework), and run with <code>mojo run</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/suite/TestSuite/"><code>TestSuite</code></a> now can generate test
reports with <code>.generate_report()</code>. Also, <code>TestReport</code> and <code>TestSuiteReport</code>
structs were added.</p>
</li>
<li class="">
<p><code>TestSuite</code> now allows explicitly skipping registered tests using the
<code>TestSuite.skip()</code> method.</p>
</li>
<li class="">
<p><code>TestSuite</code> now allows basic control from CLI arguments. Tests can be skipped
from the CLI by passing test function names after a <code>--skip</code> flag, e.g.</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">mojo run test_my_stuff.mojo --skip test_currently_failing test_also_failing</span><br></div></code></pre></div></div>
<p>Similarly, the <code>--only</code> flag enables the specification of an allowlist, e.g.
the following will skip any other registered test cases:</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">mojo run test_my_stuff.mojo --only test_only_this test_this_as_well</span><br></div></code></pre></div></div>
<p>The <code>--skip-all</code> flag will skip all registered test cases in the suite. Note
that <code>--only</code> respects skipped tests, i.e. it does not run tests that are
skipped using <code>TestSuite.skip()</code>.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="system-and-os">System and OS<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#system-and-os" class="hash-link" aria-label="Direct link to System and OS" title="Direct link to System and OS" translate="no">​</a></h3>
<ul>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/isatty/"><code>os.isatty()</code></a> function to check whether a
file descriptor refers to a terminal. This function accepts an <code>Int</code> file
descriptor. If you have a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/io/file_descriptor/FileDescriptor/"><code>FileDescriptor</code></a> object,
use its <code>isatty()</code> method instead.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/compile/#sanitizeaddress"><code>sys.compile.SanitizeAddress</code></a>
providing a way for Mojo code to detect <code>--sanitize address</code> at compile time.</p>
</li>
<li class="">
<p><code>DLHandle</code> is no longer part of the public API. To access a dynamically-linked
library from Mojo, use <a class="" href="https://mojolang.static.modular-staging.com/docs/std/ffi/OwnedDLHandle/"><code>OwnedDLHandle</code></a>
instead. The new type provides RAII-based automatic resource management for
dynamically-linked libraries. <code>DLHandle</code> has been renamed to <code>_DLHandle</code> and
remains available internally for use by the standard library.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-optimizations">Performance optimizations<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#performance-optimizations" class="hash-link" aria-label="Direct link to Performance optimizations" title="Direct link to Performance optimizations" translate="no">​</a></h3>
<ul>
<li class="">
<p>Optimized float-to-string formatting performance by eliminating unnecessary
stack allocations. Internal lookup tables used for float formatting
(<code>cache_f32</code> and <code>cache_f64</code>) are now stored as global constants instead of
being materialized on the stack for each conversion. This reduces stack
overhead by ~10KB for <code>Float64</code> and ~600 bytes for <code>Float32</code> operations,
improving performance for all float formatting operations including <code>print()</code>,
string interpolation, and <code>str()</code> conversions.</p>
</li>
<li class="">
<p>Optimized number parsing performance by eliminating stack allocations for
large lookup tables. Internal lookup tables used for number parsing
(<code>powers_of_5_table</code> and <code>POWERS_OF_10</code>) are now stored as global constants
using the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/globals/global_constant/"><code>global_constant</code></a>
function instead of being materialized on the stack for each parsing
operation. This reduces stack overhead by ~10.6KB for number parsing
operations, improving performance for string-to-number conversions including
<code>atof()</code> and related float parsing operations.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-library-changes">Other library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#other-library-changes" class="hash-link" aria-label="Direct link to Other library changes" title="Direct link to Other library changes" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/hashlib/hasher/Hasher/"><code>Hasher</code></a> trait's
<code>_update_with_bytes()</code> method now takes <code>Span[Byte]</code> instead of
<code>UnsafePointer[UInt8]</code> and a separate length parameter. This change applies to
all hasher implementations including <code>AHasher</code> and <code>Fnv1a</code>.</p>
</li>
<li class="">
<p>The Philox random number generator (<code>Random</code> and <code>NormalRandom</code>) has been
moved from <code>gpu.random</code> to <a class="" href="https://mojolang.static.modular-staging.com/docs/std/random/philox/"><code>random.philox</code></a>.
These types now work on both CPU and GPU. Import them using
<code>from random import Random, NormalRandom</code> or
<code>from random.philox import Random, NormalRandom</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-7-tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Error and warning messages now preserve <code>comptime</code>/alias names in many cases,
to prevent extremely long type names for complex types. The compiler will
expand these when necessary to understand the type based on a simple
heuristic, for example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Dep</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">,</span><span class="token plain"> v</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> MyDep</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">,</span><span class="token plain"> v</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Dep</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">,</span><span class="token plain"> v</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> MyDepGetAlias0 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> MyDep</span><span class="token punctuation">.</span><span class="token plain">hello</span><br></div></code></pre></div></div>
<p>produces:</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">$ mojo t.mojo</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">t.mojo:10:29: error: 'MyDep' needs more parameters bound before accessing attributes</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">alias MyDepGetAlias0 = MyDep.hello</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">                          ^</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">t.mojo:10:29: note: 'MyDep' is aka 'alias[T: AnyType, v: T] Dep[T, v]'</span><br></div></code></pre></div></div>
<p>Please file issues in cases where more information needs to be exposed.</p>
</li>
<li class="">
<p>Error messages now preserve symbolic calls to <code>always_inline("builtin")</code>
functions rather than inlining them into the error message.</p>
</li>
<li class="">
<p>This release includes a number of improvements to elaboration errors. The
<em>elaborator</em> is the compiler pass where final parameter values are determined
and code is transformed from parametric to concrete. Common errors from
elaboration include "function instantiation failed" and "call expansion
failed" messages, when it's determined that the actual parameter values don't
match any viable function overload.</p>
<p>The elaborator also checks constraints (defined using the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/constrained/constrained/"><code>constrained()</code></a> function), so
constraint failures are generated during this pass.</p>
<ul>
<li class="">
<p>Elaboration errors now report the full call instantiation failure path.
For this Mojo file:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> fn1</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> ImplicitlyCopyable</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    constrained</span><span class="token punctuation">[</span><span class="token boolean" style="color:#af2528">False</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> fn2</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> ImplicitlyCopyable</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> fn1</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    fn2</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Now the error prints the path of <code>main -&gt; fn2 -&gt; fn1 -&gt; constrained[False]</code>
instead of just <code>constrained[False]</code>.</p>
</li>
<li class="">
<p>Elaboration errors now print out trivial parameter values with call
expansion failures. For this simple Mojo program:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> fn1</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    constrained</span><span class="token punctuation">[</span><span class="token plain">a </span><span class="token operator" style="color:#a89984">&lt;</span><span class="token plain"> b</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> fn2</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    fn1</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    fn2</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Now the error message shows <code>parameter value(s): ("a": 4, "b": 2)</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">test</span><span class="token punctuation">.</span><span class="token plain">mojo</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">14</span><span class="token punctuation">:</span><span class="token plain"> note</span><span class="token punctuation">:</span><span class="token plain"> call expansion failed </span><span class="token keyword" style="color:#af2528">with</span><span class="token plain"> parameter value</span><span class="token punctuation">(</span><span class="token plain">s</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"a"</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"b"</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    fn1</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Only string and numerical values are printed out by default now, other
values are shown as <code>...</code>. Use <code>--elaboration-error-verbose</code> to show all
parameter values.</p>
</li>
<li class="">
<p>Elaboration error messages related to the prelude are omitted by default.
The prelude is the set of APIs exported from <code>std/builtin/_startup.mojo</code>.
These APIs persist in all call expansion paths but are rarely the source of
reported errors. These APIs are now omitted by default to de-clutter
elaboration errors.</p>
<p>Use <code>--elaboration-error-include-prelude</code> to include prelude.</p>
<ul>
<li class="">
<p>By default (without prelude):</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">test</span><span class="token punctuation">.</span><span class="token plain">mojo</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">43</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">:</span><span class="token plain"> error</span><span class="token punctuation">:</span><span class="token plain"> function instantiation failed</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token operator" style="color:#a89984">^</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">test</span><span class="token punctuation">.</span><span class="token plain">mojo</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">45</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">12</span><span class="token punctuation">:</span><span class="token plain"> note</span><span class="token punctuation">:</span><span class="token plain"> call expansion failed</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      my_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>With prelude:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">oss</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">modular</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">mojo</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">stdlib</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">std</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">builtin</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">_startup</span><span class="token punctuation">.</span><span class="token plain">mojo</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">119</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">:</span><span class="token plain"> error</span><span class="token punctuation">:</span><span class="token plain"> function instantiation failed</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__mojo_main_prototype</span><span class="token punctuation">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token operator" style="color:#a89984">^</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">oss</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">modular</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">mojo</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">stdlib</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">std</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">builtin</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">_startup</span><span class="token punctuation">.</span><span class="token plain">mojo</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">119</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">:</span><span class="token plain"> note</span><span class="token punctuation">:</span><span class="token plain"> call expansion failed </span><span class="token keyword" style="color:#af2528">with</span><span class="token plain"> parameter value</span><span class="token punctuation">(</span><span class="token plain">s</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">oss</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">modular</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">mojo</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">stdlib</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">std</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">builtin</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">_startup</span><span class="token punctuation">.</span><span class="token plain">mojo</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">:</span><span class="token plain"> note</span><span class="token punctuation">:</span><span class="token plain"> function instantiation failed</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> __wrap_and_execute_main</span><span class="token punctuation">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token operator" style="color:#a89984">^</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">oss</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">modular</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">mojo</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">stdlib</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">std</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">builtin</span><span class="token operator" style="color:#a89984">/</span><span class="token plain">_startup</span><span class="token punctuation">.</span><span class="token plain">mojo</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">68</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">14</span><span class="token punctuation">:</span><span class="token plain"> note</span><span class="token punctuation">:</span><span class="token plain"> call expansion failed</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    main_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token operator" style="color:#a89984">^</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">test</span><span class="token punctuation">.</span><span class="token plain">mojo</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">43</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">:</span><span class="token plain"> note</span><span class="token punctuation">:</span><span class="token plain"> function instantiation failed</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token operator" style="color:#a89984">^</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">test</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">45</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">12</span><span class="token punctuation">:</span><span class="token plain"> note</span><span class="token punctuation">:</span><span class="token plain"> call expansion failed</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    my_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
</ul>
</li>
<li class="">
<p>An <code>--elaboration-error-limit</code> option has been added to the <code>mojo run</code> and
<code>mojo build</code> commands. This option sets a limit to the number of elaboration
errors that get printed. The default value is 20. To change the limit, use
<code>--elaboration-error-limit=</code><var>limit</var>, where a <em>limit</em> of
<code>0</code> means unlimited.</p>
</li>
</ul>
</li>
<li class="">
<p><code>--help-hidden</code> option has been added to all Mojo CLI commands to show hidden
options.</p>
</li>
<li class="">
<p><code>mojo debug</code> now rejects unknown options between <code>debug</code> and the target.</p>
</li>
<li class="">
<p>The Mojo language server will now report more coherent code actions.</p>
</li>
<li class="">
<p>The <code>mojo</code> CLI now has an <code>--experimental-fixit</code> flag that automatically
applies FixIt hints emitted by the parser. This feature is highly
experimental, and users should ensure they back up their files (or check them
into source control) before using it.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-7-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p><code>mojo test</code> has been deprecated and removed as described in the
<a href="https://forum.modular.com/t/proposal-deprecating-mojo-test/2371" target="_blank" rel="noopener noreferrer" class="">deprecation proposal</a>.
For more information, see the <a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-testing" class="">Testing</a> section.</p>
</li>
<li class="">
<p><code>LayoutTensorBuild</code> type has been removed. Use <code>LayoutTensor</code> with parameters
directly instead.</p>
</li>
<li class="">
<p>The following traits have been removed: <code>LessThanComparable</code>,
<code>GreaterThanComparable</code>, <code>LessThanOrEqualComparable</code>,
<code>GreaterThanOrEqualComparable</code>. It is extremely rare that a type would only
implement one of these, so one can just use <code>Comparable</code> instead.</p>
</li>
<li class="">
<p>All telemetry-related code has been removed from the Mojo compiler. This
should eliminate the source of some hangs and misbehavior on poor internet
connections.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-7-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5111" target="_blank" rel="noopener noreferrer" class="">Issue #5111</a>: The
<code>math.cos()</code> and <code>math.sin()</code> function can now be evaluated at compile time.</p>
</li>
<li class="">
<p>Fixed <code>IntTuple.value(i)</code> method returning incorrect values when elements are
stored as nested single-element tuples. Previously, calling
<code>Layout.row_major(M, N).stride.value(i)</code> would return negative offset values
(e.g., -65536, -65537) instead of the actual stride values. This affected any
code that accessed layout stride or shape values using the <code>value()</code> method.</p>
</li>
<li class="">
<p>Fixed <code>LayoutTensor.shape[idx]()</code> method returning incorrect values for nested
layouts. The bug occurred when accessing shape dimensions of tensors with
nested layouts like <code>((32, 2), (32, 4))</code>, where the method would return
garbage values instead of the correct product (e.g., 64).</p>
</li>
<li class="">
<p>Fixed <code>LayoutTensor</code> element-wise arithmetic operations (<code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>)
between tensors with different memory layouts. Previously, operations like
<code>a.transpose() - b</code> would produce incorrect results when the operands had
different layouts, because the same layout index was incorrectly used for both
operands. This now correctly computes separate indices for each tensor based
on its layout.</p>
</li>
<li class="">
<p>Fixed <code>LayoutTensor.shape[idx]()</code> method returning incorrect values for nested
layouts. The bug occurred when accessing shape dimensions of tensors with
nested layouts like <code>((32, 2), (32, 4))</code>, where the method would return
garbage values instead of the correct product (e.g., 64).</p>
</li>
<li class="">
<p>Fixed <code>arange()</code> function in <code>layout._fillers</code> to properly handle nested
layout structures. Previously, the function would fail when filling
tensors with nested layouts like
<code>Layout(IntTuple(IntTuple(16, 8), IntTuple(32, 2)), ...)</code> because it
attempted to extract shape values from nested tuples incorrectly.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5479" target="_blank" rel="noopener noreferrer" class="">Issue #5479</a>: Mojo crashes
when compiling standalone <code>__del__</code> function without struct context.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5500" target="_blank" rel="noopener noreferrer" class="">Issue #5500</a>: Added
comprehensive documentation to <code>gpu/host/info.mojo</code> explaining GPU target
configuration and LLVM data layout strings. The documentation now includes
detailed explanations of all MLIR target components, vendor-specific patterns
for NVIDIA/AMD/Apple GPUs, step-by-step guides for adding new GPU
architectures, and practical methods for obtaining data layout strings.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5492" target="_blank" rel="noopener noreferrer" class="">Issue #5492</a>: Fixed
<code>FileHandle</code> "rw" mode unexpectedly truncating file contents. Opening a file
with <code>open(path, "rw")</code> now correctly preserves existing file content and
allows both reading and writing, similar to Python's "r+" mode. Previously,
"rw" mode would immediately truncate the file, making it impossible to read
existing content and causing potential data loss.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3849" target="_blank" rel="noopener noreferrer" class="">Issue #3849</a>: Added support
for append mode ("a") when opening files. The <code>open()</code> function now accepts
"a" as a valid mode, which opens a file for appending. Content written to a
file opened in append mode is added to the end of the file without truncating
existing content. If the file doesn't exist, it will be created.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3208" target="_blank" rel="noopener noreferrer" class="">Issue #3208</a>: Fixed
<code>FileHandle</code> raising "unable to remove existing file" error when opening a
FIFO (named pipe) in write mode. Opening special files like FIFOs, devices,
and sockets with <code>open(path, "w")</code> now works correctly. Previously, write
mode would attempt to remove the existing file before opening it, which
failed for special files that should not be removed.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5142" target="_blank" rel="noopener noreferrer" class="">Issue #5142</a>: The
<code>sys.intrinsics.compressed_store</code> function now includes a <code>debug_assert</code> to
catch null pointer usage, providing a clear error message instead of crashing
with a segmentation fault.</p>
</li>
<li class="">
<p>The <code>sys.intrinsics.strided_load()</code>, <code>sys.intrinsics.strided_store()</code>,
<code>sys.intrinsics.masked_load()</code>, and <code>sys.intrinsics.masked_store()</code> functions
now include a <code>debug_assert()</code> to catch null pointer usage, providing a clear
error message instead of crashing with a segmentation fault.</p>
</li>
<li class="">
<p>The <code>logger</code> package now prints its levels in color.</p>
</li>
<li class="">
<p>Throwing <code>deinit</code> methods now understand that <code>self</code> is deinitialized in error
paths, avoiding redundant calls to implicit destructors and improving linear
type support.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-7-special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.25.7/#25-7-special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h2>
<p>Special thanks to our community contributors:
Brian Grenier (<a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>),
c-pozzi (<a href="https://github.com/c-pozzi" target="_blank" rel="noopener noreferrer" class="">@c-pozzi</a>),
Christoph Schlumpf (<a href="https://github.com/christoph-schlumpf" target="_blank" rel="noopener noreferrer" class="">@christoph-schlumpf</a>),
cudawarped (<a href="https://github.com/cudawarped" target="_blank" rel="noopener noreferrer" class="">@cudawarped</a>),
David Faden (revfad.com) (<a href="https://github.com/fadend" target="_blank" rel="noopener noreferrer" class="">@fadend</a>),
Ethan Wu (<a href="https://github.com/YichengDWu" target="_blank" rel="noopener noreferrer" class="">@YichengDWu</a>),
Hardik Gupta (<a href="https://github.com/hardikkgupta" target="_blank" rel="noopener noreferrer" class="">@hardikkgupta</a>),
j_rutzmoser (<a href="https://github.com/Rutzmoser" target="_blank" rel="noopener noreferrer" class="">@Rutzmoser</a>),
Johnny Lin (<a href="https://github.com/johnny19436" target="_blank" rel="noopener noreferrer" class="">@johnny19436</a>),
Jose (<a href="https://github.com/josetorrs" target="_blank" rel="noopener noreferrer" class="">@josetorrs</a>),
josiahls (<a href="https://github.com/josiahls" target="_blank" rel="noopener noreferrer" class="">@josiahls</a>),
Luis Chamberlain (<a href="https://github.com/mcgrof" target="_blank" rel="noopener noreferrer" class="">@mcgrof</a>),
Manuel Saelices (<a href="https://github.com/msaelices" target="_blank" rel="noopener noreferrer" class="">@msaelices</a>),
Marius S (<a href="https://github.com/winding-lines" target="_blank" rel="noopener noreferrer" class="">@winding-lines</a>),
martinvuyk (<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>),
MaxMeyberg (<a href="https://github.com/MaxMeyberg" target="_blank" rel="noopener noreferrer" class="">@MaxMeyberg</a>),
Monal (<a href="https://github.com/Monal-Patel" target="_blank" rel="noopener noreferrer" class="">@Monal-Patel</a>),
skrript (<a href="https://github.com/skrript" target="_blank" rel="noopener noreferrer" class="">@skrript</a>),
soraros (<a href="https://github.com/soraros" target="_blank" rel="noopener noreferrer" class="">@soraros</a>), and
Thomas Mader (<a href="https://github.com/ThomasMader" target="_blank" rel="noopener noreferrer" class="">@ThomasMader</a>).</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v0.25.6]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.25.6/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.25.6/"/>
        <updated>2025-09-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release is technically a version downgrade because we've added a 0. at]]></summary>
        <content type="html"><![CDATA[<div style="--alert-bg:var(--Elements-Orange-20-Alpha);--alert-color:var(--Elements-Orange-120-100);--alert-bd:none" class="admonitionAlertRoot_CLSZ my-6 alert alert--warning m_66836ed3 mantine-Alert-root" id="mantine-Rqlluh" role="alert" aria-label="caution" data-admonition-type="caution" aria-describedby="mantine-Rqlluh-body" aria-labelledby="mantine-Rqlluh-title"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" style="width:calc(1.25rem * var(--mantine-scale));height:calc(1.25rem * var(--mantine-scale))"><g clip-path="url(#:R1m0qlluh:)"><path fill-rule="evenodd" clip-rule="evenodd" d="m2.5 6 3.3-3.5h8.4l3.3 3.6v7.8l-3.3 3.6H5.8l-3.3-3.6V6.1ZM5.1.9H15l4.3 4.6v9.2l-4.3 4.6H5L.8 14.6V5.4L5.1.8Zm4 10v-5h1.7v5H9.2Zm0 3.4v-1.7h1.7v1.7H9.2Z" fill="currentColor"></path></g><defs><clipPath id=":R1m0qlluh:"><path fill="currentColor" d="M0 0h20v20H0z"></path></clipPath></defs></svg></div><div class="m_667c2793 mantine-Alert-body"><div class="body-14 !font-semibold sentenceCase m_6a03f287 mantine-Alert-title"><span id="mantine-Rqlluh-title" class="m_698f4f23 mantine-Alert-label">Version scheme change!</span></div><div id="mantine-Rqlluh-body" class="body-14-light m_7fa78076 mantine-Alert-message"><div class="admonitionAlertContent_Zg_U"><p>This release is technically a version <em>downgrade</em> because we've added a <code>0.</code> at
the beginning: <code>0.25.6</code>. This is necessary because we started publishing <code>mojo</code>
packages on pypi.org and it's important that we don't publish a package greater
than 1.0 yet.</p><p>Shortly after the 0.25.6 release, we "yanked" all Conda packages that are
greater than 1.0 so they won't be installed unless you explicitly specify the
version. So you'll still get the latest version like this:</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">pixi </span><span class="token function" style="color:#72761e">add</span><span class="token plain"> mojo</span><br></div></code></pre></div></div><p>And if you want an older version, just specify the version like this:</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">pixi </span><span class="token function" style="color:#72761e">add</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"mojo==25.5"</span><br></div></code></pre></div></div><p>However, if you're installing <code>mojo</code> as a Python package with <code>pip</code> or
<code>uv</code>, the oldest version available is <code>0.25.6</code>.</p></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p>You can now <strong><code>pip install mojo</code></strong>!</p>
<p>Although we still love the environment reliability of <a class="" href="https://mojolang.static.modular-staging.com/pixi/">Pixi</a>,
installing Mojo with <code>pip</code> or <code>uv</code> further enhances our interoperability
with the Python ecosystem, making it easier to <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/python/mojo-from-python/">extend your Python code with
Mojo</a>. For more information, see the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/install/">Mojo install guide</a>.</p>
</li>
<li class="">
<p>We've released a new version of the Mojo extension for Visual Studio Code that
now works with <strong>both</strong> the stable and nightly Mojo releases. You can install
the Mojo extension from either the
<a href="https://marketplace.visualstudio.com/items?itemName=modular-mojotools.vscode-mojo" target="_blank" rel="noopener noreferrer" class="">Visual Studio Code Marketplace</a>
or the
<a href="https://open-vsx.org/extension/modular-mojotools/vscode-mojo" target="_blank" rel="noopener noreferrer" class="">Open VSX Registry</a>.</p>
<p>The new extension replaces the old stable version, so if you have the stable
version installed, you can simply update it to receive the new version. If you
have the nightly version of the extension installed, you should uninstall it
and install the regular (non-nightly) version. See
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/install/#add-the-vs-code-extension">Add the VS Code extension</a>
for more information.</p>
</li>
<li class="">
<p>New <a class="" href="https://mojolang.static.modular-staging.com/docs/vision/">Mojo vision</a> doc explains our motivations and design
decisions for the Mojo language.</p>
</li>
<li class="">
<p>New <a class="" href="https://mojolang.static.modular-staging.com/docs/roadmap/">Mojo roadmap</a> provides a high-level roadmap for the
language across multiple phases.</p>
</li>
<li class="">
<p>Mojo now has support for default trait methods, allowing traits to provide
reusable behavior without requiring every conforming struct to re-implement
it. Default methods are automatically inherited by conforming structs unless
explicitly overridden. See
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/traits/#default-method-implementations">Default method implementations</a>
in the Mojo Manual for more information.</p>
</li>
<li class="">
<p>Added support for many consumer GPUs, including initial support for Apple
silicon GPUs. See <a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-gpu-support" class="">GPU support</a> for details.</p>
</li>
<li class="">
<p>The way copying is modeled in Mojo has been overhauled. The <code>Copyable</code> trait
has been updated to represent a type that can be <em>explicitly</em> copied (using a
<code>copy()</code> method), and a new <code>ImplicitlyCopyable</code> "marker" trait can be used to
<em>opt-in</em> to making a type implicitly copyable as well. <strong>This swaps the
default behavior from being implicitly copyable to being only explicitly
copyable.</strong> Several standard library traits, types, and functions now require
now require explicit <code>Copyable</code> instead of <code>ImplicitlyCopyable</code>. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-standard-library-changes" class="">Standard library changes</a> for more
information.</p>
</li>
<li class="">
<p>Uncaught exceptions or segmentation faults in Mojo programs can now
generate stack traces. This is currently only for CPU-based code. To generate
a fully symbolicated stack trace, set the <code>MOJO_ENABLE_STACK_TRACE_ON_ERROR</code>
environment variable, use <code>mojo build</code> with debug info enabled, e.g.
<code>-debug-level=line-tables</code>, and then run the resulting binary.</p>
</li>
<li class="">
<p>Major standard library improvements include:</p>
<ul>
<li class="">
<p>Making the <code>SIMD</code> type conform to <code>Comparable</code> and <code>EqualityComparable</code>,
which means that you can use <code>SIMD</code> values as <code>Dict</code> keys, among other
things. For details, see
<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-simd-and-related-types" class="">SIMD and related types</a>.</p>
</li>
<li class="">
<p>A new <code>Some[Trait]</code> utility to make it easier to
declare an argument that conforms to a trait. For details, see
<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-other-standard-library-changes" class="">Other standard library changes</a>.</p>
</li>
<li class="">
<p>Several enhancements to how iterators work in Mojo, including a new
<code>Iterable</code> trait. For more information, see
<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-collections-and-iterators-changes" class="">Collections and iterators changes</a>.</p>
</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-language-enhancements">Language enhancements<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-language-enhancements" class="hash-link" aria-label="Direct link to Language enhancements" title="Direct link to Language enhancements" translate="no">​</a></h2>
<ul>
<li class="">
<p>Mojo now allows the use of keywords in function names (after <code>def</code> and <code>fn</code>)
and in attribute references after a <code>.</code>. This notably allows the use of the
<code>match()</code> method in regex libraries even though Mojo takes this as a hard
keyword. Uses in other locations can still use backticks:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">MatchExample</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">match</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># This is ok now.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">test_match</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> MatchExample</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    a</span><span class="token punctuation">.</span><span class="token keyword" style="color:#af2528">match</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># This is ok now.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    a</span><span class="token punctuation">.</span><span class="token plain">`</span><span class="token keyword" style="color:#af2528">match</span><span class="token plain">`</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># This is still valid.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>When generating error messages for complex types involving parameter calls,
the Mojo compiler now prints functions parameter values correctly, eliminating
a large class of <code>T != T</code> errors that happen with GPU layouts.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Methods on structs may now declare their <code>self</code> argument with a <code>deinit</code>
argument convention. This argument convention is used for methods like
<code>__del__()</code> and <code>__moveinit__()</code> to indicate that they tear down the
corresponding value without needing its destructor to be run again. Beyond
these two methods, this convention can be used to declare "named" destructors,
which are methods that consume and destroy the value without themselves
running the values destructor. For example, the standard
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicPack/"><code>VariadicPack</code></a> type has these
methods:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">VariadicPack</span><span class="token punctuation">[</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># implicit destructor</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__del__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">deinit</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># move constructor</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__moveinit__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">deinit</span><span class="token plain"> existing</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># custom explicit destructor that destroys "self" by transferring all of</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># the stored elements.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> consume_elements</span><span class="token punctuation">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      elt_handler</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">idx</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> elt</span><span class="token punctuation">:</span><span class="token plain"> element_type</span><span class="token punctuation">)</span><span class="token plain"> capturing</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">deinit</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>This argument convention is a fairly narrow power-user feature that is
important to clarify the destruction model and make linear types fit into the
model better. (A linear type is just a type that has no <code>__del__()</code> method,
but provides a destructor that the user must call explicitly. Linear types are
a proposed feature that hasn't been fully implemented yet.)</p>
<ul>
<li class="">
<p>The <code>__del__()</code> and <code>__moveinit__()</code> methods should now take their <code>self</code>
and <code>existing</code> arguments as <code>deinit</code> instead of either <code>owned</code> or <code>var</code>.</p>
</li>
<li class="">
<p>The <code>__disable_del</code> keyword and statement has been removed, use <code>deinit</code>
methods instead.</p>
</li>
</ul>
</li>
<li class="">
<p>The Mojo compiler now warns about use of the deprecated <code>owned</code> keyword,
please move to <code>var</code> or <code>deinit</code> as the warning indicates.</p>
</li>
<li class="">
<p>The previously deprecated <code>@value</code> decorator has been removed.</p>
</li>
<li class="">
<p>Accesses to associated aliases and methods within a trait now require
qualified references (prepended with <code>Self.</code>), making it consistent with how
accesses to member aliases and methods in a struct require <code>self.</code>.</p>
</li>
<li class="">
<p>The Mojo compiler now raises error on implicit materialization of a
non-<code>ImplicitlyCopyable</code> object, please either mark the type to be
<code>ImplicitlyCopyable</code> or using <code>materialize[value: T]()</code> to explicitly
materialize the parameter into a dynamic value.</p>
<p>This usually happens when you generate a compile-time value using the <code>alias</code>
keyword, then assign it to a runtime variable:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> lst </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Create a compile-time list value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> dyn_list </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> lst  </span><span class="token comment" style="color:#a89984"># Implicitly materializes the compile-time value to a</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">                    </span><span class="token comment" style="color:#a89984">#  dynamically-allocated runtime value</span><br></div></code></pre></div></div>
<p>The alias is a compile-time temporary value; to assign it to a runtime
variable, Mojo must allocate memory and copy the value. Since this can result
in unexpected memory allocations when materializing a memory value like a
list, Mojo only allows implicit materializations of memory values if the type
is <code>ImplicitlyCopyable</code>, which is a signal that the type should be inexpensive
to copy.</p>
<p>You can use the <code>materialize()</code> function to explicitly materialize a value:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain"> </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> dyn_list </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> materialize</span><span class="token punctuation">[</span><span class="token plain">lst</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="copyability-changes">Copyability changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#copyability-changes" class="hash-link" aria-label="Direct link to Copyability changes" title="Direct link to Copyability changes" translate="no">​</a></h3>
<ul>
<li class="">
<p>The way copying is modeled in Mojo has been overhauled.</p>
<p>Previously, Mojo had two traits for modeling copyability:</p>
<ul>
<li class=""><code>Copyable</code> denoted a type that could be copied implicitly</li>
<li class=""><code>ExplicitlyCopyable</code> denoted a type that could only be copied with an
explicit call to a <code>.copy()</code> method.</li>
</ul>
<p>The vast majority of types defaulted to implementing <code>Copyable</code> (and therefore
were implicitly copyable), and <code>ExplicitlyCopyable</code> was partially phased in
but had significant usage limitations.</p>
<p>Now, the new <code>Copyable</code> trait instead represents a type that can be
<em>explicitly</em> copied (using <code>.copy()</code>), and a new <code>ImplicitlyCopyable</code> "marker"
trait can be used to <em>opt-in</em> to making a type implicitly copyable as well.
This swaps the default behavior from being implicitly copyable to being only
explicitly copyable.</p>
<p>The new <code>ImplicitlyCopyable</code> trait inherits from <code>Copyable</code>, and requires
no additional methods. <code>ImplicitlyCopyable</code> is known specially to the
compiler. (<code>ImplicitlyCopyable</code> types may also be copied explicitly using
<code>.copy()</code>.)</p>
<p>This makes it possible for non-implicitly-copyable types to be used with all
standard library functionality, resolving a long-standing issue with Mojo
effectively forcing implicit copyability upon all types.
This will enable Mojo programs to be more efficient and readable, with fewer
performance and correctness issues caused by accidental implicit copies.</p>
<p>With this change, types that conform to <code>Copyable</code> are no longer implicitly
copyable:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@fieldwise_init</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Person</span><span class="token punctuation">(</span><span class="token plain">Copyable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> name</span><span class="token punctuation">:</span><span class="token plain"> String</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> p </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Person</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Connor"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> p2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> p           </span><span class="token comment" style="color:#a89984"># ERROR: not implicitly copyable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> p3 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> p</span><span class="token punctuation">.</span><span class="token plain">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain">    </span><span class="token comment" style="color:#a89984"># OK: may be copied explicitly</span><br></div></code></pre></div></div>
<p>To enable a type to be implicitly copyable, declare a conformance to the
<code>ImplicitlyCopyable</code> marker trait:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@fieldwise_init</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Point</span><span class="token punctuation">(</span><span class="token plain">ImplicitlyCopyable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Float32</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Float32</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> p </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Point</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> p2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> p           </span><span class="token comment" style="color:#a89984"># OK: may be implicitly copied</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> p3 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> p</span><span class="token punctuation">.</span><span class="token plain">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain">    </span><span class="token comment" style="color:#a89984"># OK: may be explicitly copied</span><br></div></code></pre></div></div>
<p>An additional nuance is that <code>ImplicitlyCopyable</code> may only be synthesized for
types whose fields are all themselves <code>ImplicitlyCopyable</code> (and not merely
<code>Copyable</code>). If you need to make a type with any non-<code>ImplicitlyCopyable</code>
fields support implicit copying, you can declare the conformance to
<code>ImplicitlyCopyable</code>, but write the <code>__copyinit__()</code> definition manually:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Container</span><span class="token punctuation">(</span><span class="token plain">ImplicitlyCopyable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> SomeCopyableType</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> SomeImplicitlyCopyableType</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__copyinit__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> existing</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> existing</span><span class="token punctuation">.</span><span class="token plain">x</span><span class="token punctuation">.</span><span class="token plain">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain">   </span><span class="token comment" style="color:#a89984"># Copy field explicitly</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">y </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> existing</span><span class="token punctuation">.</span><span class="token plain">y</span><br></div></code></pre></div></div>
<p>For more information on copyability, see the section on
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/lifecycle/life/#copy-constructor">copy constructors</a> in the Mojo
manual.</p>
</li>
<li class="">
<p>The following standard library types and functions now require only explicit
<code>Copyable</code> for their element and argument types, enabling their use with
types that are not implicitly copyable:
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlineArray</code></a>
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/variant/Variant/"><code>Variant</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/tuple/Tuple/"><code>Tuple</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/counter/Counter/"><code>Counter</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/"><code>LinkedList</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/deque/Deque/"><code>Deque</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/reversed/reversed/"><code>reversed()</code></a>.</p>
<p>Additionally, the following traits now require explicit <code>Copyable</code> instead
of <code>ImplicitlyCopyable</code>:
<code>KeyElement</code>, <code>IntervalElement</code>, <code>ConvertibleFromPython</code></p>
</li>
<li class="">
<p>The following Mojo standard library types are no longer implicitly copyable:
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/DictEntry/"><code>DictEntry</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/OwnedKwargsDict/"><code>OwnedKwargsDict</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/"><code>LinkedList</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/Node/"><code>Node</code></a>
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/counter/Counter/"><code>Counter</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/counter/CountTuple/"><code>CountTuple</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/bitset/BitSet/"><code>BitSet</code></a>, <code>UnsafeMaybeUninitialized</code>,
<code>DLHandle</code>, <a class="" href="https://mojolang.static.modular-staging.com/docs/std/benchmark/bencher/BenchConfig/"><code>BenchConfig</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/benchmark/bencher/BenchmarkInfo/"><code>BenchmarkInfo</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/benchmark/benchmark/Report/"><code>Report</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/bindings/PythonTypeBuilder/"><code>PythonTypeBuilder</code></a>.</p>
<p>To create a copy of one of these types, call the <code>.copy()</code> method explicitly:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> l </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># ERROR: Implicit copying of `List` is no longer supported:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># var l2 = l</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Instead, perform an explicit copy:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> l2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> l</span><span class="token punctuation">.</span><span class="token plain">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Alternatively, to transfer ownership,
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/values/ownership/#transfer-arguments-var-and-">use the <code>^</code> transfer sigil</a>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> l </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> l2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> l</span><span class="token operator" style="color:#a89984">^</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># `l` is no longer accessible.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Because <code>List</code> and <code>Dict</code> are so widely used, this release stages this in by
making implicit copies of these types a warning instead of an error. This
will become a hard error in the next release of Mojo.</p>
</li>
<li class="">
<p>User types that define a custom <code>.copy()</code> method must be updated to move
that logic to <code>__copyinit__()</code>. The <code>.copy()</code> method is now provided by a
default trait implementation on <code>Copyable</code> that should not be overridden:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> Copyable</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__copyinit__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> existing</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">/</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">copy</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Self</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> Self</span><span class="token punctuation">.</span><span class="token plain">__copyinit__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-simd-and-related-types">SIMD and related types<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-simd-and-related-types" class="hash-link" aria-label="Direct link to SIMD and related types" title="Direct link to SIMD and related types" translate="no">​</a></h3>
<ul>
<li class="">
<p>The comparison operators (e.g. <code>__eq__()</code> and <code>__le__()</code>) of the <code>SIMD</code> type
now return a single <code>Bool</code> instead of a boolean <code>SIMD</code> mask. Moreover, <code>SIMD</code>
now has explicit element-wise comparisons that return boolean masks (for
example, <code>eq()</code> and <code>le()</code>).</p>
<ul>
<li class="">This allows <code>SIMD</code> to conform to the <code>EqualityComparable</code> trait, enabling
the use of <code>SIMD</code> vectors in sets, as keys to dictionaries, generic search
algorithms, etc. Moreover, <code>Scalar</code> now conforms to the <code>Comparable</code> trait,
i.e. <code>SIMD</code> conforms to <code>Comparable</code> when the size is 1.</li>
<li class="">As a consequence, <code>SIMD.__bool__()</code> no longer needs to be restricted to
scalars, and instead performs an <code>any</code> reduction on the elements of vectors.</li>
</ul>
</li>
<li class="">
<p>Non-scalar <code>SIMD</code> constructors no longer allow implicit splatting of <code>Bool</code>
values. This could lead to subtle bugs that cannot be caught at compile time,
for example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">w</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">v</span><span class="token punctuation">:</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> w</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">bool</span><span class="token punctuation">,</span><span class="token plain"> w</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> v </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># this silently reduced to a single bool, and then splat</span><br></div></code></pre></div></div>
<p>Similarly to <code>InlineArray</code>, an explicit constructor with the <code>fill</code>
keyword-only argument can be used to express the same logic more safely:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">w</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">v</span><span class="token punctuation">:</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> w</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">bool</span><span class="token punctuation">,</span><span class="token plain"> w</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">bool</span><span class="token punctuation">,</span><span class="token plain"> w</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">fill</span><span class="token operator" style="color:#a89984">=</span><span class="token punctuation">(</span><span class="token plain">v </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># highlights the splat logic</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bar</span><span class="token punctuation">(</span><span class="token plain">Scalar</span><span class="token punctuation">[</span><span class="token plain">_</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Scalar</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">bool</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># still works, since implicit splatting to a scalar is never ambiguous</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> v </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Several types that wrap MLIR types have been changed to further
encapsulate their behavior, hiding this low-level behavior from non-advanced
users.</p>
<ul>
<li class="">
<p>Types that can be constructed from raw MLIR values now require the use
of an <code>mlir_value</code> keyword-only argument initializer.
Affected types include <code>SIMD</code> and <code>UInt</code>.</p>
</li>
<li class="">
<p>Types with raw MLIR type fields have had their <code>value</code> fields renamed to
<code>_mlir_value</code>.
Affected types include: <code>Bool</code> and <code>DType</code>.</p>
</li>
</ul>
</li>
<li class="">
<p>The <code>SIMD.from_bits()</code> factory method is now a constructor, use
<code>SIMD(from_bits=...)</code> instead.</p>
</li>
<li class="">
<p><code>DType.index</code> is deprecated in favor of the new <code>DType.int</code>. Moreover, a new
<code>DType.uint</code> is added, modeling unsigned integers with widths that match the
machine word length.</p>
</li>
<li class="">
<p>The <code>index()</code> free function now returns an <code>Int</code>, instead of a raw MLIR
<code>__mlir_type.index</code> value.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="path-and-file-system-changes">Path and file system changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#path-and-file-system-changes" class="hash-link" aria-label="Direct link to Path and file system changes" title="Direct link to Path and file system changes" translate="no">​</a></h3>
<ul>
<li class="">
<p>Added the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/#parts"><code>parts()</code></a> method to the
<code>Path</code> type, for example instead of writing:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> path </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Path</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"path/to/file"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> parts </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> path</span><span class="token punctuation">.</span><span class="token plain">path</span><span class="token punctuation">.</span><span class="token plain">split</span><span class="token punctuation">(</span><span class="token plain">DIR_SEPARATOR</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>you can now write:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> path </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Path</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"path/to/file"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> parts </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> path</span><span class="token punctuation">.</span><span class="token plain">parts</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/#name"><code>name()</code></a> method to the
<code>Path</code> type, which returns the name of the file or directory.</p>
</li>
<li class="">
<p>Added <code>os.path.realpath()</code> to resolve symbolic links to an absolute path and
remove relative path components (<code>.</code>, <code>..</code>, etc.). Behaves the same as the
Python equivalent function.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-collections-and-iterators-changes">Collections and iterators changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-collections-and-iterators-changes" class="hash-link" aria-label="Direct link to Collections and iterators changes" title="Direct link to Collections and iterators changes" translate="no">​</a></h3>
<ul>
<li class="">
<p>Added an <a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/"><code>iter</code></a> module which includes the new <code>Iterable</code>
trait (and the existing <code>Iterator</code> trait). The module also provides the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/enumerate/"><code>enumerate()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/iter/"><code>iter()</code></a>, <a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/map/"><code>map()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/next/"><code>next()</code></a>, and <a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/zip/"><code>zip()</code></a>
functions. The new generic <code>zip()</code> function replaces the <code>IntTuple</code>-specific
<code>zip()</code> function provided in previous releases.</p>
<ul>
<li class=""><code>Iterable</code>'s <code>origin</code> parameter is now named <code>iterable_origin</code>
and its <code>mut</code> param is now named <code>iterator_mut</code> to avoid naming collisions.</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/Iterator/"><code>Iterator</code></a> now has a defaulted <code>bounds()</code> trait
method. This returns the lower and upper bounds of the remaining length of the
iterator. This can be used for preallocation when building or extending
collections from iterators.</p>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#take_items"><code>take_items()</code></a>
draining iterator to <code>Dict</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a> is now <code>Representable</code> if its
elements implement the <code>Representable</code> trait.</p>
</li>
<li class="">
<p>Add <code>repr()</code> support for <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/deque/Deque/"><code>Deque</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/"><code>LinkedList</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlineArray</code></a> now
automatically detects whether its element types are trivially destructible to
not invoke the destructors in its <code>__del__()</code> function. This improves
performance for trivially destructible types (such as <code>Int</code> and friends).</p>
</li>
<li class="">
<p>Similar to above, <code>List</code> now automatically does optimizations based on
whether the element types are trivial (copyable, destructible, etc). There
is no longer a <code>hint_trivial_type</code> parameter as this is done automatically
now.</p>
</li>
<li class="">
<p><code>String.splitlines()</code> now returns a <code>List[StringSlice]</code> instead of a
<code>List[String]</code>. This avoids unnecessary intermediate allocations.</p>
</li>
<li class="">
<p><code>StringSlice.from_utf8()</code> factory method is now a constructor, use
<code>StringSlice(from_utf8=...)</code> instead.</p>
</li>
<li class="">
<p><code>Span</code> now implements a generic <code>.count()</code> method which can be passed a
function that returns a boolean <code>SIMD</code> vector. The function counts how many
times it returns <code>True</code> evaluating it in a vectorized manner. This works for
any <code>Span[Scalar[D]]</code> e.g. <code>Span[Byte]</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/OptionalReg/"><code>OptionalReg</code></a> can now be
composed with <code>Bool</code> in expressions, both at comptime and runtime:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> value </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Optional</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> CompilationTarget</span><span class="token punctuation">.</span><span class="token plain">is_macos</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">and</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"is macos and value is:"</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/sort/sort/"><code>sort()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/#pop"><code>LinkedList.pop()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/#maybe_pop"><code>LinkedList.maybe_pop()</code></a>
and <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#popitem"><code>Dict.popitem()</code></a> no longer
copy elements, improving performance.</p>
</li>
<li class="">
<p>The <code>IndexList</code> and <code>DimList</code> types may no longer be implicitly constructed
from tuple values. Most existing call sites already used explicit initializer
calls (<code>IndexList(...)</code>), so implicit conversions have been removed to ensure
uniformity and consistency.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pointer-changes">Pointer changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#pointer-changes" class="hash-link" aria-label="Direct link to Pointer changes" title="Direct link to Pointer changes" translate="no">​</a></h3>
<ul>
<li class="">
<p>Removed the <code>alignment</code> parameter and <code>static_alignment_cast()</code> method from
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a>. This
<code>alignment</code> parameter that was only used by the <code>alloc()</code> static method.</p>
</li>
<li class="">
<p>Added an <code>alignment</code> keyword argument to <code>UnsafePointer.alloc()</code>. Use this
in place of the <code>alignment</code> parameter on the struct.</p>
</li>
<li class="">
<p>Removed the <code>alignment</code> parameter from <code>Span</code>, similar to <code>UnsafePointer</code>
above.</p>
</li>
<li class="">
<p>The <code>UnsafePointer.init_pointee_explicit_copy()</code> method has been removed.
Please use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#init_pointee_copy"><code>UnsafePointer.init_pointee_copy()</code></a>
instead.</p>
</li>
<li class="">
<p><code>UnsafePointer.move_pointee_into()</code> has been deprecated. Please use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#init_pointee_move_from"><code>UnsafePointer.init_pointee_move_from()</code></a>.</p>
<p><code>src.move_pointee_into(dst)</code> used a reversed argument order from intuitive
<code>LHS = RHS</code> semantics for assignment, effectively <code>RHS -&gt; LHS</code>. The new
function fixes this readability issue (<code>dst.init_pointee_move_from(src)</code>), and
additionally follows the <code>init_pointee_*()</code> naming convention of the other
existing methods for initializer a pointer memory location.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="atomic-operations">Atomic operations<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#atomic-operations" class="hash-link" aria-label="Direct link to Atomic operations" title="Direct link to Atomic operations" translate="no">​</a></h3>
<ul>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/atomic/fence/"><code>os.atomic.fence()</code></a> for creating atomic
memory fences.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> os</span><span class="token punctuation">.</span><span class="token plain">atomic </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Atomic</span><span class="token punctuation">,</span><span class="token plain"> Consistency</span><span class="token punctuation">,</span><span class="token plain"> fence</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">decrease_ref_count</span><span class="token punctuation">(</span><span class="token plain">ref_count</span><span class="token punctuation">:</span><span class="token plain"> Atomic</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">uint64</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> atomic</span><span class="token punctuation">.</span><span class="token plain">fetch_sub</span><span class="token punctuation">[</span><span class="token plain">ordering </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Consistency</span><span class="token punctuation">.</span><span class="token plain">MONOTONIC</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      fence</span><span class="token punctuation">[</span><span class="token plain">Consistency</span><span class="token punctuation">.</span><span class="token plain">ACQUIRE</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token comment" style="color:#a89984"># ...</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Add a memory ordering parameter to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/atomic/Atomic/"><code>Atomic.load()</code></a>.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="system-changes">System changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#system-changes" class="hash-link" aria-label="Direct link to System changes" title="Direct link to System changes" translate="no">​</a></h3>
<ul>
<li class="">
<p>Added <code>sys.info.platform_map()</code> for specifying types that can have different
values depending on the platform:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> sys</span><span class="token punctuation">.</span><span class="token plain">info </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> platform_map</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> EDEADLK </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> platform_map</span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"EDEADLK"</span><span class="token punctuation">,</span><span class="token plain"> linux </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">35</span><span class="token punctuation">,</span><span class="token plain"> macos </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">11</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Renamed a number of functions following functions in <code>sys.info</code> from
<code>flatcase</code> to <code>snake_case</code> names:</p>

































<table><thead><tr><th>Old name</th><th>New name</th></tr></thead><tbody><tr><td><code>alignof()</code></td><td><code>align_of()</code></td></tr><tr><td><code>bitwidthof()</code></td><td><code>bit_width_of()</code></td></tr><tr><td><code>simdbitwidth()</code></td><td><code>simd_bit_width()</code></td></tr><tr><td><code>simdbytewidth()</code></td><td><code>simd_byte_width()</code></td></tr><tr><td><code>simdwidthof()</code></td><td><code>simd_width_of()</code></td></tr><tr><td><code>sizeof()</code></td><td><code>size_of()</code></td></tr></tbody></table>
<p>The old names are deprecated, and will be removed in the next release.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-gpu-support">GPU Support<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-gpu-support" class="hash-link" aria-label="Direct link to GPU Support" title="Direct link to GPU Support" translate="no">​</a></h3>
<ul>
<li class="">
<p>Added initial support for programming Apple Silicon GPUs in Mojo. However,
MAX graphs are not yet enabled on Apple Silicon GPUs, and many hardware
features remain to be enabled.</p>
</li>
<li class="">
<p>Added support for AMD RX 6900 XT consumer-grade GPU.</p>
</li>
<li class="">
<p>Added support for AMD RDNA3.5 consumer-grade GPUs in the <code>gfx1150</code>, <code>gfx1151</code>,
and <code>gfx1152</code> architectures. Representative configurations have been added for
AMD Radeon 860M, 880M, and 8060S GPUs.</p>
</li>
<li class="">
<p>Added support for NVIDIA GTX 1080 Ti consumer-grade GPUs.</p>
</li>
<li class="">
<p>Added support for NVIDIA Tesla P100 datacenter GPUs.</p>
</li>
<li class="">
<p>Updated <code>layout_tensor()</code> copy related functions to support 2D and 3D
threadblock dimensions.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-other-standard-library-changes">Other standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-other-standard-library-changes" class="hash-link" aria-label="Direct link to Other standard library changes" title="Direct link to Other standard library changes" translate="no">​</a></h3>
<ul>
<li class="">
<p>A new <code>Some</code> utility is introduced to reduce the syntactic load of declaring
function arguments of a type that implements a given trait or trait
composition. For example, instead of writing</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Intable</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> x</span><span class="token punctuation">.</span><span class="token plain">__int__</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>one can now write:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> Some</span><span class="token punctuation">[</span><span class="token plain">Intable</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> x</span><span class="token punctuation">.</span><span class="token plain">__int__</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/reflection/type_info/get_type_name/"><code>compile.reflection.get_type_name()</code></a>
utility now has limited capability to print parametric types, e.g.
<code>SIMD[DType.float32, 4]</code> instead of just <code>SIMD</code>. If the parameter is not
printable, an <code>&lt;unprintable&gt;</code> placeholder is printed instead. A new
<code>qualified_builtins</code> flag also allows users to control the verbosity for the
most common (but not all) builtin types.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-kernels-changes">Kernels changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-kernels-changes" class="hash-link" aria-label="Direct link to Kernels changes" title="Direct link to Kernels changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>A fast matmul for SM100 is available in Mojo. Please check it out in
<a href="https://github.com/modular/modular/commits/main/max/kernels/src/linalg/matmul_sm100.mojo" target="_blank" rel="noopener noreferrer" class=""><code>matmul_sm100.mojo</code></a>.</p>
</li>
<li class="">
<p>Moved the
<a href="https://github.com/modular/modular/tree/main/max/kernels/src/comm" target="_blank" rel="noopener noreferrer" class=""><code>comm</code></a>
module from the standard library (<code>gpu.comm</code>) to the MAX AI kernels library.
Any imports that used <code>gpu.comm</code> should be updated to <code>comm</code>, instead.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p><code>mojo test</code> now ignores folders with a leading <code>.</code> in the name. This will
exclude hidden folders on Unix systems.</p>
</li>
<li class="">
<p><code>mojo doc --validate-doc-strings</code> now emits a warning when an <code>fn</code> function is
declared to raise an error (<code>raises</code>) and it has no
<a href="https://github.com/modular/modular/blob/main/mojo/stdlib/docs/docstring-style-guide.md#errors" target="_blank" rel="noopener noreferrer" class=""><code>Raises</code> docstring</a>.
However, because Mojo automatically treats all <code>def</code> functions as
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/functions/#raising-and-non-raising-functions">raising functions</a>,
we do not enforce <code>Raises</code> docs for <code>def</code> functions (to avoid noisy false
positives).</p>
</li>
<li class="">
<p>Nightly <code>mojo</code> Python wheels are now available. To install everything needed
for Mojo development in a Python virtual environment, you can use:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">pip </span><span class="token function" style="color:#72761e">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#af2528">--pre</span><span class="token plain"> mojo </span><span class="token punctuation">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"> --index-url https://dl.modular.com/public/nightly/python/simple/</span><br></div></code></pre></div></div>
<p>For more information, see the <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/install/">Mojo install guide</a>.</p>
</li>
<li class="">
<p>In preparation for a future Mojo 1.0, the <code>mojo</code> and <code>mojo-compiler</code> packages
have a <code>0.</code> prefixed to the version.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">The Mojo MLIR C bindings has been removed. This was a private package that was
used for early experimentation.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/modular/modular/issues/4695" target="_blank" rel="noopener noreferrer" class="">#4695</a> - <code>Dict.__getitem__()</code>
always returns immutable references.</li>
<li class=""><a href="https://github.com/modular/modular/issues/4705" target="_blank" rel="noopener noreferrer" class="">#4705</a> - Wrong mutability
inferred for <code>__getitem__()</code> if <code>[]</code> operator is used and <code>__setitem__()</code> is
present.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5190" target="_blank" rel="noopener noreferrer" class="">#5190</a> - Mojo compiler
crashes for a struct with two constructors taking different keyword-only
arguments.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5139" target="_blank" rel="noopener noreferrer" class="">#5139</a> - Crash on malformed
initializer.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5183" target="_blank" rel="noopener noreferrer" class="">#5183</a> - <code>Log1p()</code> not
working on GPUs.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5105" target="_blank" rel="noopener noreferrer" class="">#5105</a> - Outdated <code>CLAUDE.md</code>
docs.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5239" target="_blank" rel="noopener noreferrer" class="">#5239</a> - Contextual type not
detected inside an inline if-else.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5305" target="_blank" rel="noopener noreferrer" class="">#5305</a> - Parser Segfaults on
<code>LayoutTensor[layout]</code> with no <code>layout</code> in scope.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5260" target="_blank" rel="noopener noreferrer" class="">#5260</a> - Undefined reference
to `clock_gettime_nsec_np' when building with -O0.</li>
<li class=""><a href="https://github.com/modular/modular/issues/5307" target="_blank" rel="noopener noreferrer" class="">#5307</a> - Bad error message
when getting GPU info for unsupported GPU.</li>
<li class="">Error messages involving types using implicit parameters from
auto-parameterized types now include context information to solve a class of
incorrect "T != T" error messages common in kernel code.</li>
<li class="">Parameter inference failures now refer to parameters by their user-provided
name, rather than complaining about a mysterious "parameter #4".</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-6-special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.25.6/#25-6-special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h2>
<p>Special thanks to our community contributors:
<a href="https://github.com/AceMouse" target="_blank" rel="noopener noreferrer" class="">@AceMouse</a>,
<a href="https://github.com/Alex-Mann" target="_blank" rel="noopener noreferrer" class="">@Alex-Mann</a>,
<a href="https://github.com/christoph-schlumpf" target="_blank" rel="noopener noreferrer" class="">@christoph-schlumpf</a>,
<a href="https://github.com/cudawarped" target="_blank" rel="noopener noreferrer" class="">@cudawarped</a>,
<a href="https://github.com/cyrillzadra" target="_blank" rel="noopener noreferrer" class="">@cyrillzadra</a>,
<a href="https://github.com/dl-alexandre" target="_blank" rel="noopener noreferrer" class="">@dl-alexandre</a>,
<a href="https://github.com/farnoy" target="_blank" rel="noopener noreferrer" class="">@farnoy</a>,
<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>,
<a href="https://github.com/gryznar" target="_blank" rel="noopener noreferrer" class="">@gryznar</a>,
<a href="https://github.com/josiahls" target="_blank" rel="noopener noreferrer" class="">@josiahls</a>,
<a href="https://github.com/kyoto7250" target="_blank" rel="noopener noreferrer" class="">@kyoto7250</a>
<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>,
<a href="https://github.com/mmicu" target="_blank" rel="noopener noreferrer" class="">@mmicu</a>,
<a href="https://github.com/msaelices" target="_blank" rel="noopener noreferrer" class="">@msaelices</a>,
<a href="https://github.com/mzaks" target="_blank" rel="noopener noreferrer" class="">@mzaks</a>,
<a href="https://github.com/rd4com" target="_blank" rel="noopener noreferrer" class="">@rd4com</a>,
<a href="https://github.com/Rtosshy" target="_blank" rel="noopener noreferrer" class="">@Rtosshy</a>,
<a href="https://github.com/SasankYadati" target="_blank" rel="noopener noreferrer" class="">@SasankYadati</a>,
<a href="https://github.com/simonyjung" target="_blank" rel="noopener noreferrer" class="">@simonyjung</a>,
<a href="https://github.com/soraros" target="_blank" rel="noopener noreferrer" class="">@soraros</a>, and
<a href="https://github.com/ThomasMader" target="_blank" rel="noopener noreferrer" class="">@ThomasMader</a>.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v25.5]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.25.5/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.25.5/"/>
        <updated>2025-08-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-5-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.25.5/#25-5-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p>Mojo is now available independently as the <code>mojo</code> Conda package. In includes
the Mojo compiler, standard library, and the <code>layout</code> package (which is
heavily used in GPU programming). It also includes the Mojo developer tools:
LSP, debugger, formatter, and so on.</p>
<p>To use Python to Mojo interoperability in v25.5, you must install the
<code>modular</code> package. This will move to the <code>mojo</code> package in a future release.</p>
<p>For more details, see the <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/install/">install guide</a>.</p>
</li>
<li class="">
<p>Parametric aliases are now supported: Aliases can be specified with an
optional parameter list (just like functions). Parametric aliases are
considered first class parameter values, too. For more details, see
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/parameters/#parametric-aliases">Parametric aliases</a> in the Mojo
Manual.</p>
</li>
<li class="">
<p>Mojo API documentation now generates cross-references for parameter, argument,
and return value types.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-5-language-enhancements">Language enhancements<a href="https://mojolang.static.modular-staging.com/releases/v0.25.5/#25-5-language-enhancements" class="hash-link" aria-label="Direct link to Language enhancements" title="Direct link to Language enhancements" translate="no">​</a></h2>
<ul>
<li class="">
<p><code>@parameter for</code> now works on a broader range of collection types, enabling
things like <code>@parameter for i in [1, 2, 3]: ...</code>.</p>
</li>
<li class="">
<p><code>StringLiteral</code> now automatically materializes to a <code>String</code> when used at
runtime:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> param </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"foo"</span><span class="token plain">        </span><span class="token comment" style="color:#a89984"># type = StringLiteral</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> runtime_value </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"bar"</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># type = String</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> runtime_value2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> param </span><span class="token comment" style="color:#a89984"># type = String</span><br></div></code></pre></div></div>
<p>This enables all the behavior users expect without having to convert
or annotate types, for example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> string </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hello"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">string </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">" world"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> if_result </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"foo"</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">True</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">else</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"bar"</span><br></div></code></pre></div></div>
<p>Initializing a <code>String</code> from a <code>StringLiteral</code> initially points to static
constant memory, and does not perform any allocation until the first mutation.</p>
</li>
<li class="">
<p>The compiler now detects attempts to materialize references to compile-time
interpreter stack memory into runtime code. This includes related types that
reference memory, like slices, spans, and pointers.</p>
<p>The compiler cannot currently track the lifetime of internal stack objects
when materialized to runtime, which could cause memory leaks. Consider this
example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">test_comptime_materialize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># This is ok! Forms a comptime pointer to a comptime "stack" value of</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># String type.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> comptime_ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"foo"</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"bar"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">unsafe_ptr</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># This is ok too, dereferences the pointer at comptime, loading the byte.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> byte </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> comptime_ptr</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># This materializes a Byte from comptime to runtime.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> rt_byte </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> byte</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Error: cannot materialize to runtime value, the type contains an origin</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># referring to a compile-time value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> bad_usage </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> comptime_ptr</span><br></div></code></pre></div></div>
<p>Previously the compiler would materialize the memory representation of the
<code>String</code> value but not know it needs to be destroyed. It now detects the
problem. If you run into this, rework the code to materialize the full object
(e.g. the String) to runtime explicitly:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> comptime_string </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"foo"</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"bar"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> runtime_string </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> comptime_string</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-5-language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.5/#25-5-language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The <code>@value</code> decorator has been formally deprecated with a warning, it will
be removed in the next release of Mojo. Please move to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/fieldwise-init/"><code>@fieldwise_init</code></a>
and synthesized <code>Copyable</code> and <code>Movable</code> trait conformance.</p>
</li>
<li class="">
<p>Implicit trait conformance is removed. All conformances must be explicitly
declared.</p>
</li>
<li class="">
<p>The <code>owned</code> argument convention is being renamed to <code>var</code>. This reflects that
<code>var</code> is used consistently for a "named, scoped, owned value" already
which is exactly what the <code>owned</code> convention does. In this release, both
<code>var</code> and <code>owned</code> are allowed in an argument list, but <code>owned</code> will be removed
in a subsequent release, so please move your code over.</p>
</li>
<li class="">
<p>Function overloading is now fully supported as long as, among two function
signatures with the same list of argument types, one position is a
keyword-only argument in at least one signature, and that position differs in
argument name. Previously an edge case prevented this support when the return
types are different. For example, these two functions can now co-exist:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">get</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> idx</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">get</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token punctuation">,</span><span class="token plain"> idx2</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Float32</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-5-standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.5/#25-5-standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Indexing into a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/"><code>String</code></a> now
returns a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a>,
avoiding an allocation. <code>String.split()</code> now returns a <code>List[StringSlice]</code>.</p>
</li>
<li class="">
<p>Added support for a wider range of consumer-grade AMD hardware, including:</p>
<ul>
<li class="">AMD Radeon RX 7xxx GPUs</li>
<li class="">AMD Radeon RX 9xxx GPUs</li>
</ul>
</li>
<li class="">
<p>Compile-time checks for AMD RDNA3+ GPUs are now provided by the following
functions (which can be imported from <code>sys.info</code>):</p>
<ul>
<li class=""><code>_is_amd_rdna3()</code></li>
<li class=""><code>_is_amd_rdna4()</code></li>
<li class=""><code>_is_amd_rdna()</code></li>
</ul>
</li>
<li class="">
<p>Added WMMA matrix-multiplication instructions for RDNA3+ GPUs to help support
running AI models on those GPUs.</p>
</li>
<li class="">
<p>Added support for NVIDIA GeForce RTX 3090.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>memory.UnsafePointer</code></a> is
now implicitly included in all mojo files. Moreover,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/#opaquepointer"><code>OpaquePointer</code></a> (the
equivalent of a <code>void*</code> in C) is moved into the <code>memory</code> module, and is also
implicitly included.</p>
</li>
<li class="">
<p>Python interop changes:</p>
<ul>
<li class="">
<p>Mojo methods can now take <code>py_self: UnsafePointer[Self]</code> instead of the raw
<code>py_self: PythonObject</code>, eliminating the downcasting boilerplate required
in the common case.</p>
</li>
<li class="">
<p>Mojo functions can now natively accept
keyword arguments from Python using <code>OwnedKwargsDict[PythonObject]</code> as the
last parameter. This enables direct calling from Python with keyword
arguments without requiring wrapper functions.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> collections </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> OwnedKwargsDict</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Callable from Python as `foo(10, y=20)`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> PythonObject</span><span class="token punctuation">,</span><span class="token plain"> kwargs</span><span class="token punctuation">:</span><span class="token plain"> OwnedKwargsDict</span><span class="token punctuation">[</span><span class="token plain">PythonObject</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    y </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> kwargs</span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"y"</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/bindings/PythonTypeBuilder/"><code>PythonTypeBuilder</code></a>
utility now allows:</p>
<ul>
<li class="">Registering bindings for Python static methods, i.e. methods that don't
require an instance of the class.</li>
<li class="">Registering initializers that take arguments. Types no longer need to be
<code>Defaultable</code> to be exposed and created from Python.</li>
</ul>
</li>
<li class="">
<p>The <code>PythonConvertible</code> trait has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/conversions/ConvertibleToPython/"><code>ConvertibleToPython</code></a>.
This is now consistent with the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/conversions/ConvertibleFromPython/"><code>ConvertibleFromPython</code></a>
trait, modeling Mojo types that can be converted either to or from a
<code>PythonObject</code>.</p>
</li>
</ul>
<p>For more information, see
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/python/mojo-from-python/">Calling Mojo from Python</a> in the Mojo
Manual.</p>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/iter/Iterator/"><code>Iterator</code></a> trait for modeling
types that produce a sequence of values.</p>
<p>A type can implement <code>Iterator</code> by providing <code>__next__()</code> and <code>__has_next__()</code>
methods. This naming and behavior is based on
the Python
<a href="https://docs.python.org/3/library/collections.abc.html#collections.abc.Iterator" target="_blank" rel="noopener noreferrer" class=""><code>Iterator</code></a>
type annotation, diverging slightly due to constraints present in Mojo today.</p>
<p>Any type that implements <code>Iterator</code> can be used within <code>for</code> and
<code>@parameter for</code> looping syntax.</p>
<p><code>Iterator</code> does not currently have a variant for supporting iteration over
borrowed <code>ref</code> values.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a> type now has an <code>H</code>
parameter which allows users to provider a custom <code>Hasher</code> type.</p>
<ul>
<li class=""><code>default_hasher</code> (AHasher) and <code>default_comp_time_hasher</code> (Fnv1a)
are now provided</li>
<li class="">The <code>H</code> parameter of <code>Dict</code> defaults to <code>default_hasher</code></li>
</ul>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/hashlib/hash/Hashable/"><code>Hashable</code></a> trait has been updated to
use a new data flow strategy.</p>
<ul>
<li class="">Users are now required to implement the method
<code>fn __hash__[H: Hasher](self, mut hasher: H):</code>
(see the <code>Hashable</code> API documentation for further details).</li>
</ul>
</li>
<li class="">
<p><code>InlineArray</code> can now be constructed with a size of 0. This makes it easier to
use <code>InlineArray</code> in situations where the number of elements is generic and
could also be 0.</p>
</li>
<li class="">
<p><code>List.append(Span)</code> has been renamed to <code>List.extend(Span)</code>. It is important
for readability and consistency that <code>append()</code> always grows the length of
the list by exactly 1. <code>extend()</code> in both Python and Rust is the variant of
this operation that takes an arbitrary-length number of additional elements
(possibly 0) to add to the list.</p>
</li>
<li class="">
<p>A new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/io/"><code>io</code></a> module is available in the library. Some core
input/output APIs previously in the <code>builtin</code> module have been moved to <code>io</code>.
Currently all of the APIs in the <code>io</code> module are imported automatically. The
following APIs were moved to <code>io</code>:</p>
<ul>
<li class="">File-related APIs such as <code>open()</code>, <code>FileHandle</code> and <code>FileDescriptor</code>.</li>
<li class="">The <code>Writer</code> and <code>Writable</code> traits.</li>
<li class=""><code>input()</code> and <code>print()</code> functions.</li>
</ul>
</li>
<li class="">
<p><code>StringLiteral.strip()</code> family of functions now return a <code>StaticString</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-5-tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.5/#25-5-tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Added support for GCC-style debug flags <code>-g0</code>, <code>-g1</code>, and <code>-g2</code> to match
common compiler conventions:</p>
<ul>
<li class=""><code>-g0</code>: No debug information (alias for <code>--debug-level=none</code>).</li>
<li class=""><code>-g1</code>: Line table debug information (alias for <code>--debug-level=line-tables</code>).</li>
<li class=""><code>-g2</code>: Full debug information (alias for <code>--debug-level=full</code>).</li>
</ul>
</li>
<li class="">
<p>Added progress reporting support to the Mojo language server. This will emit
progress notifications in your editor when the server is currently parsing a
document.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-5-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.5/#25-5-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p>Various functions from the <code>sys.info</code> package have been moved to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/info/CompilationTarget/"><code>sys.info.CompilationTarget</code></a>
struct:</p>
<ul>
<li class=""><code>is_x86()</code></li>
<li class=""><code>has_sse4()</code></li>
<li class=""><code>has_avx()</code></li>
<li class=""><code>has_avx2()</code></li>
<li class=""><code>has_avx512f()</code></li>
<li class=""><code>has_fma()</code></li>
<li class=""><code>has_vnni()</code></li>
<li class=""><code>has_neon()</code></li>
<li class=""><code>has_neon_int8_dotprod()</code></li>
<li class=""><code>has_neon_int8_matmul()</code></li>
</ul>
</li>
<li class="">
<p><code>UnsafePointer.address_of()</code> has been removed. Use <code>UnsafePointer(to=...)</code>
constructor instead. Similarly, <code>Pointer.address_of()</code> has been removed.</p>
</li>
<li class="">
<p><code>DType.tensor_float32</code> has been removed due to lack of support for it in the
library and the compiler.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-5-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.5/#25-5-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4121" target="_blank" rel="noopener noreferrer" class="">#4121</a> - better error message
for <code>.value()</code> on empty <code>Optional</code>.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4566" target="_blank" rel="noopener noreferrer" class="">#4566</a> - Hang when assigning
loop variable inside <code>@parameter for</code>.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4820" target="_blank" rel="noopener noreferrer" class="">#4820</a> - <code>math.exp2</code> picks
the wrong implementation for <code>float64</code>.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4836" target="_blank" rel="noopener noreferrer" class="">#4836</a> - Else path in
<code>@parameter for</code> broken.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4499" target="_blank" rel="noopener noreferrer" class="">#4499</a> - Traits with
<code>ref self</code> cause issues when used as parameter.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4911" target="_blank" rel="noopener noreferrer" class="">#4911</a> - <code>InlineArray</code>
now calls the move constructor for its elements when moved.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3927" target="_blank" rel="noopener noreferrer" class="">#3927</a> - <code>InlineArray</code>
now can be constructed with a size of 0.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4954" target="_blank" rel="noopener noreferrer" class="">#4954</a> - <code>InlineArray</code>
now does not call the copy constructor when being moved.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5066" target="_blank" rel="noopener noreferrer" class="">#5066</a> - Correctly fill
64-bit values on AMD in <code>enqueue_fill</code>.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4982" target="_blank" rel="noopener noreferrer" class="">#4982</a> - Add <code>toggle_all</code>
to <code>BitSet</code>.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5086" target="_blank" rel="noopener noreferrer" class="">#5086</a> - Add <code>set_all</code>
to <code>BitSet</code>.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5057" target="_blank" rel="noopener noreferrer" class="">#5057</a> - Span
Performance Regression.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5051" target="_blank" rel="noopener noreferrer" class="">#5051</a> - Incorrect
<code>.modular</code> Directory Location on Linux.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5021" target="_blank" rel="noopener noreferrer" class="">#5021</a> - LSP Crashes
in VSCode when a local package exists.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/5016" target="_blank" rel="noopener noreferrer" class="">#5016</a> - Conditional
Conformance Trait Alias Bug.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-5-special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.25.5/#25-5-special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h2>
<p>Special thanks to our community contributors:</p>
<p><a href="https://github.com/zsiegel92" target="_blank" rel="noopener noreferrer" class="">@zsiegel92</a>,
<a href="https://github.com/yeison" target="_blank" rel="noopener noreferrer" class="">@yeison</a>,
<a href="https://github.com/soraros" target="_blank" rel="noopener noreferrer" class="">@soraros</a>,
<a href="https://github.com/samufi" target="_blank" rel="noopener noreferrer" class="">@samufi</a>,
<a href="https://github.com/mzaks" target="_blank" rel="noopener noreferrer" class="">@mzaks</a>,
<a href="https://github.com/mmicu" target="_blank" rel="noopener noreferrer" class="">@mmicu</a>,
<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>,
<a href="https://github.com/hardikkgupta" target="_blank" rel="noopener noreferrer" class="">@hardikkgupta</a>,
<a href="https://github.com/gustawdaniel" target="_blank" rel="noopener noreferrer" class="">@gustawdaniel</a>,
<a href="https://github.com/cyrillzadra" target="_blank" rel="noopener noreferrer" class="">@cyrillzadra</a>,
<a href="https://github.com/cnhz95" target="_blank" rel="noopener noreferrer" class="">@cnhz95</a>,
<a href="https://github.com/christoph-schlumpf" target="_blank" rel="noopener noreferrer" class="">@christoph-schlumpf</a>,
<a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>,
<a href="https://github.com/benz0li" target="_blank" rel="noopener noreferrer" class="">@benz0li</a>,
<a href="https://github.com/LeeLee26" target="_blank" rel="noopener noreferrer" class="">@LeeLee26</a>,
<a href="https://github.com/Caslyn" target="_blank" rel="noopener noreferrer" class="">@Caslyn</a>,
<a href="https://github.com/Amila-Rukshan" target="_blank" rel="noopener noreferrer" class="">@Amila-Rukshan</a>,
<a href="https://github.com/Amet13" target="_blank" rel="noopener noreferrer" class="">@Amet13</a>, and
<a href="https://github.com/AceMouse" target="_blank" rel="noopener noreferrer" class="">@AceMouse</a>.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v25.4]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.25.4/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.25.4/"/>
        <updated>2025-06-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-4-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.25.4/#25-4-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p>Mojo now supports AMD GPUs, expanding hardware compatibility beyond NVIDIA
to include AMD's GPU ecosystem. This enables Mojo applications to leverage
AMD's RDNA and CDNA architectures for high-performance computing workloads,
providing developers with greater flexibility in choosing hardware platforms
for AI and compute-intensive applications.</p>
</li>
<li class="">
<p>Primitives for working with NVIDIA Blackwell GPUs have been added,
providing low-level access to the latest GPU architecture features. These
primitives enable developers to take advantage of Blackwell's enhanced
compute capabilities, improved memory bandwidth, and advanced AI acceleration
features, including support for newer tensor operations and optimized memory
management patterns.</p>
</li>
<li class="">
<p>The Python-Mojo bindings are available as a preview release! This is the
ability to call into Mojo functions from existing Python codebases. The use
case is to speed up hot spots/slow Python code by rewriting certain portions
of your code in Mojo to achieve performance.</p>
</li>
<li class="">
<p>Mojo collection types received many enhancements.</p>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a> literals have been
reimplemented to provide Python-equivalent features and syntax, including
simple literals like <code>[1, 2, 3]</code> and <code>{k1: v1, k2: v2}</code>.</p>
</li>
<li class="">
<p>List comprehensions like
<code>[a*b for a in range(10) if isprime(a) for b in range(20)]</code>
as well as dictionary and set comprehensions are now supported.</p>
</li>
<li class="">
<p>Iterating over a collection with a <code>for</code> loop no longer requires using the
<code>[]</code> deference operator.</p>
</li>
</ul>
<p>See <a href="https://mojolang.static.modular-staging.com/releases/v0.25.4/#25-4-language-enhancements" class="">Language enhancements</a> and
<a href="https://mojolang.static.modular-staging.com/releases/v0.25.4/#25-4-standard-library-changes" class="">Standard library changes</a> for more details.</p>
</li>
<li class="">
<p>The entire MAX Kernel library is now fully open sourced! For more information,
see the <a class="" href="https://mojolang.static.modular-staging.com/docs/lib/#max-ai-kernels-library">MAX AI kernels library reference</a>
and the
<a href="https://github.com/modular/modular/tree/main/max/kernels" target="_blank" rel="noopener noreferrer" class="">MAX AI kernels source</a>.</p>
</li>
<li class="">
<p>Mojo is now available on <a href="https://godbolt.org/" target="_blank" rel="noopener noreferrer" class="">Godbolt.org</a>, which is also
known as the "Compiler Explorer".</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-4-language-enhancements">Language enhancements<a href="https://mojolang.static.modular-staging.com/releases/v0.25.4/#25-4-language-enhancements" class="hash-link" aria-label="Direct link to Language enhancements" title="Direct link to Language enhancements" translate="no">​</a></h2>
<ul>
<li class="">
<p><code>var</code> declarations in functions now support more flexible "patterns", allowing
multiple values to be declared at once, for example <code>var a, b = 4, 5</code> and
<code>var a, b : Int, Float64</code>.</p>
</li>
<li class="">
<p>Mojo now supports the use of Python-style type patterns when declaring
variables on first assignment without the <code>var</code> keyword. For example, <code>x = 4; y: UInt8 = 5</code> declares both <code>x</code> and <code>y</code>, where <code>x</code> is inferred to the default
type of <code>Int</code> whereas <code>y</code> gets the explicit type <code>UInt8</code>. Declaring variables
without <code>var</code> gives you a function-scoped name, whereas <code>var</code> makes things
scoped to the statement they are in (lexical scoping), such as the body of an
<code>if</code> statement.</p>
</li>
<li class="">
<p>Mojo now supports <code>ref</code> patterns that bind a stored LValue into a named
declaration, extending the argument convention into local function scope.</p>
<p>This can be useful when you want to do something with a reference, but don't
want the conceptual overhead of a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/Pointer/"><code>Pointer</code></a>. These are equivalent:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">use_pointer</span><span class="token punctuation">(</span><span class="token plain">your_list</span><span class="token punctuation">:</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> p </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Pointer</span><span class="token punctuation">(</span><span class="token plain">to</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">your_list</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Form a safe pointer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    use</span><span class="token punctuation">(</span><span class="token plain">p</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">     </span><span class="token comment" style="color:#a89984"># dereference it</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">use_ref</span><span class="token punctuation">(</span><span class="token plain">your_list</span><span class="token punctuation">:</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> r </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> your_list</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Bind element reference to 'r'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    use</span><span class="token punctuation">(</span><span class="token plain">r</span><span class="token punctuation">)</span><span class="token plain">     </span><span class="token comment" style="color:#a89984"># use it</span><br></div></code></pre></div></div>
<p>References are bound in their initializer and cannot be mutated afterward:
uses and mutations of the reference are interpreted as uses and mutations
of the value referenced by the value.</p>
</li>
<li class="">
<p>The Mojo compiler will now synthesize <code>__moveinit__()</code>, <code>__copyinit__()</code>, and
<code>copy()</code> methods for structs that conform to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Movable/"><code>Movable</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Copyable/"><code>Copyable</code></a>, and <code>ExplicitlyCopyable</code>
(respectively) but that do not implement the methods explicitly.</p>
</li>
<li class="">
<p>A new <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/fieldwise-init/"><code>@fieldwise_init</code></a> decorator
can be attached to structs to synthesize a field-wise initializer—an
<code>__init__()</code> method that takes the same arguments as the fields in the struct.
This gives access to this helpful capability without having to opt into the
rest of the methods that <code>@value</code> synthesizes. This decorator allows an
optional <code>@fieldwise_init("implicit")</code> form for single-element structs, which
marks the initializer as <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/implicit/"><code>@implicit</code></a>.</p>
</li>
<li class="">
<p><code>try</code> and <code>raise</code> now work at compile time.</p>
</li>
<li class="">
<p>"Initializer lists" are now supported for creating struct instances with an
inferred type based on context, for example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> SomeComplicatedType</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Example with normal initializer.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">foo</span><span class="token punctuation">(</span><span class="token plain">SomeComplicatedType</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> kwarg</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Example with initializer list.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">foo</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> kwarg</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">}</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>List literals have been redesigned to work better. They produce homogenous
sequences by invoking the <code>T(&lt;elements&gt;, __list_literal__: ())</code> constructor of
a type <code>T</code> that is inferred by context, or otherwise defaulting to the
standard library <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a> type. The
<code>ListLiteral</code> type has been removed from the standard library.</p>
</li>
<li class="">
<p>Dictionary and set literals now work and default to creating instances of the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a> types in the collections library.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-4-language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.4/#25-4-language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Implicit trait conformance is deprecated. Each instance of implicit
conformance results in a warning, but compilation still goes through. Soon it
will be upgraded into an error. Any code currently relying on implicit
conformance should either declare conformances explicitly or, if appropriate,
replace empty, non-load-bearing traits with trait compositions.</p>
</li>
<li class="">
<p>Mojo doesn't allow the use of <code>out</code> or <code>mut</code> as an argument name any longer.
Previously you could use <code>fn x(out: Int)</code>, but this causes ambiguity with
function types. Please use names like <code>output</code> instead.</p>
</li>
<li class="">
<p><code>def</code> arguments are no longer implicitly mutable. If you would like to have a
locally mutable argument, declare it <code>owned</code> explicitly.</p>
</li>
<li class="">
<p>Global (file-scope) variables are deprecated. Global variables in Mojo are
only partially implemented and are known to cause cryptic errors. Now the Mojo
compiler issues a warning on global variable usage.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-4-standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.4/#25-4-standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>GPU programming enhancements and changes:</p>
<ul>
<li class="">
<p>Mojo now supports AMD GPUs, expanding hardware compatibility beyond NVIDIA
to include AMD's GPU ecosystem. This enables Mojo applications to leverage
AMD's RDNA and CDNA architectures for high-performance computing workloads,
providing developers with greater flexibility in choosing hardware platforms
for AI and compute-intensive applications.</p>
</li>
<li class="">
<p>Primitives for working with NVIDIA Blackwell GPUs have been added, providing
low-level access to the latest GPU architecture features. These primitives
enable developers to take advantage of Blackwell's enhanced compute
capabilities, improved memory bandwidth, and advanced AI acceleration
features, including support for newer tensor operations and optimized memory
management patterns. See the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/compute/arch/tcgen05/"><code>gpu.tcgen05</code></a> module API reference
documentation for more information.</p>
</li>
<li class="">
<p>Added support for a wider range of consumer-grade hardware, including:</p>
<ul>
<li class="">NVIDIA RTX 2060 GPUs</li>
<li class="">NVIDIA RTX 4090 GPUs</li>
</ul>
</li>
<li class="">
<p>Fixed the <code>sum()</code> and <code>prefix_sum()</code> implementations in the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/primitives/block/"><code>gpu.block</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/primitives/warp/"><code>gpu.warp</code></a> modules. Previously, the
implementations have been incorrect and would either return wrong results or
hang the kernel (due to the deadlock). <a href="https://github.com/modular/modular/pull/4508" target="_blank" rel="noopener noreferrer" class="">PR
4508</a> and <a href="https://github.com/modular/modular/pull/4553" target="_blank" rel="noopener noreferrer" class="">PR
4553</a> by <a href="https://github.com/kirillbobyrev" target="_blank" rel="noopener noreferrer" class="">Kirill
Bobyrev</a> mitigate the found issues and add
tests to ensure correctness going forward.</p>
</li>
</ul>
</li>
<li class="">
<p>Collection type enhancements and changes:</p>
<ul>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a> type is now part of the
prelude, so there is no need to import it anymore.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicPack/"><code>VariadicPack</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/deque/Deque/"><code>Deque</code></a> iterators now return
references to elements directly, instead of returning
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/Pointer/"><code>Pointer</code></a>. This means that you
should no longer use the <code>[]</code> deference operator with the loop index
variable:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> states</span><span class="token punctuation">:</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">String</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"California"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"Hawaii"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"Oregon"</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Old:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> state </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> states</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">state</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># New:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> state </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> states</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># state is an immutable reference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">state</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>By default the reference is immutable. You can use the <code>ref</code> keyword
to bind the index variable as a mutable reference:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> state </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> states</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># state is a mutable reference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  state </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"!"</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Update the existing list element</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlineArray</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/deque/Deque/"><code>Deque</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/"><code>LinkedList</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> types all support construction via
list literal syntax:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">list</span><span class="token punctuation">:</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> vec</span><span class="token punctuation">:</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">uint8</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">7</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> deque</span><span class="token punctuation">:</span><span class="token plain"> Deque</span><span class="token punctuation">[</span><span class="token plain">Float64</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2.5</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> llist</span><span class="token punctuation">:</span><span class="token plain"> LinkedList</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> arr</span><span class="token punctuation">:</span><span class="token plain"> InlineArray</span><span class="token punctuation">[</span><span class="token plain">String</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"hi"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hello"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hey"</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a> support construction via dict
literal and set literal syntax, respectively:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> dict1 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain">String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"foo"</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"bar"</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">}</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Dict[String, Int]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> dict2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token number" style="color:#924f79">7</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token number" style="color:#924f79">18</span><span class="token punctuation">}</span><span class="token plain">                   </span><span class="token comment" style="color:#a89984"># Dict[Int, Int]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">set</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">}</span><span class="token plain">                               </span><span class="token comment" style="color:#a89984"># Set[Int]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Python-style list, dictionary, and set comprehensions are now supported. For
example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Basic list comprehension using a List[String]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> upper_strs </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">.</span><span class="token plain">upper</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">str</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> strs</span><span class="token punctuation">]</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># List[String]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Nested list comprehension with conditional expression</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> nums </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain">a </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> b </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> a </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> a </span><span class="token operator" style="color:#a89984">%</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> b </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">-</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># List[Int]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Dictionary comprehension</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> squares_dict </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain">num</span><span class="token punctuation">:</span><span class="token plain"> num </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> num </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> num </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Dict[Int, Int]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Set comprehension</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> unique_remainders </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain">num </span><span class="token operator" style="color:#a89984">%</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> num </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Set[Int]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/bitset/BitSet/"><code>BitSet</code></a> data structure was
added to the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/"><code>collections</code></a> package. This is a
fixed <code>BitSet</code> that simplifies working with a set of bits and performing bit
operations.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicList/"><code>VariadicList</code></a>,
<code>VariadicListMem</code>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicPack/"><code>VariadicPack</code></a> moved to the
new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/"><code>variadics</code></a> module.</p>
</li>
<li class="">
<p>The <code>CollectionElement</code> trait has been removed. You can replace any use of
it with the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Copyable/"><code>Copyable</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Movable/"><code>Movable</code></a> traits, or the
<code>Copyable &amp; Movable</code>
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/traits/#trait-compositions">trait composition</a>.</p>
</li>
</ul>
</li>
</ul>
<p>Python-Mojo interoperability enhancements and changes:</p>
<ul>
<li class="">
<p>Python objects are now constructible with list, set, and dict literal syntax,
for example: <code>var list: PythonObject = [1, "foo", 2.0]</code> will produce a Python
list containing other Python objects and <code>var d: PythonObject = {}</code> will
construct an empty dictionary.</p>
</li>
<li class="">
<p><code>Python.unsafe_get_python_exception()</code> and
<code>Python.throw_python_exception_if_error_state()</code> have been removed in favor of
<code>Python().cpython().unsafe_get_error()</code> and <code>Python().cpython().get_error()</code>.</p>
</li>
<li class="">
<p>Since virtually any operation on a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> can raise,
the <code>PythonObject</code> struct no longer implements the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Indexer/"><code>Indexer</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Intable/"><code>Intable</code></a> traits. Instead, it now
conforms to <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/IntableRaising/"><code>IntableRaising</code></a>, and
users should convert explicitly to built-in types and handle exceptions as
needed. In particular, the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#__int__"><code>PythonObject.__int__()</code></a>
method now returns a Python <code>int</code> instead of a mojo <code>Int</code>, so users must
explicitly convert to a mojo <code>Int</code> if they need one (and must handle the
exception if the conversion fails, for example due to overflow).</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> no longer
implements the following traits:</p>
<ul>
<li class="">
<p><code>Stringable</code>. Instead, the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#__str__"><code>PythonObject.__str__()</code></a>
method now returns a Python <code>str</code> object and can raise. The new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python/Python/#str"><code>Python.str()</code></a> static method can
also be used to convert an arbitrary <code>PythonObject</code> to a Python <code>str</code>
object.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/#keyelement"><code>KeyElement</code></a>. Since Python
objects may not be hashable—and even if they are, they could theoretically
raise in the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#__hash__"><code>__hash__()</code></a>
method—<code>PythonObject</code> cannot conform to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/hashlib/hash/Hashable/"><code>Hashable</code></a>. This has no effect on
accessing Python <code>dict</code> objects with <code>PythonObject</code> keys, since
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#__getitem__"><code>__getitem__()</code></a>
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#__setitem__"><code>__setitem__()</code></a>
should behave correctly and raise as needed. Two overloads of the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python/Python/#dict"><code>Python.dict()</code></a> factory function
have been added to allow constructing dictionaries from a list of key-value
tuples and from keyword arguments.</p>
</li>
<li class="">
<p><code>EqualityComparable</code>.
The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#__eq__"><code>PythonObject.__eq__()</code></a>
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#__ne__"><code>PythonObject.__ne__()</code></a>
methods need to return other <code>PythonObject</code> values to support rich
comparisons. Code that previously compared <code>PythonObject</code> values should be
wrapped in <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/Bool/#__init__"><code>Bool()</code></a> to perform
the fallible conversion explicitly: <code>if Bool(obj1 == obj2): ...</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/floatable/Floatable/"><code>Floatable</code></a>. An explicit,
raising constructor is added to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#__init__"><code>SIMD</code></a> to allow constructing
<code>Float64</code> values from <code>PythonObject</code> values that implement <code>__float__()</code>.</p>
</li>
</ul>
</li>
<li class="">
<p>A new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/bindings/PythonModuleBuilder/#def_function"><code>def_function()</code></a>
API was added to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/bindings/PythonModuleBuilder/"><code>PythonModuleBuilder</code></a> to
allow declaring Python bindings for arbitrary functions that take and return
<code>PythonObject</code>s. Similarly, a new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/bindings/PythonTypeBuilder/#def_method"><code>def_method()</code></a>
API is added to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/bindings/PythonTypeBuilder/"><code>PythonTypeBuilder</code></a> to allow
declaring Python bindings for methods that take and return <code>PythonObject</code>s.</p>
</li>
<li class="">
<p>The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/conversions/ConvertibleFromPython/"><code>ConvertibleFromPython</code></a>
trait is now public. This trait is implemented by Mojo types that can be
constructed by converting from a <code>PythonObject</code>. This is the reverse operation
of the
<code>PythonConvertible</code>
trait.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/Bool/"><code>Bool</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Int/"><code>Int</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/"><code>String</code></a> now implement
<code>ConvertibleFromPython</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#__init__"><code>PythonObject(alloc=&lt;value&gt;)</code></a>
is a new constructor that can be used to directly store Mojo values in Python
objects.</p>
<p>This initializer will fail if the type of the provided Mojo value has not
previously had a corresponding Python <code>type</code> object globally registered using
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/bindings/PythonModuleBuilder/#add_type"><code>PythonModuleBuilder.add_type()</code></a>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> has new
methods for downcasting to a pointer to a contained Mojo value, for use in
Python/Mojo interop.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Person</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> name</span><span class="token punctuation">:</span><span class="token plain"> String</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">greet</span><span class="token punctuation">(</span><span class="token plain">obj</span><span class="token punctuation">:</span><span class="token plain"> PythonObject</span><span class="token punctuation">)</span><span class="token plain"> raises</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> person </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> obj</span><span class="token punctuation">.</span><span class="token plain">downcast_value_ptr</span><span class="token punctuation">[</span><span class="token plain">Person</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Hello "</span><span class="token punctuation">,</span><span class="token plain"> person</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"from Mojo🔥!"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#downcast_value_ptr"><code>PythonObject.downcast_value_ptr[T]()</code></a>
checks if the object is a wrapped instance of the Mojo type <code>T</code>, and if so,
returns an <code>UnsafePointer[T]</code>. Otherwise, an exception is raised.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#unchecked_downcast_value_ptr"><code>PythonObject.unchecked_downcast_value_ptr[T]()</code></a>
unconditionally returns an <code>UnsafePointer[T]</code> without any runtime type
checking. This is useful when using Python/Mojo interop to optimize an inner
loop and minimizing overhead is desirable.</p>
<p>Also added an equivalent
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#__init__"><code>UnsafePointer</code></a>
initializer for downcasting from a <code>PythonObject</code>.</p>
</li>
<li class="">
<p>The <code>TypedPythonObject</code> type has been removed. Use <code>PythonObject</code> instead.</p>
</li>
<li class="">
<p>The <code>Python.is_type(x, y)</code> static method has been removed. Use the
expression <code>x is y</code> instead.</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/abort/"><code>os.abort(messages)</code></a> no longer supports a
variadic number of <a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/Writable/"><code>Writable</code></a> messages.
While this API was high-level and convenient, it generated a lot of IR for
simple and common cases, such as when we have a single <code>StringLiteral</code>
message. We now no longer need to generate a bunch of bloated IR and instead,
callers must create the <code>String</code> on their side before calling
<code>os.abort(message)</code>.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/atof/"><code>atof()</code></a> function has been
entirely rewritten as it produced incorrect results for very low and very high
exponents. It now works correctly for strings with fewer than 19 digits left
of the <code>e</code>. For example <code>1.1385616158185648648648648648616186186e-3</code> won't
work, and will raise an error. Anything that does not produce an error is now
guaranteed to be correct. While the current implementation is not the fastest,
it's based on the paper <a href="https://arxiv.org/abs/2101.11408" target="_blank" rel="noopener noreferrer" class="">Number Parsing at a Gigabyte per
Second</a> by Daniel Lemire. So with a bit of
effort to pinpoint the slow parts, we can easily have state of the art
performance in the future.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/isclose/"><code>math.isclose()</code></a> function now supports
both symmetric (Python-style) and asymmetric (NumPy-style) comparison modes
via a new <code>symmetrical</code> parameter. The parameter defaults to the newly added
symmetric support. The function now only supports floating-point types,
removing previous pseudo-support for integer and boolean types. Support added
in <a href="https://github.com/modular/modular/pull/4608" target="_blank" rel="noopener noreferrer" class="">PR 4608</a> by
<a href="https://github.com/soraros" target="_blank" rel="noopener noreferrer" class="">@soraros</a>.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/compile/"><code>compile</code></a> module now provides the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/reflection/type_info/get_type_name/"><code>get_type_name()</code></a> function
to get the fully qualified name of a type. For example,
<code>compile.get_type_name[Int]()</code> returns <code>"std.builtin.int.Int"</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-4-tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.4/#25-4-tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Added support for emitting LLVM Intermediate Representation (.ll) using
<code>--emit=llvm</code>.</p>
<ul>
<li class="">Example usage: <code>mojo build --emit=llvm YourModule.mojo</code></li>
</ul>
</li>
<li class="">
<p>Removed support for the command line option <code>--emit-llvm</code> in favor of
<code>--emit=llvm</code>.</p>
</li>
<li class="">
<p>Added support for emitting assembly code (.s) using <code>--emit=asm</code>.</p>
<ul>
<li class="">Example usage: <code>mojo build --emit=asm YourModule.mojo</code></li>
</ul>
</li>
<li class="">
<p>Added associated alias support for documentation generated via <a class="" href="https://mojolang.static.modular-staging.com/docs/cli/doc/"><code>mojo doc</code></a>.</p>
</li>
<li class="">
<p>Added struct and trait conformance list sorting support to <a class="" href="https://mojolang.static.modular-staging.com/docs/cli/format/"><code>mojo format</code></a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-4-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.4/#25-4-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p><code>VariadicPack.each()</code> and <code>VariadicPack.each_idx()</code> methods have been removed.
Use the <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/parameter/#parametric-for-statement"><code>@parameter for</code></a>
language construct to achieve this now. The <code>write_buffered()</code> and
<code>write_args()</code> functions have also been removed, to improve compile speed and
reduce register pressure on GPU, you should now unroll the variadic pack at
each call site:</p>
<p>Unbuffered:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> write</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">:</span><span class="token plain"> Writable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">mut</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> string </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token plain">args</span><span class="token punctuation">.</span><span class="token plain">__len__</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        args</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">write_to</span><span class="token punctuation">(</span><span class="token plain">string</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Buffered:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> utils</span><span class="token punctuation">.</span><span class="token plain">write </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> _WriteBufferStack</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> write</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">:</span><span class="token plain"> Writable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">mut</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> string </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">buffer</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> _WriteBufferStack</span><span class="token punctuation">(</span><span class="token plain">string</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token plain">args</span><span class="token punctuation">.</span><span class="token plain">__len__</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        args</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">write_to</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">buffer</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token builtin" style="color:#b4730e">buffer</span><span class="token punctuation">.</span><span class="token plain">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-4-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.4/#25-4-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/modular/modular/issues/1649" target="_blank" rel="noopener noreferrer" class="">#1649</a> - Trailing comma is
not supported in assignments.</li>
<li class=""><a href="https://github.com/modular/modular/issues/3415" target="_blank" rel="noopener noreferrer" class="">#3415</a> - Type annotation
fails on implicit variable declarations.</li>
<li class=""><a href="https://github.com/modular/modular/issues/4352" target="_blank" rel="noopener noreferrer" class="">#4352</a> - <code>math.sqrt</code>
products incorrect results for large inputs.</li>
<li class=""><a href="https://github.com/modular/modular/issues/4518" target="_blank" rel="noopener noreferrer" class="">#4518</a> - Try Except Causes
False Positive "Uninitialized Value".</li>
<li class=""><a href="https://github.com/modular/modular/issues/4677" target="_blank" rel="noopener noreferrer" class="">#4677</a> - <code>UIntN</code> Comparison
Yields Incorrect Result When Function Parameter Is Involved
(<code>UInt8</code>–<code>UInt64</code>).</li>
<li class=""><a href="https://github.com/modular/modular/issues/4684" target="_blank" rel="noopener noreferrer" class="">#4684</a> - Failure inferring
type of initializer list from field of struct.</li>
<li class=""><a href="https://github.com/modular/modular/issues/4668" target="_blank" rel="noopener noreferrer" class="">#4668</a> - Incorrect result for
unsigned <code>gt</code> and <code>le</code> comparisons.</li>
<li class=""><a href="https://github.com/modular/modular/issues/4694" target="_blank" rel="noopener noreferrer" class="">#4694</a> - Compiler error
handling <code>x or y</code> expressions with PythonObject.</li>
<li class=""><a href="https://github.com/modular/modular/issues/4719" target="_blank" rel="noopener noreferrer" class="">#4719</a> - <code>Dict.setdefault</code>
should not be marked with <code>raises</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.25.4/#special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h2>
<p>Special thanks to our community contributors:</p>
<p><a href="https://github.com/astrobdr" target="_blank" rel="noopener noreferrer" class="">@astrobdr</a>,
<a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>,
<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>,
<a href="https://github.com/godardt" target="_blank" rel="noopener noreferrer" class="">@godardt</a>,
<a href="https://github.com/hardikkgupta" target="_blank" rel="noopener noreferrer" class="">@hardikkgupta</a>,
<a href="https://github.com/Hundo1018" target="_blank" rel="noopener noreferrer" class="">@Hundo1018</a>,
<a href="https://github.com/kirillbobyrev" target="_blank" rel="noopener noreferrer" class="">@kirillbobyrev</a>,
<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>,
<a href="https://github.com/msaelices" target="_blank" rel="noopener noreferrer" class="">@msaelices</a>,
<a href="https://github.com/mzaks" target="_blank" rel="noopener noreferrer" class="">@mzaks</a>,
<a href="https://github.com/OwenJRJones" target="_blank" rel="noopener noreferrer" class="">@OwenJRJones</a>,
<a href="https://github.com/shogo314" target="_blank" rel="noopener noreferrer" class="">@shogo314</a>,
@sibarras,
<a href="https://github.com/simveit" target="_blank" rel="noopener noreferrer" class="">@simveit</a>,
<a href="https://github.com/soraros" target="_blank" rel="noopener noreferrer" class="">@soraros</a>,
<a href="https://github.com/sstadick" target="_blank" rel="noopener noreferrer" class="">@sstadick</a></p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v25.3]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.25.3/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.25.3/"/>
        <updated>2025-05-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.25.3/#-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p>Parts of the Mojo standard library continue to be progressively open sourced!
Packages that are open sourced now include:</p>
<ul>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/algorithm/"><code>algorithm</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/benchmark/"><code>benchmark</code></a></li>
<li class=""><code>buffer</code></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/compile/"><code>compile</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/complex/"><code>complex</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/"><code>gpu</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/logger/"><code>logger</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/runtime/"><code>runtime</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/subprocess/"><code>subprocess</code></a></li>
</ul>
<p>For more information, see the
<a class="" href="https://mojolang.static.modular-staging.com/docs/lib/#standard-library">Standard library reference</a> and the
<a href="https://github.com/modular/modular/tree/main/mojo/stdlib" target="_blank" rel="noopener noreferrer" class="">Standard library
source</a>.</p>
</li>
<li class="">
<p>Parts of the MAX AI kernels library continue to be progressively open sourced!
Packages that are open sourced now include:</p>
<ul>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/layout/"><code>layout</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/kernels/linalg/"><code>linalg</code></a></li>
</ul>
<p>For more information, see the
<a class="" href="https://mojolang.static.modular-staging.com/docs/lib/#max-ai-kernels-library">MAX AI kernels library reference</a> and the
<a href="https://github.com/modular/modular/tree/main/max/kernels" target="_blank" rel="noopener noreferrer" class="">MAX AI kernels
source</a>.</p>
</li>
<li class="">
<p>Trait compositions are now supported via the <code>&amp;</code> syntax. A trait composition
combines two traits into one logical trait whose constraint set is the union
of the constraint sets of the two original traits. For more information, see
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/traits/#trait-compositions">Trait compositions</a> in the Mojo
Manual.</p>
</li>
<li class="">
<p>String types in Mojo got several significant improvements. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.25.3/#25-3-standard-library-changes" class="">Standard library changes</a> for details.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-3-language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.3/#25-3-language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Mojo can now use
<a href="https://github.com/modular/modular/blob/main/mojo/proposals/custom-type-merging.md" target="_blank" rel="noopener noreferrer" class="">user-declared <code>__merge_with__()</code> dunder methods</a>
to merge values when using different types in ternary operations. This has
been adopted to allow pointers to work naturally with the ternary operator,
for example <code>var x = one_pointer if cond else other_pointer</code>.</p>
</li>
<li class="">
<p>Auto-parameterization now extends to struct metatypes. For example, this
declaration <code>fn foo[M: type_of(StringLiteral[_])]</code> will auto-parameterize
on the unbound parameter of <code>StringLiteral</code>.</p>
</li>
<li class="">
<p>The Mojo compiler now warns about stores to values that are never used, e.g.:
<code>x = foo(); x = bar()</code> will warn about the first assignment to <code>x</code> because
it is overwritten. You can generally address this by deleting dead code, or
by assigning to <code>_</code> instead: <code>_ = foo(); x = bar()</code>. You may also encounter
this in variable declarations, e.g. <code>var x = 0; ...; x = foo()</code>. In this
case, change the variable to being declared as uninitialized, e.g.
<code>var x: Int</code>. You may also silence this warning entirely for a variable by
renaming it to start with an underscore, e.g. <code>_x</code>.</p>
</li>
<li class="">
<p>The Mojo compiler now warns about obsolete use of <code>mut self</code> in initializers,
please switch over to <code>fn __init__(out self)</code> instead.</p>
</li>
<li class="">
<p><code>def</code> functions now require type annotations on arguments, and treat a missing
return type as returning <code>None</code>. Previously these defaulted to the <code>object</code>
type which led to a variety of problems. Support for <code>object</code> has been
removed until we have time to investigate a proper replacement.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-3-standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.3/#25-3-standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<p>String types in Mojo got several significant improvements:</p>
<ul>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/"><code>String</code></a> type no longer
copies data from
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/"><code>StringLiteral</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/#aliases"><code>StaticString</code></a> since
they are known-static-constant values. This allows us to make construction
from these values be implicit, which improves ergonomics and performance
together. It also implements the "small string optimization", which avoids
heap allocation for common short strings. On a 64-bit system, <code>String</code> can
hold up to 23 bytes inline. Its copy constructor is now O(1), performing
string data copy lazily on mutation.</p>
</li>
<li class="">
<p>The types
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/#aliases"><code>StaticString</code></a>
are now part of the prelude, there is no need to import them anymore. These
are useful for code that just needs a "view" of string data, not to own and
mutate it.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/"><code>StringLiteral</code></a> type
has been moved to a more reliable "dependent type" design where the value of
the string is carried in a parameter instead of a stored member. This defines
away a category of compiler crashes when working with <code>StringLiteral</code> that
involved attempting to manipulate a <code>StringLiteral</code> at run time. As a
consequence of this change, many APIs should switch to using
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/#aliases"><code>StaticString</code></a> instead
of <code>StringLiteral</code>. For more information on this "dependent type" design for
literals, see the proposal,
<a href="https://github.com/modular/modular/blob/main/mojo/proposals/fixing-simple-literals.md" target="_blank" rel="noopener noreferrer" class="">Fixing Simple Literals in Mojo</a>.</p>
</li>
<li class="">
<p><code>String</code> supports a new <code>String(unsafe_uninit_length=x)</code> constructor and
<code>str.resize(unsafe_uninit_length=x)</code> for clients that want to allocate space
that they intend to fill in with custom unsafe initialization patterns. The
<code>String(ptr=x, length=y)</code> constructor has been removed.</p>
</li>
<li class="">
<p><code>String</code> supports working with legacy C APIs that assume null termination,
but the details have changed: <code>String</code> is now no longer implicitly
null-terminated, which means that it is incorrect to assume that
<code>str.unsafe_ptr()</code> will return a null-terminated string. For that, use the
<code>str.unsafe_cstr_ptr()</code> method. It now requires the string to be mutable in
order to make null-termination lazy on demand. This improves performance for
strings that are not passed to legacy APIs.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a> type has been improved
similarly to <code>String</code> to reduce inconsistency and enable power-user features,
including removing adding <code>List(unsafe_uninit_length=x)</code> and
<code>list.resize(unsafe_uninit_size=n)</code> methods avoid initialized memory that the
caller plans to overwrite.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a> now conforms to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Copyable/"><code>Copyable</code></a> trait so you can store sets
in other types of collections (for example, as values in a <code>Dict</code>).</p>
</li>
<li class="">
<p>The following traits have been removed in favor of trait composition:
<code>EqualityComparableCollectionElement</code>, <code>RepresentableCollectionElement</code>,
<code>TestableCollectionElement</code>, <code>Testable</code>, <code>StringableIdentifiable</code>,
<code>StringableCollectionElement</code>, <code>IntervalPayload</code>, <code>WritableCollectionElement</code>,
<code>ComparableCollectionElement</code>, <code>BoolableCollectionElement</code>,
<code>EqualityComparableWritableCollectionElement</code>,
<code>EqualityComparableWritableCollectionElementNew</code>, <code>CollectionElementNew</code>,
<code>WritableCollectionElementNew</code>.</p>
<p>For example, you can replace <code>EqualityComparableCollectionElement</code> with
<code>EqualityComparable &amp; CollectionElement</code>. <code>StringableCollectionElement</code> was
already deprecated and scheduled to be removed; it can be replaced with
<code>Writable &amp; CollectionElement</code>.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> type is
being reworked in preparation for some improvements to Mojo-Python
interoperability:</p>
<ul>
<li class="">
<p>Since virtually any operation on a <code>PythonObject</code> can raise, the
<code>PythonObject</code> struct no longer implements the following traits:
<code>ImplicitlyBoolable</code>, <code>ImplicitlyIntable</code>.</p>
</li>
<li class="">
<p><code>PythonObject</code> is no longer implicitly constructible from tuple or list
literals. For example, <code>var x : PythonObject = [1, 2, "foo"]</code> is no longer
accepted. Instead, please use the new <code>Python.list()</code> and <code>Python.tuple()</code>
factory methods. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Python</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">list</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"foo"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>(The <code>list()</code> and <code>tuple()</code> factory methods were originally added on
<code>PythonObject</code>, but have been moved to the <code>Python</code> struct.)</p>
<p>We hope to re-enable literal syntax in the future as the standard library
matures.</p>
</li>
<li class="">
<p><code>PythonObject.from_borrowed_ptr()</code> has been removed in favor of a
constructor with a keyword-only <code>from_borrowed_ptr</code> argument.</p>
</li>
<li class="">
<p>The deprecated <code>PythonObject.to_float64()</code> method has been removed. Use the
<code>Float64()</code> constructor, instead.</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a> now has a <code>swap_elements()</code> method
which takes two indices and swaps them within the span.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/Pointer/"><code>Pointer</code></a> now has a <code>get_immutable()</code>
method to return a new <code>Pointer</code> with the same underlying data but with an
<code>ImmutableOrigin</code>.</p>
</li>
<li class="">
<p>You can now forward a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicPack/"><code>VariadicPack</code></a> where all
values are <code>Writable</code> to a writer using <code>WritableVariadicPack</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> utils</span><span class="token punctuation">.</span><span class="token plain">write </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> WritableVariadicPack</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> print_message</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">:</span><span class="token plain"> Writable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">messages</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"message:"</span><span class="token punctuation">,</span><span class="token plain"> WritableVariadicPack</span><span class="token punctuation">(</span><span class="token plain">messages</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"[end]"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">print_message</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"'x = "</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"'"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">message: 'x = 42' [end]</span><br></div></code></pre></div></div>
<p>In this example the variadic pack is buffered to the stack in the <code>print</code> call
along with the extra arguments, before doing a single syscall to write to
stdout.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/debug_assert/debug_assert/"><code>debug_assert()</code></a> in AMD GPU
kernels now behaves the same as on NVIDIA, printing the thread information and
variadic args passed after the condition:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">host </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> DeviceContext</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">kernel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    debug_assert</span><span class="token punctuation">(</span><span class="token plain">x </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"x should be 2 but is: "</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">with</span><span class="token plain"> DeviceContext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">as</span><span class="token plain"> ctx</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        ctx</span><span class="token punctuation">.</span><span class="token plain">enqueue_function</span><span class="token punctuation">[</span><span class="token plain">kernel</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">grid_dim</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> block_dim</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Running <code>mojo run -D ASSERT=all [filename]</code> will output:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">At /tmp/test.mojo:5:17: block: [0,0,0] thread: [0,0,0] Assert Error: x should be 2 but is: 1</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">At /tmp/test.mojo:5:17: block: [0,0,0] thread: [1,0,0] Assert Error: x should be 2 but is: 1</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">At /tmp/test.mojo:5:17: block: [1,0,0] thread: [0,0,0] Assert Error: x should be 2 but is: 1</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">At /tmp/test.mojo:5:17: block: [1,0,0] thread: [1,0,0] Assert Error: x should be 2 but is: 1</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/constrained/constrained/"><code>constrained[cond, string]()</code></a>
function now accepts multiple strings that are printed concatenated on
failure, so you can use:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">constrained</span><span class="token punctuation">[</span><span class="token plain">cond</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hello: "</span><span class="token punctuation">,</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token plain">n</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">": world"</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>This is more compile-time efficient and somewhat more ergonomic than using
string concatenation.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/#write_text"><code>pathlib.Path.write_text()</code></a> now
accepts a <code>Writable</code> argument instead of a <code>Stringable</code> argument. This makes
the function more efficient by removing a String allocation.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/#write_bytes"><code>pathlib.Path.write_bytes()</code></a>
which enables writing raw bytes to a file.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/path/path/split_extension/"><code>os.path.split_extension()</code></a> to
split a path into its root and extension.</p>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/path/path/is_absolute/"><code>os.path.is_absolute()</code></a> to
check if a given path is absolute or not.</p>
</li>
<li class="">
<p>One can now specify the consistency model used in atomic operations with the
default being sequential consistency. The consistency models are defined in
the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/atomic/Consistency/"><code>Consistency</code></a> struct.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/variant/Variant/#is_type_supported"><code>Variant.is_type_supported()</code></a>
method. (<a href="https://github.com/modular/modular/pull/4057" target="_blank" rel="noopener noreferrer" class="">PR #4057</a>) Example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">takes_variant</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">mut</span><span class="token plain"> arg</span><span class="token punctuation">:</span><span class="token plain"> Variant</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> arg</span><span class="token punctuation">.</span><span class="token plain">is_type_supported</span><span class="token punctuation">[</span><span class="token plain">Float64</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          arg </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Float64</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1.5</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Variant</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">,</span><span class="token plain"> Float64</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      takes_variant</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> x</span><span class="token punctuation">.</span><span class="token plain">isa</span><span class="token punctuation">[</span><span class="token plain">Float64</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">[</span><span class="token plain">Float64</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># 1.5</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>type</code> parameter of <code>SIMD</code> has been renamed to <code>dtype</code>.</p>
</li>
<li class="">
<p>The <code>is_power_of_two(x)</code> function in the <code>bit</code> package is now a method on
<code>Int</code>, <code>UInt</code> and <code>SIMD</code>.</p>
</li>
<li class="">
<p>The <code>Pointer.address_of(...)</code> and <code>UnsafePointer.address_of(...)</code> functions
have been deprecated. Please use the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/Pointer/#__init__"><code>Pointer(to=...)</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#__init__"><code>UnsafePointer(to=...)</code></a>
constructors instead. Conceptually, this is saying "please initialize a
<code>Pointer</code> (a reference, if you will) to <em>some other address in memory</em>. In the
future, these <code>address_of()</code> functions will be removed.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-3-tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.3/#25-3-tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Fixed SIMD boolean display in debugger: SIMD boolean values now display
correctly with proper bit extraction.</p>
</li>
<li class="">
<p>Improved language server performance: The language server now avoids
parsing more than it needs to, improving performance across the board.</p>
</li>
<li class="">
<p>The Mojo compiler is now able to interpret all arithmetic operations from
the <code>index</code> dialect that are used in methods of <code>Int</code> and <code>UInt</code> types.
That allows users to finally compute constants at compile time:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1000000000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">5</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> a</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><br></div></code></pre></div></div>
<p>Previously, the compiler would throw the error "cannot fold operation".</p>
</li>
<li class="">
<p>Added a new <code>--emit-llvm</code> option to the <code>mojo build</code> command, which allows
users to emit LLVM IR. When <code>--emit-llvm</code> is specified, the build process
will: compile mojo code to LLVM IR, save the IR to a .ll file (using the same
name as the input file), and print the IR to stdout for immediate inspection.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-changes">Other changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.3/#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<ul>
<li class="">The syntax for adding attributes to an <code>__mlir_op</code> is now limited to inherent
attributes (those defined by the op definition). Most users will not need to
attach other kinds of attributes, and this helps guard against typos and mojo
code getting outdated when the dialect changes.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-3-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.3/#25-3-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p>The <code>SIMD.roundeven()</code> method has been removed from the standard library.
This functionality is now handled by the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/math/round/"><code>round()</code></a> function.</p>
</li>
<li class="">
<p>Error messages about the obsolete <code>borrowed</code> and <code>inout</code> keywords, as well as
the obsolete <code>-&gt; Int as name</code> syntax have been removed.</p>
</li>
<li class="">
<p>The <code>object</code> type has been removed.</p>
</li>
<li class="">
<p><code>utils.numerics.ulp</code> has been removed. Use the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/ulp/"><code>ulp()</code></a> function from the <code>math</code> package
instead.</p>
</li>
<li class="">
<p>Several free functions that were deprecated in the 25.2 release have now been
removed. This includes:</p>
<ul>
<li class="">The <code>str</code> free function. Use the <code>String</code> constructor instead.</li>
<li class="">The <code>int</code> free function. Use the <code>Int</code> constructor instead.</li>
<li class="">The <code>bool</code> free function. Use the <code>Bool</code> constructor instead.</li>
<li class="">The <code>float</code> free function. Use the <code>Float64</code> constructor instead.</li>
</ul>
</li>
<li class="">
<p>Removed deprecated
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/host/device_context/DeviceContext/"><code>DeviceContext</code></a> methods
<code>copy_sync()</code> and <code>memset_sync()</code>.</p>
</li>
<li class="">
<p>The <code>unroll()</code> utility has been removed. Use the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/parameter/#parametric-for-statement"><code>@parameter for</code> construct</a>
instead.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> utils</span><span class="token punctuation">.</span><span class="token plain">loop </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> unroll</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Before</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@always_inline</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    body_logic</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">unroll</span><span class="token punctuation">[</span><span class="token plain">foo</span><span class="token punctuation">,</span><span class="token plain"> iteration_range</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># After</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token plain">iteration_range</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    body_logic</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>InlinedString</code> type has been removed. Use <code>String</code> instead which now
supports the Small String Optimization (SSO).</p>
</li>
<li class="">
<p>The <code>AsBytes</code> trait has been removed.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-3-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.3/#25-3-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3510" target="_blank" rel="noopener noreferrer" class="">#3510</a> - <code>PythonObject</code>
doesn't handle large <code>UInt64</code> correctly.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3847" target="_blank" rel="noopener noreferrer" class="">#3847</a> - Count leading zeros
can't be used on <code>SIMD</code> at compile time.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4198" target="_blank" rel="noopener noreferrer" class="">#4198</a> - Apple M4
is not properly detected with <code>sys.is_apple_silicon()</code>.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3662" target="_blank" rel="noopener noreferrer" class="">#3662</a> - Code using
<code>llvm.assume</code> cannot run at compile time.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4273" target="_blank" rel="noopener noreferrer" class="">#4273</a> -
<code>count_leading_zeros</code> doesn't work for vectors with size &gt; 1 at compile time.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4320" target="_blank" rel="noopener noreferrer" class="">#4320</a> - Intermittent
miscompilation with bytecode imported traits.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4281" target="_blank" rel="noopener noreferrer" class="">#4281</a> - MAX does not support
RTX 5000-series GPUs.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4163" target="_blank" rel="noopener noreferrer" class="">#4163</a> - Corner case in
initializers.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4360" target="_blank" rel="noopener noreferrer" class="">#4360</a> - Fix constructor
emission for parameterized types conforming to a trait composition.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4362" target="_blank" rel="noopener noreferrer" class="">#4362</a> - Function call with
<code>IntLiteral</code> incorrectly eliminated despite side-effects.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4431" target="_blank" rel="noopener noreferrer" class="">#4431</a> - [BUG]
Python.evaluate doesn't handle null termination correctly.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/4492" target="_blank" rel="noopener noreferrer" class="">#4492</a> - Fix
<code>StringSlice.replace</code> seg fault.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.25.3/#special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h2>
<p>Special thanks to our community contributors:</p>
<p><a href="https://github.com/auris" target="_blank" rel="noopener noreferrer" class="">@auris</a>,
<a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>,
<a href="https://github.com/christianbator" target="_blank" rel="noopener noreferrer" class="">@christianbator</a>,
<a href="https://github.com/KamilGucik" target="_blank" rel="noopener noreferrer" class="">@KamilGucik</a>,
<a href="https://github.com/kasmith11" target="_blank" rel="noopener noreferrer" class="">@kasmith11</a>,
<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>,
<a href="https://github.com/ratulb" target="_blank" rel="noopener noreferrer" class="">@ratulb</a>,
<a href="https://github.com/rd4com" target="_blank" rel="noopener noreferrer" class="">@rd4com</a>,
<a href="https://github.com/sora" target="_blank" rel="noopener noreferrer" class="">@sora</a>,
<a href="https://github.com/thatstoasty" target="_blank" rel="noopener noreferrer" class="">@thatstoasty</a>, and
<a href="https://github.com/winding-lines" target="_blank" rel="noopener noreferrer" class="">@winding-lines</a>.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v25.2]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.25.2/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.25.2/"/>
        <updated>2025-03-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.25.2/#-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p>Check out the new <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/gpu/fundamentals/">GPU basics</a> section of the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/">Mojo Manual</a> and the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/gpu/intro-tutorial/">Get started with GPU programming with Mojo and the MAX Driver</a>
tutorial for a guide to getting started with GPU programming in Mojo!</p>
</li>
<li class="">
<p>Some APIs in the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/"><code>gpu</code></a> package were enhanced to simplify
working with GPUs.</p>
<ul>
<li class="">
<p>If you're executing a GPU kernel only once, you can now skip compiling it
first before enqueueing it, and pass it directly to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/host/device_context/DeviceContext/#enqueue_function"><code>DeviceContext.enqueue_function()</code></a>.</p>
</li>
<li class="">
<p>The three separate methods on <code>DeviceContext</code> for asynchronously copying
buffers between host and GPU memory have been combined to single overloaded
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/host/device_context/DeviceContext/#enqueue_copy"><code>enqueue_copy()</code></a>
method, and the three separate methods for synchronous copies have been
combined into an overloaded
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/host/device_context/DeviceContext/#copy_sync"><code>copy_sync()</code></a>
method.</p>
</li>
<li class="">
<p>The <code>gpu.shuffle</code> module has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/primitives/warp/"><code>gpu.warp</code></a> to better reflect its purpose.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/"><code>gpu</code></a> package API documentation has been expanded,
and API documentation for the <a class="" href="https://mojolang.static.modular-staging.com/docs/layout/"><code>layout</code></a> package is
underway, beginning with core types, functions, and traits.</p>
</li>
</ul>
<p>See the <a href="https://mojolang.static.modular-staging.com/releases/v0.25.2/#25-2-standard-library-changes" class="">Standard library changes</a> section of
the changelog for more information.</p>
</li>
<li class="">
<p>The legacy <code>borrowed</code>/<code>inout</code> keywords and <code>-&gt; T as foo</code> syntax are no longer
supported and now generate a compiler error. Please move to <code>read</code>/<code>mut</code>/<code>out</code>
argument syntax instead. See <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/values/ownership/#argument-conventions">Argument
conventions</a> in the Mojo
Manual for more information.</p>
</li>
<li class="">
<p>The standard library has many changes related to strings. Notably, the <code>Char</code>
type has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/"><code>Codepoint</code></a>, to better
capture its intended purpose of storing a single Unicode codepoint.
Additionally, related method and type names have been updated as well. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.25.2/#25-2-standard-library-changes" class="">Standard library changes</a> for more details.</p>
</li>
<li class="">
<p>Support has been added for 128- and 256-bit signed and unsigned integers. This
includes the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/dtype/DType/"><code>DType</code></a> aliases
<code>DType.int128</code>, <code>DType.uint128</code>, <code>DType.int256</code>, and <code>DType.uint256</code>, as well
as <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> support for 128- and 256-bit
signed and unsigned element types. Note that this exposes capabilities (and
limitations) of LLVM, which may not always provide high performance for these
types and may have missing operations like divide, remainder, etc. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.25.2/#25-2-standard-library-changes" class="">Standard library changes</a> for more details.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-2-language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.2/#25-2-language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>References to aliases in struct types with unbound (or partially) bound
parameters sets are now allowed as long as the referenced alias doesn't
depend on any unbound parameters:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">StructWithParam</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> a1 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> a2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> a</span><span class="token operator" style="color:#a89984">+</span><span class="token number" style="color:#924f79">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  _ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithParams</span><span class="token punctuation">.</span><span class="token plain">a1 </span><span class="token comment" style="color:#a89984"># ok</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  _ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithParams</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">a2 </span><span class="token comment" style="color:#a89984"># ok</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  _ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithParams</span><span class="token punctuation">.</span><span class="token plain">a2 </span><span class="token comment" style="color:#a89984"># error, 'a' is unbound.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The Mojo compiler now warns about <code>@parameter for</code> with large loop unrolling
factor (&gt;1024 by default), which can lead to long compilation time and large
generated code size. Set <code>--loop-unrolling-warn-threshold</code> to change default
value to a different threshold or to <code>0</code> to disable the warning.</p>
</li>
<li class="">
<p>The Mojo compile-time interpreter can now handle many more LLVM intrinsics,
including ones that return floating point values. This allows functions like
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/round/"><code>round()</code></a> to be constant folded when used
in a compile-time context.</p>
</li>
<li class="">
<p>The Mojo compiler now has only one compile-time interpreter. It had two
previously: one to handle a few cases that were important for dependent types
in the parser (but which also had many limitations), and the primary one that
ran at "instantiation" time which is fully general. This was confusing and
caused a wide range of bugs. We've now removed the special case parse-time
interpreter, replacing it with a more general solution for dependent types.
This change should be invisible to most users, but should resolve a number of
long-standing bugs and significantly simplifies the compiler implementation,
allowing us to move faster.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-2-standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.2/#25-2-standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlineArray</code></a> have been
added to the prelude. You now no longer need to explicitly import these types
to use them in your program.</p>
</li>
<li class="">
<p>GPU programming changes:</p>
<ul>
<li class="">
<p>You can now skip compiling a GPU kernel first before enqueueing it, and pass
it directly to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/host/device_context/DeviceContext/#enqueue_function"><code>DeviceContext.enqueue_function()</code></a>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">host </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> DeviceContext</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Hello from GPU"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">with</span><span class="token plain"> DeviceContext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">as</span><span class="token plain"> ctx</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    ctx</span><span class="token punctuation">.</span><span class="token plain">enqueue_function</span><span class="token punctuation">[</span><span class="token plain">func</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">grid_dim</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> block_dim</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>However, if you're reusing the same function and parameters multiple times,
this incurs some overhead of around 50-500 nanoseconds per enqueue. So you
can still compile the function first with
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/host/device_context/DeviceContext/#compile_function"><code>DeviceContext.compile_function()</code></a>
and pass it to <code>DeviceContext.enqueue_function()</code> like this:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">with</span><span class="token plain"> DeviceContext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">as</span><span class="token plain"> ctx</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> compiled_func </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> ctx</span><span class="token punctuation">.</span><span class="token plain">compile_function</span><span class="token punctuation">[</span><span class="token plain">func</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Multiple kernel launches with the same function/parameters</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  ctx</span><span class="token punctuation">.</span><span class="token plain">enqueue_function</span><span class="token punctuation">(</span><span class="token plain">compiled_func</span><span class="token punctuation">,</span><span class="token plain"> grid_dim</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> block_dim</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  ctx</span><span class="token punctuation">.</span><span class="token plain">enqueue_function</span><span class="token punctuation">(</span><span class="token plain">compiled_func</span><span class="token punctuation">,</span><span class="token plain"> grid_dim</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> block_dim</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The following methods on
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/host/device_context/DeviceContext/"><code>DeviceContext</code></a>:</p>
<ul>
<li class=""><code>enqueue_copy_to_device()</code></li>
<li class=""><code>enqueue_copy_from_device()</code></li>
<li class=""><code>enqueue_copy_device_to_device()</code></li>
</ul>
<p>have been combined to a single overloaded</p>
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/host/device_context/DeviceContext/#enqueue_copy"><code>enqueue_copy()</code></a>
method. Additionally, the methods:</p>
<ul>
<li class=""><code>copy_to_device_sync()</code></li>
<li class=""><code>copy_from_device_sync()</code></li>
<li class=""><code>copy_device_to_device_sync()</code></li>
</ul>
<p>have been combined into an overloaded
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/host/device_context/DeviceContext/#copy_sync"><code>copy_sync()</code></a>
method.</p>
</li>
<li class="">
<p>The <code>gpu.shuffle</code> module has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/primitives/warp/"><code>gpu.warp</code></a> to better reflect its purpose.
For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> gpu</span><span class="token punctuation">.</span><span class="token plain">warp </span><span class="token keyword" style="color:#af2528">as</span><span class="token plain"> warp</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> val0 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> warp</span><span class="token punctuation">.</span><span class="token plain">shuffle_down</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">,</span><span class="token plain"> offset</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> val1 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> warp</span><span class="token punctuation">.</span><span class="token plain">broadcast</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
</li>
<li class="">
<p>Support has been added for 128- and 256-bit signed and unsigned integers.</p>
<ul>
<li class="">
<p>The following aliases have been added to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/dtype/DType/"><code>DType</code></a> struct: <code>DType.int128</code>,
<code>DType.uint128</code>, <code>DType.int256</code>, and <code>DType.uint256</code>.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> type now supports 128- and
256-bit signed and unsigned element types. Note that this exposes
capabilities (and limitations) of LLVM, which may not always provide high
performance for these types and may have missing operations like divide,
remainder, etc.</p>
</li>
<li class="">
<p>The following <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/#aliases"><code>Scalar</code></a> aliases for
1-element <code>SIMD</code> values have been added: <code>Int128</code>, <code>UInt128</code>, <code>Int256</code>, and
<code>UInt256</code>.</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/"><code>String</code></a> and friends:</p>
<ul>
<li class="">
<p>The <code>Char</code> type has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/"><code>Codepoint</code></a>, to
better capture its intended purpose of storing a single Unicode codepoint.
Additionally, related method and type names have been updated as well,
including:</p>
<ul>
<li class="">
<p><code>StringSlice.chars()</code> and <code>String.chars()</code> to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#codepoints"><code>StringSlice.codepoints()</code></a>
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#codepoints"><code>String.codepoints()</code></a>,
respectively</p>
</li>
<li class="">
<p><code>StringSlice.char_slices()</code> and <code>String.char_slices()</code> to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#codepoint_slices"><code>StringSlice.codepoint_slices()</code></a>
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#codepoint_slices"><code>String.codepoint_slices()</code></a>,
respectively</p>
</li>
<li class="">
<p><code>CharsIter</code> to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/CodepointsIter/"><code>CodepointsIter</code></a></p>
</li>
<li class="">
<p><code>Char.unsafe_decode_utf8_char()</code> to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/#unsafe_decode_utf8_codepoint"><code>Codepoint.unsafe_decode_utf8_codepoint()</code></a></p>
</li>
<li class="">
<p>Made the iterator type returned by the string <code>codepoint_slices()</code> methods
public as
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/CodepointSliceIter/"><code>CodepointSliceIter</code></a>.</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a>
now supports several additional methods moved from
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/"><code>String</code></a>. The existing
<code>String</code> methods have been updated to instead call the corresponding new
<code>StringSlice</code> methods:</p>
<ul>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#center"><code>center()</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#is_ascii_digit"><code>is_ascii_digit()</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#is_ascii_printable"><code>is_ascii_printable()</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#islower"><code>islower()</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#isupper"><code>isupper()</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#ljust"><code>ljust()</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#lower"><code>lower()</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#rjust"><code>rjust()</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#split"><code>split()</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#upper"><code>upper()</code></a></li>
</ul>
</li>
<li class="">
<p>Added a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#is_codepoint_boundary"><code>StringSlice.is_codepoint_boundary()</code></a>
method for querying if a given byte index is a boundary between encoded
UTF-8 codepoints.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#__getitem__"><code>StringSlice.__getitem__(Slice)</code></a>
now raises an error if the provided slice start and end positions do not
fall on a valid codepoint boundary. This prevents construction of malformed
<code>StringSlice</code> values, which could lead to memory unsafety or undefined
behavior. For example, given a string containing multi-byte encoded data,
like:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">str_slice </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"Hi👋!"</span><br></div></code></pre></div></div>
<p>and whose in-memory and decoded data looks like:</p>

<table style="border-collapse:collapse"><colgroup>
    <col style="border:1px solid black">
    <col style="border:1px solid black;width:3em" span="7">
</colgroup><tbody style="text-align:center">
      <tr style="border:1px solid black">
          <td style="text-align:left;font-weight:bold">String</td>
          <td colspan="7">Hi👋!</td>
      </tr>
      <tr style="border:1px solid black">
          <td style="text-align:left;font-weight:bold">Codepoint Characters</td>
          <td>H</td>
          <td>i</td>
          <td colspan="4">👋</td>
          <td>!</td>
      </tr>
      <tr style="border:1px solid black">
          <td style="text-align:left;font-weight:bold">Codepoints</td>
          <td>72</td>
          <td>105</td>
          <td colspan="4">128075</td>
          <td>33</td>
      </tr>
      <tr style="border:1px solid black">
          <td style="text-align:left;font-weight:bold">Bytes</td>
          <td>72</td>
          <td>105</td>
          <td>240</td>
          <td>159</td>
          <td>145</td>
          <td>139</td>
          <td>33</td>
      </tr>
      <tr style="border:1px solid black">
          <td style="text-align:left;font-weight:bold">Index</td>
          <td>0</td>
          <td>1</td>
          <td>2</td>
          <td>3</td>
          <td>4</td>
          <td>5</td>
          <td>6</td>
      </tr></tbody></table>
<p>attempting to slice bytes <code>[3-5)</code> with <code>str_slice[3:5]</code> would previously
erroneously produce a malformed <code>StringSlice</code> as output that did not
correctly decode to anything:</p>

<table style="border-collapse:collapse"><colgroup>
    <col style="border:1px solid black">
    <col style="border:1px solid black;width:3em" span="2">
</colgroup><tbody style="text-align:center">
      <tr style="border:1px solid black">
          <td style="text-align:left;font-weight:bold">String</td>
          <td colspan="2" style="font-style:italic">invalid</td>
      </tr>
      <tr style="border:1px solid black">
          <td style="text-align:left;font-weight:bold">Codepoint Characters</td>
          <td colspan="2" style="font-style:italic">invalid</td>
      </tr>
      <tr style="border:1px solid black">
          <td style="text-align:left;font-weight:bold">Codepoints</td>
          <td colspan="2" style="font-style:italic">invalid</td>
      </tr>
      <tr style="border:1px solid black">
          <td style="text-align:left;font-weight:bold">Bytes</td>
          <td>159</td>
          <td>145</td>
      </tr>
      <tr style="border:1px solid black">
          <td style="text-align:left;font-weight:bold">Index</td>
          <td>0</td>
          <td>1</td>
      </tr></tbody></table>
<p>The same statement will now raise an error informing the user that their
indices are invalid.</p>
</li>
<li class="">
<p>The <code>StringLiteral.get[value]()</code> method, which converts a compile-time value
of <code>Stringable</code> type has been changed
to a function named
<code>get_string_literal[value]()</code>.</p>
</li>
</ul>
</li>
<li class="">
<p>Collections:</p>
<ul>
<li class="">
<p>A new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/interval/IntervalTree/"><code>IntervalTree</code></a> data
structure has been added to the standard library. This is a tree data
structure that allows for efficient range queries.</p>
</li>
<li class="">
<p>Added an iterator to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/"><code>LinkedList</code></a> (<a href="https://github.com/modular/modular/pull/4005" target="_blank" rel="noopener noreferrer" class="">PR
#4005</a>)</p>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/#__iter__"><code>LinkedList.__iter__()</code></a>
to create a forward iterator.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/#__reversed__"><code>LinkedList.__reversed__()</code></a>
for a backward iterator.</p>
</li>
</ul>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ll </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> LinkedList</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> element </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> ll</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">element</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>List.bytecount()</code> has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/#byte_length"><code>List.byte_length()</code></a> for
consistency with the string-like APIs.</p>
</li>
<li class="">
<p>The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/#__init__"><code>InlineArray(unsafe_uninitialized=True)</code></a>
constructor is now spelled <code>InlineArray(uninitialized=True)</code>.</p>
</li>
</ul>
</li>
<li class="">
<p>The design of the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int_literal/IntLiteral/"><code>IntLiteral</code></a>
and <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/float_literal/FloatLiteral/"><code>FloatLiteral</code></a> types
has been changed to maintain their compile-time-only value as a parameter
instead of a stored field. This correctly models that infinite precision
literals are not representable at runtime, and eliminates a number of bugs hit
in corner cases. This is made possible by enhanced dependent type support in
the compiler.</p>
</li>
<li class="">
<p>The <code>Buffer</code> struct has been removed in favor of
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a> and <code>NDBuffer</code>.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/round/"><code>round()</code></a> function is now fixed to
perform "round half to even" (also known as "bankers' rounding") instead of
"round half away from zero".</p>
</li>
<li class="">
<p>The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#alloc"><code>UnsafePointer.alloc()</code></a>
method has changed to produce pointers with an empty <code>Origin</code> parameter,
instead of with <code>MutableAnyOrigin</code>. This mitigates an issue with the any
origin parameter extending the lifetime of unrelated local variables for this
common method.</p>
</li>
<li class="">
<p>Several more packages are now documented:</p>
<ul>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/compile/"><code>compile</code></a> package</li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/"><code>gpu</code></a> package</li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/layout/"><code>layout</code></a> package is underway, beginning with core
types, functions, and traits</li>
</ul>
</li>
<li class="">
<p>Added a new <code>sys.is_compile_time()</code> function. This enables you to query
whether code is being executed at compile time or not. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> sys </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> is_compile_time</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">check_compile_time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> is_compile_time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"compile time"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">else</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"runtime"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> var0 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> check_compile_time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> var1 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> check_compile_time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"var0 is evaluated at "</span><span class="token punctuation">,</span><span class="token plain"> var0</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">" , while var1 is evaluated at "</span><span class="token punctuation">,</span><span class="token plain"> var1</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>will print
<code>var0 is evaluated at compile time, while var1 is evaluated at runtime</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-2-tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.2/#25-2-tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Mojo API documentation generation is now able to display function and struct
parameter references inside nested parametric types using names instead of
indices. For example, instead of</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">sort</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">:</span><span class="token plain"> CollectionElement</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">,</span><span class="token plain"> cmp_fn</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token punctuation">(</span><span class="token plain">$</span><span class="token number" style="color:#924f79">1</span><span class="token operator" style="color:#a89984">|</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">,</span><span class="token plain"> $</span><span class="token number" style="color:#924f79">1</span><span class="token operator" style="color:#a89984">|</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">)</span><span class="token plain"> capturing </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Bool</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">span</span><span class="token punctuation">:</span><span class="token plain"> Span</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">,</span><span class="token plain"> origin</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>it now displays</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">sort</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">:</span><span class="token plain"> CollectionElement</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">,</span><span class="token plain"> cmp_fn</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">)</span><span class="token plain"> capturing </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Bool</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">span</span><span class="token punctuation">:</span><span class="token plain"> Span</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">,</span><span class="token plain"> origin</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.2/#-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p>Use of legacy argument conventions like <code>inout</code> and the use of <code>as</code> in named
results now produces an error message instead of a warning.</p>
</li>
<li class="">
<p>Direct access to <code>List.size</code> has been removed. Use the public API instead.</p>
<p>Examples:</p>
<p>Extending a List:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">base_data </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Byte</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">data_list </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Byte</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">ext_data_list </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> base_data</span><span class="token punctuation">.</span><span class="token plain">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">ext_data_list</span><span class="token punctuation">.</span><span class="token plain">extend</span><span class="token punctuation">(</span><span class="token plain">data_list</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># [1, 2, 3, 4, 5, 6]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">data_span </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Span</span><span class="token punctuation">(</span><span class="token plain">List</span><span class="token punctuation">[</span><span class="token plain">Byte</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">ext_data_span </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> base_data</span><span class="token punctuation">.</span><span class="token plain">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">ext_data_span</span><span class="token punctuation">.</span><span class="token plain">extend</span><span class="token punctuation">(</span><span class="token plain">data_span</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># [1, 2, 3, 4, 5, 6]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">data_vec </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">uint8</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">7</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">ext_data_vec_full </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> base_data</span><span class="token punctuation">.</span><span class="token plain">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">ext_data_vec_full</span><span class="token punctuation">.</span><span class="token plain">extend</span><span class="token punctuation">(</span><span class="token plain">data_vec</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># [1, 2, 3, 4, 5, 6, 7]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">ext_data_vec_partial </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> base_data</span><span class="token punctuation">.</span><span class="token plain">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">ext_data_vec_partial</span><span class="token punctuation">.</span><span class="token plain">extend</span><span class="token punctuation">(</span><span class="token plain">data_vec</span><span class="token punctuation">,</span><span class="token plain"> count</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># [1, 2, 3, 4, 5, 6]</span><br></div></code></pre></div></div>
<p>Slicing and extending a list efficiently:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">base_data </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Byte</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">n4_n5 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Span</span><span class="token punctuation">(</span><span class="token plain">base_data</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">:</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">extra_data </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Span</span><span class="token punctuation">(</span><span class="token plain">List</span><span class="token punctuation">[</span><span class="token plain">Byte</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">end_result </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Byte</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">capacity</span><span class="token operator" style="color:#a89984">=</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">n4_n5</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">extra_data</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">end_result</span><span class="token punctuation">.</span><span class="token plain">extend</span><span class="token punctuation">(</span><span class="token plain">n4_n5</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">end_result</span><span class="token punctuation">.</span><span class="token plain">extend</span><span class="token punctuation">(</span><span class="token plain">extra_data</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># [4, 5, 8, 10]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>InlinedFixedVector</code> and <code>InlineList</code> have been removed. Instead, use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlineArray</code></a> when the
upper bound is known at compile time. If the upper bound is not known until
runtime, use <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a> with the <code>capacity</code>
constructor to minimize allocations.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.2/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/modular/modular/issues/3976" target="_blank" rel="noopener noreferrer" class="">#3976</a> The <code>variance</code>
argument in <a class="" href="https://mojolang.static.modular-staging.com/docs/std/random/random/randn_float64/"><code>random.randn_float64()</code></a>
and <a class="" href="https://mojolang.static.modular-staging.com/docs/std/random/random/randn/"><code>random.randn()</code></a> has been renamed to
<code>standard_deviation</code> so that values are drawn from the correct distribution.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.25.2/#special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h2>
<p>Special thanks to our community contributors:
<a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>,
<a href="https://github.com/fnands" target="_blank" rel="noopener noreferrer" class="">@fnands</a>,
<a href="https://github.com/illiasheshyn" target="_blank" rel="noopener noreferrer" class="">@illiasheshyn</a>,
<a href="https://github.com/izo0x90" target="_blank" rel="noopener noreferrer" class="">@izo0x90</a>,
<a href="https://github.com/lydiandy" target="_blank" rel="noopener noreferrer" class="">@lydiandy</a>,
<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>,
<a href="https://github.com/msaelices" target="_blank" rel="noopener noreferrer" class="">@msaelices</a>,
<a href="https://github.com/owenhilyard" target="_blank" rel="noopener noreferrer" class="">@owenhilyard</a>,
<a href="https://github.com/rd4com" target="_blank" rel="noopener noreferrer" class="">@rd4com</a>,
<a href="https://github.com/yinonburgansky" target="_blank" rel="noopener noreferrer" class="">@yinonburgansky</a></p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v25.1]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.25.1/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.25.1/"/>
        <updated>2025-02-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.25.1/#-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p>The legacy <code>borrowed</code>/<code>inout</code> keywords and <code>-&gt; T as foo</code> syntax are deprecated
and now generate a compiler warning. Please move to <code>read</code>/<code>mut</code>/<code>out</code>
argument syntax instead. See
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/values/ownership/#argument-conventions">Argument conventions</a>
in the Mojo Manual for more information.</p>
</li>
<li class="">
<p>The <code>bool()</code>, <code>float()</code>, <code>int()</code>, and <code>str()</code> functions are deprecated and
generate compiler warnings. Please use the <code>Bool()</code>, <code>Float64()</code>, <code>Int()</code>, and
<code>String()</code> constructors instead. See <a href="https://mojolang.static.modular-staging.com/releases/v0.25.1/#25-1-standard-library-changes" class="">Standard library
changes</a> for more details.</p>
</li>
<li class="">
<p>The standard library has many changes related to strings. The new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/"><code>Char</code></a> struct
represents a single Unicode character, and includes several methods for
categorizing character types. When iterating over the characters of a <code>String</code>
with a <code>for</code> loop, you now should use the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#chars"><code>String.chars()</code></a> method
to provide an iterator of <code>Char</code> values or the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#char_slices"><code>String.char_slices()</code></a>
method to provide an iterator of
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a>
instances for each character. <code>StringRef</code> has been removed in favor of
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a>.
And various functionality has moved from <code>String</code> and <code>StringLiteral</code> to the
more general <code>StringSlice</code> type. See <a href="https://mojolang.static.modular-staging.com/releases/v0.25.1/#25-1-standard-library-changes" class="">Standard library
changes</a> for more details.</p>
</li>
<li class="">
<p>You can now use <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> constructors to cast
existing <code>SIMD</code> values (including <code>Scalar</code> values) to a different type, though
you can still use the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#cast"><code>SIMD.cast()</code></a>
method to infer the size of the new vector. See <a href="https://mojolang.static.modular-staging.com/releases/v0.25.1/#25-1-standard-library-changes" class="">Standard library
changes</a> for more details.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-1-language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.1/#25-1-language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The legacy <code>borrowed</code>/<code>inout</code> keywords and <code>-&gt; T as foo</code> syntax now generate
a warning. Please move to <code>read</code>/<code>mut</code>/<code>out</code> argument syntax instead. See
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/values/ownership/#argument-conventions">Argument conventions</a>
in the Mojo Manual for more information.</p>
</li>
<li class="">
<p>Initializers are now treated as static methods that return an instance of
<code>Self</code>. This means the <code>out</code> argument of an initializer is now treated the
same as any other function result or <code>out</code> argument. This is generally
invisible, except that patterns like <code>instance.__init__()</code> and
<code>x.__copyinit__(y)</code> no longer work. Simply replace them with <code>instance = T()</code>
and <code>x = y</code> respectively.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/value/"><code>@value</code></a> decorator now additionally
derives an implementation of the <code>ExplicitlyCopyable</code> trait.
This will ease the transition to explicit copyability requirements by default
in the Mojo collection types.</p>
</li>
<li class="">
<p>Indexing into a homogenous tuple now produces the consistent element type
without needing a rebind:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y </span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> x</span><span class="token punctuation">[</span><span class="token plain">idx</span><span class="token punctuation">]</span><span class="token plain">     </span><span class="token comment" style="color:#a89984"># Just works!</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>You can now overload positional arguments with a keyword-only argument, and
keyword-only arguments with different names:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">OverloadedKwArgs</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> val</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> single</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">val </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> single</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token punctuation">,</span><span class="token plain"> double</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">val </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> double </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token punctuation">,</span><span class="token plain"> triple</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">val </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> triple </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          OverloadedKwArgs</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain">        </span><span class="token comment" style="color:#a89984"># val=1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          OverloadedKwArgs</span><span class="token punctuation">(</span><span class="token plain">double</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># val=2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          OverloadedKwArgs</span><span class="token punctuation">(</span><span class="token plain">triple</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># val=6</span><br></div></code></pre></div></div>
<p>This also works with indexing operations:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">OverloadedKwArgs</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> vals</span><span class="token punctuation">:</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">vals </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__getitem__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> idx</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">vals</span><span class="token punctuation">[</span><span class="token plain">idx</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__getitem__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token punctuation">,</span><span class="token plain"> idx2</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">vals</span><span class="token punctuation">[</span><span class="token plain">idx2 </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__setitem__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">mut</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> idx</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> val</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">vals</span><span class="token punctuation">[</span><span class="token plain">idx</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> val</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__setitem__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">mut</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> val</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token punctuation">,</span><span class="token plain"> idx2</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">vals</span><span class="token punctuation">[</span><span class="token plain">idx2 </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> val</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> OverloadedKwArgs</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">       </span><span class="token comment" style="color:#a89984"># 1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">[</span><span class="token plain">idx2</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># 2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    x</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    x</span><span class="token punctuation">[</span><span class="token plain">idx2</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">84</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">       </span><span class="token comment" style="color:#a89984"># 42</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">[</span><span class="token plain">idx2</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># 84</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>__disable_del x</code> operation has been tightened up to treat all fields of
<code>x</code> as consumed by the point of the deletion, so it should be used after all
the subfields are transferred or otherwise consumed (for example, at the end
of the function), not before uses of the fields.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-1-gpu-programming">GPU programming<a href="https://mojolang.static.modular-staging.com/releases/v0.25.1/#25-1-gpu-programming" class="hash-link" aria-label="Direct link to GPU programming" title="Direct link to GPU programming" translate="no">​</a></h2>
<ul>
<li class="">
<p>The new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/gpu/"><code>gpu</code> package</a> provides low-level programming
constructs for working with GPUs. The Mojo <code>gpu</code> APIs allow you to manually
manage interaction between the CPU host and GPU device, manage memory between
devices, synchronize threads, and more. Currently the best way to use these
APIs is from inside a <a class="" href="https://mojolang.static.modular-staging.com/max/develop/custom-ops/">MAX custom operation</a>.</p>
<p>The following code example shows a GPU kernel written in Mojo:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">max</span><span class="token punctuation">.</span><span class="token plain">tensor </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> ManagedTensorSlice</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> gpu </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> thread_idx</span><span class="token punctuation">,</span><span class="token plain"> block_dim</span><span class="token punctuation">,</span><span class="token plain"> block_idx</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">gpu_add_kernel</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token punctuation">:</span><span class="token plain"> ManagedTensorSlice</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> ManagedTensorSlice</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">out</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">out</span><span class="token punctuation">.</span><span class="token plain">rank</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    tid_x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> thread_idx</span><span class="token punctuation">.</span><span class="token plain">x </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> block_dim</span><span class="token punctuation">.</span><span class="token plain">x </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> block_idx</span><span class="token punctuation">.</span><span class="token plain">x</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    tid_y </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> thread_idx</span><span class="token punctuation">.</span><span class="token plain">y </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> block_dim</span><span class="token punctuation">.</span><span class="token plain">y </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> block_dim</span><span class="token punctuation">.</span><span class="token plain">y</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> tid_x </span><span class="token operator" style="color:#a89984">&lt;</span><span class="token plain"> x</span><span class="token punctuation">.</span><span class="token plain">dim_size</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">and</span><span class="token plain"> tid_y </span><span class="token operator" style="color:#a89984">&lt;</span><span class="token plain"> x</span><span class="token punctuation">.</span><span class="token plain">dim_size</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">out</span><span class="token punctuation">[</span><span class="token plain">tid_x</span><span class="token punctuation">,</span><span class="token plain"> tid_y</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> x</span><span class="token punctuation">[</span><span class="token plain">tid_x</span><span class="token punctuation">,</span><span class="token plain"> tid_y</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><br></div></code></pre></div></div>
<p>The example above includes only the actual kernel code that’s run on the GPU,
not the code to define a custom operation or launch the kernel. For more
complete examples, see
<a href="https://github.com/modular/modular/blob/main/max/examples/custom_ops/kernels/vector_addition.mojo" target="_blank" rel="noopener noreferrer" class=""><code>vector_addition.mojo</code></a>
and
<a href="https://github.com/modular/modular/blob/main/max/examples/custom_ops/kernels/top_k.mojo" target="_blank" rel="noopener noreferrer" class=""><code>top_k.mojo</code></a>.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/layout/"><code>layout</code> package</a> includes APIs for working with
<em>layouts</em>, which describe the organization of a tensor (for example, row-major
or column-major layout), and the
<a class="" href="https://mojolang.static.modular-staging.com/docs/layout/layout_tensor/LayoutTensor/"><code>LayoutTensor</code></a> type, which
represents a tensor with a specified layout. The <code>layout</code> package can be used
to build efficient tensor operations that run on a GPU.</p>
<p>We’ll continue adding code examples and documentation for the <code>gpu</code> and
<code>layout</code> packages in future releases.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-1-standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.1/#25-1-standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The builtin functions for converting values to different types have been
deprecated for actual constructors:</p>

























<table><thead><tr><th><strong>Before</strong></th><th><strong>After</strong></th></tr></thead><tbody><tr><td><code>bool()</code></td><td><code>Bool()</code></td></tr><tr><td><code>float()</code></td><td><code>Float64()</code></td></tr><tr><td><code>int()</code></td><td><code>Int()</code></td></tr><tr><td><code>str()</code></td><td><code>String()</code></td></tr></tbody></table>
<p>These functions were a workaround before Mojo had a way to distinguish between
implicit and explicit constructors. For this release you'll get a deprecation
warning, and in the next release they'll become compiler errors. You can
quickly update your code by doing a <code>Match Case</code> and <code>Match Whole Word</code>
search and replace for <code>int(</code> to <code>Int(</code> etc.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/"><code>String</code></a> and friends:</p>
<ul>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/"><code>Char</code></a> for
representing and storing single Unicode characters.</p>
<ul>
<li class="">
<p><code>Char</code> implements
<code>CollectionElement</code>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/comparable/#equalitycomparable"><code>EqualityComparable</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Intable/"><code>Intable</code></a>, and
<code>Stringable</code>.</p>
</li>
<li class="">
<p><code>Char</code> provides methods for categorizing character types, including:
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/#is_ascii"><code>Char.is_ascii()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/#is_ascii_digit"><code>Char.is_ascii_digit()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/#is_ascii_upper"><code>Char.is_ascii_upper()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/#is_ascii_lower"><code>Char.is_ascii_lower()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/#is_ascii_printable"><code>Char.is_ascii_printable()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/#is_posix_space"><code>Char.is_posix_space()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/#is_python_space"><code>Char.is_python_space()</code></a>.</p>
</li>
<li class="">
<p>Added a <code>String()</code> constructor from <code>Char</code>.</p>
</li>
<li class="">
<p><code>Char</code> can be converted to <code>UInt32</code> via
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/codepoint/Codepoint/#to_u32"><code>Char.to_u32()</code></a>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/chr/"><code>chr()</code></a> will now abort if
given a codepoint value that is not a valid <code>Char</code>.</p>
</li>
</ul>
</li>
<li class="">
<p><code>StringRef</code> has been removed in favor of
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a>.
The two types are ABI compatible, and for the exact same behavior one can
use <code>StaticString</code>, which is an alias to
<code>StringSlice[StaticConstantOrigin]</code>.</p>
</li>
<li class="">
<p>Various functionality has moved from <code>String</code> and <code>StringLiteral</code> to the
more general <code>StringSlice</code> type.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#from_utf8"><code>StringSlice.from_utf8()</code></a>
factory method, for validated construction of a <code>StringSlice</code> from a buffer
containing UTF-8 encoded data. This method will raise if the buffer contents
are not valid UTF-8.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#chars"><code>StringSlice.chars()</code></a>
which returns an iterator over <code>Char</code>s. This is a compliant UTF-8 decoder
that returns each Unicode codepoint encoded in the string.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#__getitem__"><code>StringSlice.__getitem__(Slice)</code></a>
which returns a substring. Only step sizes of 1 are supported.</p>
</li>
<li class="">
<p>Several standard library functions have been changed to take <code>StringSlice</code>
instead of <code>String</code>. This generalizes them to be used for any appropriately
encoded string in memory, without requiring that the string be heap
allocated. This includes:
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/ascii/"><code>ascii()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/atol/"><code>atol()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/atof/"><code>atof()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/base64/base64/b16decode/"><code>b16decode()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/base64/base64/b16encode/"><code>b16encode()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/base64/base64/b64decode/"><code>b64decode()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/base64/base64/b64encode/"><code>b64encode()</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/ord/"><code>ord()</code></a>.</p>
</li>
<li class="">
<p>Added new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#chars"><code>String.chars()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#char_slices"><code>String.char_slices()</code></a>
iterator methods, and deprecated the existing <code>String.__iter__()</code> method.</p>
<p>Different use-cases may prefer iterating over the <code>Char</code>s encoded in a
string, or iterating over subslices containing single characters. Neither
iteration semantics is an obvious default, so the existing <code>__iter__()</code>
method has been deprecated in favor of writing explicit iteration methods
for the time being.</p>
<p>Code of the form:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> s</span><span class="token punctuation">:</span><span class="token plain"> String  </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> c </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> s</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># ...</span><br></div></code></pre></div></div>
<p>can be migrated to using the <code>.char_slices()</code> method:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> s</span><span class="token punctuation">:</span><span class="token plain"> String </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> c </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> s</span><span class="token punctuation">.</span><span class="token plain">char_slices</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># ...</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#char_length"><code>StringSlice.char_length()</code></a>
method, to pair with the existing
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#byte_length"><code>StringSlice.byte_length()</code></a>
method.</p>
</li>
<li class="">
<p>The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#__len__"><code>String.__len__()</code></a>
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#__len__"><code>StringSlice.__len__()</code></a>
methods now return the length of the string in bytes.</p>
<p>Previously, these methods were documented to note that they would eventually
return a length in Unicode codepoints. They have been changed to guarantee
a length in bytes, since the length in bytes is how they are most often used
today (for example, as bounds to low-level memory manipulation logic).
Additionally, length in codepoints is a more specialized notion of string
length that is rarely the correct metric.</p>
<p>Users that know they need the length in codepoints can use the
<code>str.char_length()</code> method, or <code>len(str.chars())</code>.</p>
</li>
<li class="">
<p><code>StringSlice</code> now implements
<code>Representable</code>, and that
implementation is now used by <code>String.__repr__()</code> and
<code>StringLiteral.__repr__()</code>.</p>
</li>
<li class="">
<p><code>StringSlice</code> now implements
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/comparable/#equalitycomparable"><code>EqualityComparable</code></a>.</p>
<p>Up until now, <code>StringSlice</code> has implemented a more general <code>__eq__()</code> and
<code>__ne__()</code> comparison with <code>StringSlice</code> types that had arbitrary other
origins. However, to satisfy <code>EqualityComparable</code>, <code>StringSlice</code> now also
has narrower comparison methods that support comparing only with another
<code>StringSlice</code> with the exact same origin.</p>
</li>
<li class="">
<p>The <code>String.write()</code> static method has moved to a <code>String()</code> constructor,
and is now buffered. Instead of doing:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> msg </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"my message "</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">" "</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token plain">y</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">" "</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token plain">z</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Which reallocates the <code>String</code> you should do:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> msg </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"my message"</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">,</span><span class="token plain"> y</span><span class="token punctuation">,</span><span class="token plain"> z</span><span class="token punctuation">,</span><span class="token plain"> sep</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">" "</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Which is cleaner, and buffers to the stack so the <code>String</code> is allocated only
once.</p>
</li>
<li class="">
<p>You can now pass any <a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/Writer/"><code>Writer</code></a> to
<code>write_buffered()</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> utils</span><span class="token punctuation">.</span><span class="token plain">write </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> write_buffered</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> string </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"existing string"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">write_buffered</span><span class="token punctuation">(</span><span class="token plain">string</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42.4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">True</span><span class="token punctuation">,</span><span class="token plain"> sep</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">" "</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>This writes to a buffer on the stack before reallocating the <code>String</code>.</p>
</li>
</ul>
</li>
<li class="">
<p>Collections:</p>
<ul>
<li class="">
<p>A new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/linked_list/LinkedList/"><code>LinkedList</code></a> type
has been added to the standard library.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/#copied"><code>Optional.copied()</code></a> for
constructing an owned <code>Optional[T]</code> from an <code>Optional[Pointer[T]]</code> by
copying the pointee value.</p>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#get_ptr"><code>Dict.get_ptr()</code></a> which
returns an <code>Optional[Pointer[V]]</code>. If the given key is present in the
dictionary, the optional will hold a pointer to the value. Otherwise, an
empty optional is returned.</p>
</li>
<li class="">
<p>Added new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/#extend"><code>List.extend()</code></a>
overloads taking <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a>. These enable growing a
<code>List[Scalar[..]]</code> by copying the elements of a <code>SIMD</code> vector or
<code>Span[Scalar[..]]</code>, simplifying the writing of some optimized SIMD-aware
functionality.</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> changes:</p>
<ul>
<li class="">
<p><code>UnsafePointer</code>'s <code>bitcast()</code> method has now been split into
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#bitcast"><code>bitcast()</code></a> for
changing the type,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#origin_cast"><code>origin_cast()</code></a>
for changing mutability,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#static_alignment_cast"><code>static_alignment_cast()</code></a>
for changing alignment, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#address_space_cast"><code>address_space_cast()</code></a>
for changing the address space.</p>
</li>
<li class="">
<p><code>UnsafePointer</code> is now parameterized on mutability. Previously,
<code>UnsafePointer</code> could only represent mutable pointers.</p>
<p>The new <code>mut</code> parameter can be used to restrict an <code>UnsafePointer</code> to a
specific mutability: <code>UnsafePointer[T, mut=False]</code> represents a pointer to
an immutable <code>T</code> value. This is analogous to a <code>const *</code> pointer in C++.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#address_of"><code>UnsafePointer.address_of()</code></a>
will now infer the origin and mutability of the resulting pointer from the
argument. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> local </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Constructs a mutable pointer, because `local` is a mutable memory location</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> UnsafePointer</span><span class="token punctuation">.</span><span class="token plain">address_of</span><span class="token punctuation">(</span><span class="token plain">local</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>To force the construction of an immutable pointer to an otherwise mutable
memory location, use a cast:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> local </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Cast the mutable pointer to be immutable.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> UnsafePointer</span><span class="token punctuation">.</span><span class="token plain">address_of</span><span class="token punctuation">(</span><span class="token plain">local</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">origin_cast</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">mut</span><span class="token operator" style="color:#a89984">=</span><span class="token boolean" style="color:#af2528">False</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>unsafe_ptr()</code> method on several standard library collection types have
been updated to use parametric mutability: they will return an
<code>UnsafePointer</code> whose mutability is inherited from the mutability of the
<code>ref self</code> of the receiver at the call site. For example, <code>ptr1</code> will be
immutable, while <code>ptr2</code> will be mutable:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">take_lists</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">read</span><span class="token plain"> list1</span><span class="token punctuation">:</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">mut</span><span class="token plain"> list2</span><span class="token punctuation">:</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Immutable pointer, since receiver is immutable `read` reference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr1 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> list1</span><span class="token punctuation">.</span><span class="token plain">unsafe_ptr</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Mutable pointer, since receiver is mutable `mut` reference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> list2</span><span class="token punctuation">.</span><span class="token plain">unsafe_ptr</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
</li>
<li class="">
<p>New and updated traits:</p>
<ul>
<li class="">
<p>The <code>ExplicitlyCopyable</code>
trait has changed to require a <code>fn copy(self) -&gt; Self</code> method. Previously,
an initializer with the signature <code>fn __init__(out self, *, other: Self)</code>
had been required by <code>ExplicitlyCopyable</code>.</p>
<p>This improves the "greppability" and at-a-glance readability when a
programmer is looking for places in their code that may be performing
copies.</p>
</li>
<li class="">
<p>The <code>IntLike</code> trait has been removed and its functionality incorporated into
the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Indexer/"><code>Indexer</code></a> trait. This enables
<code>SIMD</code> scalar integer types and <code>UInt</code> to be used for indexing into all of
the collection types, as well as optimizing away normalization checks for
<code>UInt</code> indexing.</p>
</li>
<li class="">
<p>The <code>ImplicitlyIntable</code> trait
has been added, allowing types to be implicitly converted to an <code>Int</code> by
implementing the <code>__as_int__()</code> method:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Foo</span><span class="token punctuation">(</span><span class="token plain">ImplicitlyIntable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> i</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__as_int__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">i</span><br></div></code></pre></div></div>
</li>
</ul>
</li>
<li class="">
<p>You can now cast <code>SIMD</code> types using constructors:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> val </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Int8</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> cast </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Int32</span><span class="token punctuation">(</span><span class="token plain">val</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>It also works when passing a scalar type to larger vector size:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> vector </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int64</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">cast</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># [42, 42, 42, 42]</span><br></div></code></pre></div></div>
<p>For values other than scalars the size of the <code>SIMD</code> vector needs to be equal:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> float_vector </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">float64</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">vector</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#cast"><code>SIMD.cast()</code></a> still exists to infer the
size of new vector:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> inferred_size </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> float_vector</span><span class="token punctuation">.</span><span class="token plain">cast</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">uint64</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># [42, 42, 42, 42]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#from_bytes"><code>SIMD.from_bytes()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#as_bytes"><code>SIMD.as_bytes()</code></a> to convert a
list of bytes to a list of scalars and vice versa, accepting the endianness as
an argument. Similar to Python <code>int.from_bytes()</code> and <code>int.to_bytes()</code>
functions.</p>
</li>
<li class="">
<p>You can now use <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/max/"><code>max()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/min/"><code>min()</code></a> with variadic number of arguments.</p>
</li>
<li class="">
<p><code>bit_ceil()</code> has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/bit/bit/next_power_of_two/"><code>next_power_of_two()</code></a>, and
<code>bit_floor()</code> to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/bit/bit/prev_power_of_two/"><code>prev_power_of_two()</code></a>. This is to
improve readability and clarity in their use.</p>
</li>
<li class="">
<p>Added a new boolean <code>validate</code> parameter to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/base64/base64/b64decode/"><code>b64decode()</code></a>.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/base64/base64/b64encode/"><code>b64encode()</code></a> overload that
previously took a <code>List</code> has been changed to take a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a>.</p>
</li>
<li class="">
<p>Removed the <code>@implicit</code> decorator from some standard library initializer
methods that perform allocation. This reduces places where Mojo code could
implicitly allocate where the user may not be aware.</p>
<p>Removed <code>@implicit</code> from:</p>
<ul>
<li class=""><code>String.__init__(out self, StringSlice)</code></li>
<li class=""><code>List.__init__(out self, owned *values: T)</code></li>
<li class=""><code>List.__init__(out self, span: Span[T])</code></li>
</ul>
</li>
<li class="">
<p>Added more aliases in <a class="" href="https://mojolang.static.modular-staging.com/docs/std/ffi/"><code>sys.ffi</code></a> to round out the
usual needs for FFI bindings.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="25-1-tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.25.1/#25-1-tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p><code>mblack</code> (aka <a class="" href="https://mojolang.static.modular-staging.com/docs/cli/format/"><code>mojo format</code></a>) no longer formats non-Mojo
files. This prevents unexpected formatting of Python files.</p>
</li>
<li class="">
<p>Full struct signature information is now exposed in the documentation
generator, and in the symbol outline and hover markdown via the Mojo Language
Server.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/param_env/env_get_dtype/"><code>env_get_dtype()</code></a> function has
been added to the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/param_env/"><code>sys.param_env</code></a> module. This
allows you to get the value of a <code>DType</code> from the param environment.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.1/#-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p><code>StringRef</code> has been removed. Use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a>
instead.</p>
<ul>
<li class="">
<p>Changed <a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/arg/argv/"><code>sys.argv()</code></a> to return list of
<code>StringSlice</code>.</p>
</li>
<li class="">
<p>Added explicit <a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/#__init__"><code>Path()</code></a>
constructor from <code>StringSlice</code>.</p>
</li>
</ul>
</li>
<li class="">
<p>The <code>Tuple.get[i, T]()</code> method has been removed. Please use <code>tup[i]</code> or
<code>rebind[T](tup[i])</code> as needed instead.</p>
</li>
<li class="">
<p><code>StringableCollectionElement</code> is deprecated. Use <code>WritableCollectionElement</code>
instead, which still allows you to construct a <code>String</code>, but can avoid
intermediate allocations.</p>
</li>
<li class="">
<p>The <code>IntLike</code> trait has been removed and its functionality incorporated into
the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Indexer/"><code>Indexer</code></a> trait.</p>
</li>
<li class="">
<p>The <code>Type{field1: 42, field2: 17}</code> syntax for direct initializing register
passable types has been removed. This was legacy syntax - to upgrade your
code, add the <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/value/"><code>@value</code></a> decorator to your
struct to get a fieldwise initializer and use <code>Type(field1=42, field2 = 17)</code>
instead.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.25.1/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p>The Mojo Kernel for Jupyter Notebooks is working again on nightly releases.</p>
</li>
<li class="">
<p>The command <code>mojo debug --vscode</code> now sets the current working directory
properly.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3796" target="_blank" rel="noopener noreferrer" class="">Issue #3796</a> - Compiler crash
handling <code>for</code>-<code>else</code> statement.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3540" target="_blank" rel="noopener noreferrer" class="">Issue #3540</a> - Using named
output slot breaks trait conformance</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3617" target="_blank" rel="noopener noreferrer" class="">Issue #3617</a> - Can't generate
the constructors for a type wrapping <code>!lit.ref</code></p>
</li>
<li class="">
<p>The Mojo Language Server doesn't crash anymore on empty <code>__init__.mojo</code> files.
<a href="https://github.com/modular/modular/issues/3826" target="_blank" rel="noopener noreferrer" class="">Issue #3826</a>.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3935" target="_blank" rel="noopener noreferrer" class="">Issue #3935</a> - Confusing OOM
error when using <code>Tuple.get()</code> incorrectly.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3955" target="_blank" rel="noopener noreferrer" class="">Issue #3955</a> - Unexpected
copy behavior with <code>def</code> arguments in loops</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3960" target="_blank" rel="noopener noreferrer" class="">Issue #3960</a> - Infinite <code>for</code>
loop</p>
</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v24.6]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.24.6/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.24.6/"/>
        <updated>2024-12-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<p>Here's a brief summary of some of the major changes in this release, with more
detailed information in the following sections:</p>
<ul>
<li class="">
<p>The <code>inout</code> and <code>borrowed</code> argument conventions have been renamed to <code>mut</code>
and <code>read</code>, respectively. A new <code>out</code> convention has been added for the <code>self</code>
argument in constructors and for named results. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#24-6-language-changes" class="">Language changes</a> for details.</p>
</li>
<li class="">
<p><code>Lifetime</code> and related types in the standard library have been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/type_aliases/Origin/"><code>Origin</code></a> to better clarify that
parameters of this type indicate where a reference is derived from, not the
more complicated notion of where a variable is initialized and destroyed. As a
consequence the <code>__lifetime_of()</code> operator is now named <code>__origin_of()</code>.</p>
<p>There are also a number of other origin-related improvements in this release,
including being able to specify a union of origins by listing multiple values
in the <code>__origin_of()</code> operator or inside the <code>ref</code> origin specifier
(<code>ref [a, b]</code>). For details, see <a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#24-6-language-changes" class="">Language changes</a>.</p>
<p>For background information and rationale on the name change see
<a href="https://github.com/modular/modular/issues/3623" target="_blank" rel="noopener noreferrer" class="">the proposal</a>. For more
information on origins, see
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/values/lifetimes/">Lifetimes, origins and references</a> in the Mojo
Manual.</p>
</li>
<li class="">
<p>Implicit conversions are now opt-in using the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/implicit/"><code>@implicit</code></a> decorator. See
<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#24-6-language-changes" class="">Language changes</a> for details.</p>
</li>
<li class="">
<p>The standard library has added several new types, including
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/deque/Deque/"><code>Deque</code></a> (a double-ended queue) and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/owned_pointer/OwnedPointer/"><code>OwnedPointer</code></a> (safe,
single-owner, non-nullable smart pointer). See
<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#24-6-standard-library-changes" class="">Standard library changes</a>
for details.</p>
</li>
<li class="">
<p>The VS Code extension now supports setting data breakpoints and function
breakpoints, and the Mojo LLDB debugger supports symbol breakpoints, such
as <code>b main</code> or <code>b my_module::main</code>.</p>
</li>
<li class="">
<p>We've made a number of improvement to how information is displayed in error
messages, LSP, and generated API documentation. For details, see
<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#24-6-tooling-changes" class="">Tooling changes</a>.</p>
</li>
<li class="">
<p>And we've added a number of new docs, including a brand new
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/get-started/">Mojo tutorial</a>, new pages on
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/operators/">operators and expressions</a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/errors/">error handling</a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/pointers/">pointers</a>, and many smaller additions and
improvements.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="24-6-language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#24-6-language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Argument convention changes:</p>
<ul>
<li class="">
<p>The <code>inout</code> and <code>borrowed</code> argument conventions have been renamed to <code>mut</code>
(for "mutate") and <code>read</code>, respectively. These verbs reflect what the callee
can do to the argument value passed in by the caller, without requiring the
programmer to know about advanced features like references.</p>
<p>For information on Mojo's argument conventions, see
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/values/ownership/#argument-conventions">Argument conventions</a>
in the Mojo Manual.</p>
</li>
<li class="">
<p>The argument convention for the <code>self</code> argument in the <code>__init__()</code>,
<code>__copyinit__()</code>, and <code>__moveinit__()</code> methods has been changed from <code>inout</code>
to <code>out</code>, reflecting that a constructor method initializes its <code>self</code> value
without reading from it. This also enables spelling the type of an
initializer correctly, which was not supported before:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Foo</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># This works now</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> fnPtr </span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Foo</span><span class="token punctuation">)</span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token boolean" style="color:#af2528">None</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Foo</span><span class="token punctuation">.</span><span class="token plain">__init__</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> someFoo </span><span class="token punctuation">:</span><span class="token plain"> Foo</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    fnPtr</span><span class="token punctuation">(</span><span class="token plain">someFoo</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># initializes someFoo.</span><br></div></code></pre></div></div>
<p>The previous <code>fn __init__(inout self)</code> syntax is still supported in this
release of Mojo, but will be removed in the future. Please migrate to the
new syntax.</p>
</li>
<li class="">
<p>Similarly, the spelling of named results has switched to use
<code>out</code> syntax instead of <code>-&gt; T as name</code>. Functions may have at most one named
result or return type specified with the usual <code>-&gt;</code> syntax. <code>out</code> arguments
may occur anywhere in the argument list, but are typically last (except for
<code>__init__</code> methods, where they are typically first).</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># This function has type "fn() -&gt; String"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">example</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> result</span><span class="token punctuation">:</span><span class="token plain"> String</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  result </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"foo"</span><br></div></code></pre></div></div>
<p>The parser still accepts the old syntax as a synonym for this, but that will
eventually be deprecated and removed.</p>
<p>This was <a href="https://github.com/modular/modular/issues/3623" target="_blank" rel="noopener noreferrer" class="">discussed extensively in a public
proposal</a>. For more
information, see
<a class="" href="https://mojolang.static.modular-staging.com/nightly/docs/manual/functions/#named-results">Named results</a> in the Mojo
Manual.</p>
</li>
</ul>
</li>
<li class="">
<p>Single argument constructors now require the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/implicit/"><code>@implicit</code></a> decorator to allow for
implicit conversions. Previously you could define an <code>__init__</code> that takes a
single argument:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Foo</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">value </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> value</span><br></div></code></pre></div></div>
<p>And this would allow you to pass an <code>Int</code> in the position of a <code>Foo</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">func</span><span class="token punctuation">(</span><span class="token plain">foo</span><span class="token punctuation">:</span><span class="token plain"> Foo</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"implicitly converted Int to Foo:"</span><span class="token punctuation">,</span><span class="token plain"> foo</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    func</span><span class="token punctuation">(</span><span class="token plain">Int</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>This can result in complicated errors that are difficult to debug. By default
this implicit behavior is now turned off, so you have to explicitly construct
<code>Foo</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    func</span><span class="token punctuation">(</span><span class="token plain">Foo</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>You can still opt into implicit conversions by adding the <code>@implicit</code>
decorator. For example, to enable implicit conversions from <code>Int</code> to <code>Foo</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Foo</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@implicit</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">out</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">value </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> value</span><br></div></code></pre></div></div>
<p>For more information see <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/lifecycle/life/#constructors-and-implicit-conversion">Constructors and implicit
conversion</a>
in the Mojo Manual.</p>
</li>
<li class="">
<p>Origin-related changes:</p>
<ul>
<li class="">
<p>The <code>AnyLifetime</code> type (useful for declaring origin types as parameters) has
has been renamed to <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/type_aliases/Origin/"><code>Origin</code></a> and
the <code>__lifetime_of()</code> operator renamed to <code>__origin_of()</code>.</p>
</li>
<li class="">
<p><code>Origin</code> is now a complete wrapper around the MLIR origin type.</p>
<ul>
<li class="">
<p>The <code>Origin.type</code> alias has been renamed to <code>_mlir_origin</code>. In parameter
lists, you can now write just <code>Origin[..]</code>, instead of <code>Origin[..].type</code>.</p>
</li>
<li class="">
<p><code>ImmutableOrigin</code> and <code>MutableOrigin</code> are now, respectively, just aliases
for <code>Origin[False]</code> and <code>Origin[True]</code>.</p>
</li>
<li class="">
<p><code>Origin</code> struct values are now supported in the origin specifier of a
<code>ref [..]</code> argument.</p>
</li>
<li class="">
<p>Added <code>Origin.cast_from</code> for casting the mutability of an origin value.</p>
</li>
</ul>
</li>
<li class="">
<p><code>ref</code> arguments and results now allow for providing a memory value
directly in the origin specifier, rather than requiring the use of
<code>__origin_of()</code>. It is still fine to use <code>__origin_of()</code> explicitly though,
and this is required when specifying origins for parameters (e.g. to the
<code>Pointer</code> type). For example, this is now valid without <code>__origin_of()</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">return_ref</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> String</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">]</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> a</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Various improvements to origin handling and syntax have landed, including
support for the ternary operator and allowing multiple arguments in a <code>ref</code>
specifier (which are implicitly unions). This enables expression of simple
algorithms cleanly:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> my_min</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Comparable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">]</span><span class="token plain"> T</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> a </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> a </span><span class="token operator" style="color:#a89984">&lt;</span><span class="token plain"> b </span><span class="token keyword" style="color:#af2528">else</span><span class="token plain"> b</span><br></div></code></pre></div></div>
<p>It is also nice that <code>my_min</code> automatically and implicitly propagates the
mutability of its arguments, so things like <code>my_min(str1, str2) += "foo"</code> is
valid.</p>
</li>
<li class="">
<p><code>ref</code> function arguments without an origin clause are now treated as
<code>ref [_]</code>, which is more syntactically convenient and consistent:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">takes_and_return_ref</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"> String</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">]</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> a</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>__type_of(x)</code> and <code>__origin_of(x)</code> operators are much more general now:
they allow arbitrary expressions inside of them, allow referring to dynamic
values in parameter contexts, and even allow referring to raising functions
in non-raising contexts. These operations never evaluate their expression,
so any side effects that occur in the expression are never evaluated at
runtime, eliminating concerns about <code>__type_of(expensive())</code> being a
problem.</p>
</li>
<li class="">
<p>The destructor insertion logic in Mojo is now aware that types that take an
<code>MutableAnyOrigin</code> or <code>ImmutableAnyOrigin</code> as part of their signature could
potentially access any live value that destructor insertion is tracking,
eliminating a significant usability issue with unsafe APIs like
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a>.
Consider a typical example working with strings before this change:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">str</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">.</span><span class="token plain">unsafe_ptr</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">some_low_level_api</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">_ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">str</span><span class="token operator" style="color:#a89984">^</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># OLD HACK: Explicitly keep string alive until here!</span><br></div></code></pre></div></div>
<p>The <code>_ = str^</code> pattern was formerly required because the Mojo compiler has
no idea what "ptr" might reference. As a consequence, it had no idea that
<code>some_low_level_api()</code> might access <code>str</code> and therefore thought it was ok to
destroy the <code>String</code> before the call - this is why the explicit lifetime
extension was required.</p>
<p>Mojo now knows that
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> may
access the <code>MutableAnyOrigin</code> origin, and now assumes that any API that uses
that origin could use live values. In this case, it assumes that
<code>some_low_level_api()</code> might access <code>str</code> and because it might be using it,
it cannot destroy <code>str</code> until after the call. The consequence of this is
that the old hack is no longer needed for these cases!</p>
</li>
<li class="">
<p>Function types now accept an origin set parameter. This parameter represents
the origins of values captured by a parameter closure. The compiler
automatically tags parameter closures with the right set of origins. This
enables lifetimes and parameter closures to correctly compose.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> call_it</span><span class="token punctuation">[</span><span class="token plain">f</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> capturing </span><span class="token punctuation">[</span><span class="token plain">_</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">None</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    f</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> msg </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"hello world"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">say_hi</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">msg</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    call_it</span><span class="token punctuation">[</span><span class="token plain">say_hi</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># no longer need to write `_ = msg^`!!</span><br></div></code></pre></div></div>
<p>Note that this only works for higher-order functions which have explicitly
added <code>[_]</code> as the capture origins. By default, the compiler still assumes
a <code>capturing</code> closure does not reference any origins. This will soon change.</p>
</li>
</ul>
</li>
<li class="">
<p>Infer-only parameters may now be explicitly bound with keywords, enabling
some important patterns in the standard library:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">StringSlice</span><span class="token punctuation">[</span><span class="token plain">is_mutable</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">,</span><span class="token plain"> origin</span><span class="token punctuation">:</span><span class="token plain"> Origin</span><span class="token punctuation">[</span><span class="token plain">is_mutable</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> ImmStringSlice </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StringSlice</span><span class="token punctuation">[</span><span class="token plain">is_mutable</span><span class="token operator" style="color:#a89984">=</span><span class="token boolean" style="color:#af2528">False</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># This auto-parameterizes on the origin, but constrains it to being an</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># immutable slice instead of a potentially mutable one.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">take_imm_slice</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> ImmStringSlice</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The flag for turning on asserts has changed, e.g. to enable all checks:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">mojo </span><span class="token parameter variable" style="color:#af2528">-D</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#af2528">ASSERT</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">all main.mojo</span><br></div></code></pre></div></div>
<p>The levels are:</p>
<ul>
<li class=""><code>none</code>: all assertions off</li>
<li class=""><code>warn</code>: print assertion errors e.g. for multithreaded tests (previously&nbsp;<code>-D ASSERT_WARNING</code>)</li>
<li class=""><code>safe</code>: the default mode for standard CPU safety assertions</li>
<li class=""><code>all</code>: turn on all assertions (previously&nbsp;<code>-D MOJO_ENABLE_ASSERTIONS</code>)</li>
</ul>
<p>You can now also pass <code>Stringable</code> args to format a message, which will have
no runtime penalty or IR bloat cost when assertions are off. Previously you
had to:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token number" style="color:#924f79">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">debug_assert</span><span class="token punctuation">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  x </span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">,</span><span class="token plain"> String</span><span class="token punctuation">.</span><span class="token plain">format_sequence</span><span class="token punctuation">(</span><span class="token plain">“expected x to be more than </span><span class="token number" style="color:#924f79">0</span><span class="token plain"> but got</span><span class="token punctuation">:</span><span class="token plain"> ”</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Which can't be optimized away by the compiler in release builds, you can now
pass multiple args for a formatted message at no runtime cost:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">debug_assert</span><span class="token punctuation">(</span><span class="token plain">x </span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">,</span><span class="token plain"> “expected x to be more than </span><span class="token number" style="color:#924f79">0</span><span class="token plain"> but got</span><span class="token punctuation">:</span><span class="token plain"> ”</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Automatic parameterization of parameters is now supported. Specifying a
parameterized type with unbound parameters causes them to be implicitly added
to the function signature as infer-only parameters.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">value</span><span class="token punctuation">:</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int32</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Equivalent to</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">size</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int32</span><span class="token punctuation">,</span><span class="token plain"> size</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">pass</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo can now interpret simple LLVM intrinsics in parameter expressions,
enabling things like <code>count_leading_zeros</code> to work at compile time:
<a href="https://github.com/modular/modular/issues/933" target="_blank" rel="noopener noreferrer" class="">Issue #933</a>.</p>
</li>
<li class="">
<p>Introduced the <code>@explicit_destroy</code> annotation, the <code>__disable_del</code> keyword,
the <code>UnknownDestructibility</code> trait, and the <code>ImplicitlyDestructible</code> keyword,
for the experimental explicitly destroyed types feature.</p>
</li>
<li class="">
<p>Added associated types; we can now have aliases like <code>alias T: AnyType</code>,
<code>alias N: Int</code>, etc. in a trait, and then specify them in structs that conform
to that trait. For more information, see <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/traits/#associated-aliases-for-generics">Associated aliases for
generics</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="24-6-standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#24-6-standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Introduced a new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/deque/Deque/"><code>Deque</code></a> (double-ended
queue) collection type, based on a dynamically resizing circular buffer for
efficient O(1) additions and removals at both ends as well as O(1) direct
access to all elements.</p>
<p>The <code>Deque</code> supports the full Python <code>collections.deque</code> API, ensuring that
all expected deque operations perform as in Python.</p>
<p>Enhancements to the standard Python API include <code>peek()</code> and <code>peekleft()</code>
methods for non-destructive access to the last and first elements, and
advanced constructor options (<code>capacity</code>, <code>min_capacity</code>, and <code>shrink</code>) for
customizing memory allocation and performance. These options allow for
optimized memory usage and reduced buffer reallocations, providing flexibility
based on application requirements.</p>
</li>
<li class="">
<p>The <code>Formatter</code> struct has been replaced with a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/Writer/"><code>Writer</code></a> trait to enable buffered IO,
increasing print and file writing perf to the same speed as C. It's now more
general purpose and can write any <code>Span[Byte]</code>. To align with this the
<code>Formattable</code> trait is now named
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/Writable/"><code>Writable</code></a>, and the
<code>String.format_sequence()</code> static method to initialize a new <code>String</code> has been
renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#write"><code>String.write()</code></a>.
Here's an example of using all of the changes:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> memory </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Span</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">NewString</span><span class="token punctuation">(</span><span class="token plain">Writer</span><span class="token punctuation">,</span><span class="token plain"> Writable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> s</span><span class="token punctuation">:</span><span class="token plain"> String</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Writer requirement to write a Span of Bytes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">write_bytes</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">bytes</span><span class="token punctuation">:</span><span class="token plain"> Span</span><span class="token punctuation">[</span><span class="token plain">Byte</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">s</span><span class="token punctuation">.</span><span class="token plain">_iadd</span><span class="token punctuation">[</span><span class="token boolean" style="color:#af2528">False</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">bytes</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Writer requirement to take multiple args</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> write</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">:</span><span class="token plain"> Writable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> write_arg</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Writable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">arg</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            arg</span><span class="token punctuation">.</span><span class="token plain">write_to</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        args</span><span class="token punctuation">.</span><span class="token plain">each</span><span class="token punctuation">[</span><span class="token plain">write_arg</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Also make it Writable to allow `print` to write the inner String</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> write_to</span><span class="token punctuation">[</span><span class="token plain">W</span><span class="token punctuation">:</span><span class="token plain"> Writer</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> writer</span><span class="token punctuation">:</span><span class="token plain"> W</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        writer</span><span class="token punctuation">.</span><span class="token plain">write</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">s</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Point</span><span class="token punctuation">(</span><span class="token plain">Writable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Pass multiple args to the Writer. The Int and StringLiteral types call</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># `writer.write_bytes` in their own `write_to` implementations.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> write_to</span><span class="token punctuation">[</span><span class="token plain">W</span><span class="token punctuation">:</span><span class="token plain"> Writer</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> writer</span><span class="token punctuation">:</span><span class="token plain"> W</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        writer</span><span class="token punctuation">.</span><span class="token plain">write</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Point("</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">x</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">", "</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">y</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">")"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Enable conversion to a String using `str(point)`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__str__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> String</span><span class="token punctuation">.</span><span class="token plain">write</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> point </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Point</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> new_string </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> NewString</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">(</span><span class="token plain">point</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    new_string</span><span class="token punctuation">.</span><span class="token plain">write</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"\n"</span><span class="token punctuation">,</span><span class="token plain"> Point</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">new_string</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<div class="language-output codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-output codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">Point(1, 2)</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Point(3, 4)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>TypeIdentifiable</code> trait has been removed in favor of the new
<code>get_type_name</code> utility in the <code>compile.reflection</code> module.</p>
</li>
<li class="">
<p>Python interop changes:</p>
<ul>
<li class="">
<p>Introduced
<code>TypedPythonObject</code>
as a light-weight way to annotate
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> values with
static type information. This design will likely evolve and change
significantly.</p>
<ul>
<li class="">Added <code>TypedPythonObject[Tuple].__getitem__()</code> for accessing the elements
of a Python tuple.</li>
</ul>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python/Python/#add_object"><code>Python.add_object()</code></a>, to
add a named <code>PythonObject</code> value to a Python 'module' object instance.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python/Python/#unsafe_get_python_exception"><code>Python.unsafe_get_python_exception()</code></a>,
as an efficient low-level utility to get the Mojo <code>Error</code> equivalent of the
current CPython error state.</p>
</li>
<li class="">
<p>Add
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#from_borrowed_ptr"><code>PythonObject.from_borrowed_ptr()</code></a>,
to simplify the construction of <code>PythonObject</code> values from CPython 'borrowed
reference' pointers.</p>
<p>The existing <code>PythonObject.__init__(PyObjectPtr)</code> should continue to be used
for the more common case of constructing a <code>PythonObject</code> from a 'strong
reference' pointer.</p>
</li>
<li class="">
<p>Support for multi-dimensional indexing and slicing for <code>PythonObject</code>
(PR <a href="https://github.com/modular/modular/pull/3549" target="_blank" rel="noopener noreferrer" class="">#3549</a>,
PR <a href="https://github.com/modular/modular/pull/3583" target="_blank" rel="noopener noreferrer" class="">#3583</a>).</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> np </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Python</span><span class="token punctuation">.</span><span class="token plain">import_module</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"numpy"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> np</span><span class="token punctuation">.</span><span class="token plain">array</span><span class="token punctuation">(</span><span class="token plain">PythonObject</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">reshape</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># 2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token operator" style="color:#a89984">-</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># [6 5 4]</span><br></div></code></pre></div></div>
<p>Note that the syntax, <code>a[1, ::-1]</code>, is currently not supported.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/#__contains__"><code>PythonObject.__contains__()</code></a>.
(<a href="https://github.com/modular/modular/pull/3101" target="_blank" rel="noopener noreferrer" class="">PR #3101</a>)</p>
<p>Example usage:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> PythonObject</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"1 in x"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
</li>
<li class="">
<p>Pointer related changes:</p>
<ul>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> type
now has an <code>origin</code> parameter that can be used when the <code>UnsafePointer</code>
points to a value with a known origin. This origin is propagated through the
<code>ptr[]</code> indirection operation. This parameter and other <code>UnsafePointer</code>
parameters (other than the type) are now keyword-only.</p>
</li>
<li class="">
<p>You can now index into <code>UnsafePointer</code> using <code>SIMD</code> scalar integral types:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">p </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> UnsafePointer</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">alloc</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">i </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> UInt8</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">p</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">p</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added a new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/owned_pointer/OwnedPointer/"><code>OwnedPointer</code></a>
type as a safe, single-owner, non-nullable smart pointer with similar
semantics to Rust's
<a href="https://doc.rust-lang.org/std/boxed/struct.Box.html" target="_blank" rel="noopener noreferrer" class=""><code>Box&lt;&gt;</code></a> and C++'s
<a href="https://en.cppreference.com/w/cpp/memory/unique_ptr" target="_blank" rel="noopener noreferrer" class=""><code>std::unique_ptr</code></a>.
(<a href="https://github.com/modular/modular/pull/3524" target="_blank" rel="noopener noreferrer" class="">PR #3524</a>)</p>
</li>
<li class="">
<p><code>Arc</code> has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/arc_pointer/ArcPointer/"><code>ArcPointer</code></a>, for consistency
with <code>OwnedPointer</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/arc_pointer/ArcPointer/"><code>ArcPointer</code></a> now implements
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/identifiable/Identifiable/"><code>Identifiable</code></a>, and can be
compared for pointer equivalence using <code>a is b</code>.</p>
</li>
<li class="">
<p>The <code>Reference</code> type has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/Pointer/"><code>Pointer</code></a>: a memory safe complement
to <code>UnsafePointer</code>. This change is motivated by the fact that <code>Pointer</code> is
assignable and requires an explicit dereference with <code>ptr[]</code>. Renaming to
<code>Pointer</code> clarifies that "references" means <code>ref</code> arguments and results, and
gives us a model that is more similar to what the C++ community would
expect.</p>
<p>For an overview of Mojo's pointer types, see the new
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/pointers/">Intro to pointers</a> page in the Mojo Manual.</p>
</li>
<li class="">
<p>A new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#as_noalias_ptr"><code>as_noalias_ptr()</code></a>
method as been added to <code>UnsafePointer</code>. This method specifies to the
compiler that the resultant pointer is a distinct identifiable object that
does not alias any other memory in the local scope.</p>
</li>
</ul>
</li>
<li class="">
<p>Added the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/floatable/Floatable/"><code>Floatable</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/floatable/FloatableRaising/"><code>FloatableRaising</code></a> traits
to denote types that can be converted to a <code>Float64</code> value using the builtin
<code>float</code> function. Made <code>SIMD</code> and <code>FloatLiteral</code> conform to the <code>Floatable</code>
trait. (<a href="https://github.com/modular/modular/pull/3163" target="_blank" rel="noopener noreferrer" class="">PR #3163</a>)</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">F</span><span class="token punctuation">:</span><span class="token plain"> Floatable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">v</span><span class="token punctuation">:</span><span class="token plain"> F</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> f </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">float</span><span class="token punctuation">(</span><span class="token plain">Int32</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">45</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/rebind/rebind/"><code>rebind()</code></a> standard library function
now works with memory-only types in addition to
<code>@register_passable("trivial")</code> ones, without requiring a copy. For more
information, see
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/parameters/#the-rebind-builtin">The <code>rebind()</code> builtin</a> in the
Mojo Manual.</p>
</li>
<li class="">
<p>Introduced the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/random/random/shuffle/"><code>random.shuffle()</code></a>
function for randomizing the elements of a <code>List</code>.
(<a href="https://github.com/modular/modular/pull/3327" target="_blank" rel="noopener noreferrer" class="">PR #3327</a>)</p>
<p>Example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> random </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> shuffle</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> l </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">shuffle</span><span class="token punctuation">(</span><span class="token plain">l</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#__getitem__"><code>Dict.__getitem__()</code></a>
method now returns a reference instead of a copy of the value (or raises).
This improves the performance of common code that uses <code>Dict</code> by allowing
borrows from the <code>Dict</code> elements.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/builtin_slice/Slice/#fields"><code>Slice.step</code></a> is now an
<code>Optional[Int]</code>, matching the optionality of <code>slice.step</code> in Python.
(<a href="https://github.com/modular/modular/pull/3160" target="_blank" rel="noopener noreferrer" class="">PR #3160</a>)</p>
</li>
<li class="">
<p>There is now a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/#aliases"><code>Byte</code></a> alias to better
express intent when working with a pack of bits.
(<a href="https://github.com/modular/modular/pull/3670" target="_blank" rel="noopener noreferrer" class="">PR #3670</a>).</p>
</li>
<li class="">
<p>Expanded <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/path/path/"><code>os.path</code></a> with new functions:</p>
<ul>
<li class=""><code>os.path.expandvars()</code>: Expands environment variables in a path
(<a href="https://github.com/modular/modular/pull/3735" target="_blank" rel="noopener noreferrer" class="">PR #3735</a>).</li>
<li class=""><code>os.path.splitroot()</code>: Split a path into drive, root and tail.
(<a href="https://github.com/modular/modular/pull/3780" target="_blank" rel="noopener noreferrer" class="">PR #3780</a>).</li>
</ul>
</li>
<li class="">
<p>Added a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#reserve"><code>reserve()</code></a>
method and new constructor to the <code>String</code> struct to allocate additional
capacity. (<a href="https://github.com/modular/modular/pull/3755" target="_blank" rel="noopener noreferrer" class="">PR #3755</a>).</p>
</li>
<li class="">
<p>A new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/#get"><code>StringLiteral.get[some_stringable]()</code></a>
method is available. It allows forming a runtime-constant <code>StringLiteral</code> from
a compile-time-dynamic <code>Stringable</code> value.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a> has moved from the <code>utils</code> module to
the <code>memory</code> module.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a> now implements <code>__reversed__()</code>. This
means that one can get a reverse iterator over a <code>Span</code> using
<code>reversed(my_span)</code>. Users should currently prefer this method over
<code>my_span[::-1]</code>.</p>
</li>
<li class="">
<p>A new <code>AsBytes</code> trait has been added to
enable taking a <code>Span[Byte]</code> from any type that implements <code>as_bytes()</code>.
<code>String.as_bytes()</code> and <code>String.as_bytes_slice()</code> have been consolidated under
<code>String.as_bytes()</code> to return a <code>Span[Byte]</code>. If you require a copy, you can
convert the <code>Span</code> to a <code>List</code> with <code>List(my_string.as_bytes())</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a> now
implements <code>strip()</code>, <code>rstrip()</code>, and <code>lstrip()</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringRef</code></a> now
implements <code>split()</code> which can be used to split a <code>StringRef</code> into a
<code>List[StringRef]</code> by a delimiter. (<a href="https://github.com/modular/modular/pull/2705" target="_blank" rel="noopener noreferrer" class="">PR
#2705</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringRef</code></a> is now
representable so <code>repr(StringRef("hello"))</code> will return <code>StringRef('hello')</code>.</p>
</li>
<li class="">
<p>More things have been removed from the auto-exported set of entities in the
<code>prelude</code> module from the Mojo standard library:</p>
<ul>
<li class=""><code>UnsafePointer</code> has been removed. Please explicitly import it via
<code>from memory import UnsafePointer</code>.</li>
<li class=""><code>StringRef</code> has been removed. Please explicitly import it via
<code>from utils import StringRef</code>.</li>
</ul>
</li>
<li class="">
<p>Restored implicit copyability of <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/tuple/Tuple/"><code>Tuple</code></a>
and <code>ListLiteral</code>.</p>
</li>
<li class="">
<p>The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/ffi/#aliases">aliases for C foreign function interface (FFI)</a>
have been renamed: <code>C_int</code> -&gt; <code>c_int</code>, <code>C_long</code> -&gt; <code>c_long</code> and so on.</p>
</li>
<li class="">
<p><code>Float32</code> and <code>Float64</code> are now printed and converted to strings with
roundtrip guarantee and shortest representation:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">Value                       Old                       New</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Float64(0.3)                0.29999999999999999       0.3</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Float32(0.3)                0.30000001192092896       0.3</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Float64(0.0001)             0.0001                    0.0001</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Float32(0.0001)             9.9999997473787516e-05    0.0001</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Float64(-0.00001)           -1.0000000000000001e-05   -1e-05</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Float32(-0.00001)           -9.9999997473787516e-06   -1e-05</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Float32(0.00001234)         1.2339999557298142e-05    1.234e-05</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Float32(-0.00000123456)     -1.2345600453045336e-06   -1.23456e-06</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Float64(1.1234567e-320)     1.1235052786429946e-320   1.1235e-320</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">Float64(1.234 * 10**16)     12340000000000000.0       1.234e+16</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>StaticIntTuple</code> data structure in the <code>utils</code> package has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/index/IndexList/"><code>IndexList</code></a>. The data structure now
allows one to specify the index bitwidth of the elements along with whether
the underlying indices are signed or unsigned.</p>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/ffi/OwnedDLHandle/#get_symbol"><code>DLHandle.get_symbol()</code></a>, for
getting a pointer to a symbol in a dynamic library. This is more general
purpose than the existing methods for getting function pointers.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="24-6-tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#24-6-tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The VS Code Mojo Debugger now has a <code>buildArgs</code> JSON debug configuration
setting that can be used in conjunction with <code>mojoFile</code> to define the build
arguments when compiling the Mojo file.</p>
</li>
<li class="">
<p>The VS Code extension now supports a <code>Configure Build and Run Args</code> command
that helps set the build and run args for actions file <code>Run Mojo File</code> and
<code>Debug Mojo File</code>. A corresponding button appears in <code>Run and Debug</code> selector
in the top right corner of a Mojo File.</p>
</li>
<li class="">
<p>The VS Code extension now has the <code>mojo.run.focusOnTerminalAfterLaunch</code>
setting, which controls whether to focus on the terminal used by the
<code>Mojo: Run Mojo File</code> command or on the editor after launch.
<a href="https://github.com/modular/modular/issues/3532" target="_blank" rel="noopener noreferrer" class="">Issue #3532</a>.</p>
</li>
<li class="">
<p>The VS Code extension now has the <code>mojo.SDK.additionalSDKs</code> setting, which
allows the user to provide a list of MAX SDKs that the extension can use when
determining a default SDK to use. The user can select the default SDK to use
with the <code>Mojo: Select the default MAX SDK</code> command.</p>
</li>
<li class="">
<p>The VS Code extension now supports setting
<a href="https://code.visualstudio.com/docs/editor/debugging#_data-breakpoints" target="_blank" rel="noopener noreferrer" class="">data breakpoints</a>
as well as
<a href="https://code.visualstudio.com/docs/editor/debugging#_function-breakpoints" target="_blank" rel="noopener noreferrer" class="">function breakpoints</a>.</p>
</li>
<li class="">
<p>The Mojo LLDB debugger now supports symbol breakpoints, for example, <code>b main</code>
or <code>b my_module::main</code>.</p>
</li>
<li class="">
<p>Error messages that include type names no longer include inferred or defaulted
parameters when they aren't needed. For example, previously Mojo complained
about things like:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">... cannot be converted from 'UnsafePointer[UInt, 0, _default_alignment::AnyType](), MutableAnyOrigin]' to 'UnsafePointer[Int, 0, _default_alignment[::AnyType](), MutableAnyOrigin]'</span><br></div></code></pre></div></div>
<p>it now complains more helpfully that:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">... cannot be converted from 'UnsafePointer[UInt]' to 'UnsafePointer[Int]'</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Tooling now prints the origins of <code>ref</code> arguments and results correctly, and
prints <code>self</code> instead of <code>self: Self</code> in methods.</p>
</li>
<li class="">
<p>The Mojo Language Server and generated documentation now print parametric
result types correctly, e.g. showing <code>SIMD[type, simd_width]</code> instead of
<code>SIMD[$0, $1]</code>.</p>
</li>
<li class="">
<p>Generated API documentation now shows the signatures for structs, and
identifies <code>@register_passable</code> and <code>@register_passable("trivial")</code> types.</p>
</li>
<li class="">
<p>The VS Code extension now allows cancelling the installation of its private
MAX SDK.</p>
</li>
<li class="">
<p>The VS Code extension now opens the Run and Debug tab automatically whenever
a debug session starts.</p>
</li>
<li class="">
<p>The <code>mojo debug --vscode</code> command now support the <code>--init-command</code> and
<code>--stop-on-entry</code> flags. Execute <code>mojo debug --help</code> for more information.</p>
</li>
<li class="">
<p>The Mojo LLDB debugger on VS Code now supports inspecting the raw attributes
of variables that are handled as synthetic types, e.g. <code>List</code> from Mojo or
<code>std::vector</code> from C++.</p>
</li>
<li class="">
<p>The VS Code extension now allows selecting a default SDK when multiple are
available.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">The <code>UnsafePointer.bitcast()</code> overload for <code>DType</code> has been removed. Wrap your
<code>DType</code> in a <code>Scalar[my_dtype]</code> to call the only overload of <code>bitcast()</code> now.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p>Lifetime tracking is now fully field sensitive, which makes the uninitialized
variable checker more precise.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1310" target="_blank" rel="noopener noreferrer" class="">Issue #1310</a> - Mojo permits
the use of any constructor for implicit conversions</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1632" target="_blank" rel="noopener noreferrer" class="">Issue #1632</a> - Mojo produces
weird error when inout function is used in non mutating function</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3444" target="_blank" rel="noopener noreferrer" class="">Issue #3444</a> - Raising init
causing use of uninitialized variable</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3544" target="_blank" rel="noopener noreferrer" class="">Issue #3544</a> - Known
mutable <code>ref</code> argument are not optimized as <code>noalias</code> by LLVM.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3559" target="_blank" rel="noopener noreferrer" class="">Issue #3559</a> - VariadicPack
doesn't extend the lifetimes of the values it references.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3627" target="_blank" rel="noopener noreferrer" class="">Issue #3627</a> - Compiler
overlooked exclusivity violation caused by <code>ref [MutableAnyOrigin] T</code></p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3710" target="_blank" rel="noopener noreferrer" class="">Issue #3710</a> - Mojo frees
memory while reference to it is still in use.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3805" target="_blank" rel="noopener noreferrer" class="">Issue #3805</a> - Crash When
Initializing !llvm.ptr.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3816" target="_blank" rel="noopener noreferrer" class="">Issue #3816</a> - Ternary
if-operator doesn't propagate origin information.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3815" target="_blank" rel="noopener noreferrer" class="">Issue #3815</a> -
[BUG] Mutability not preserved when taking the union of two origins.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3829" target="_blank" rel="noopener noreferrer" class="">Issue #3829</a> - Poor error
message when invoking a function pointer upon an argument of the wrong origin</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3830" target="_blank" rel="noopener noreferrer" class="">Issue #3830</a> - Failures
emitting register RValues to ref arguments.</p>
</li>
<li class="">
<p>The VS Code extension now auto-updates its private copy of the MAX SDK.</p>
</li>
<li class="">
<p>The variadic initializer for <code>SIMD</code> now works in parameter expressions.</p>
</li>
<li class="">
<p>The VS Code extension now downloads its private copy of the MAX SDK in a way
that prevents <code>ETXTBSY</code> errors on Linux.</p>
</li>
<li class="">
<p>The VS Code extension now allows invoking a mojo formatter from SDK
installations that contain white spaces in their path.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.24.6/#special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h2>
<p>Special thanks to our community contributors:
<a href="https://github.com/soraros" target="_blank" rel="noopener noreferrer" class="">@soraos</a>, <a href="https://github.com/jjvraw" target="_blank" rel="noopener noreferrer" class="">@jjvraw</a>,
<a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>,
<a href="https://github.com/thatstoasty" target="_blank" rel="noopener noreferrer" class="">@thatstoasty</a>,
<a href="https://github.com/szbergeron" target="_blank" rel="noopener noreferrer" class="">@szbergeron</a>,
<a href="https://github.com/rd4com" target="_blank" rel="noopener noreferrer" class="">@rd4com</a>,
<a href="https://github.com/fknfilewalker" target="_blank" rel="noopener noreferrer" class="">@fknfilewalker</a>,
<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>,
<a href="https://github.com/avitkauskas" target="_blank" rel="noopener noreferrer" class="">@avitkauskas</a>, and
<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v24.5]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.24.5/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.24.5/"/>
        <updated>2024-09-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.24.5/#-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<p>Here's a brief summary of some of the major changes in this release, with more
detailed information in the following sections:</p>
<ul>
<li class="">
<p>Mojo now supports Python 3.12 interoperability.</p>
</li>
<li class="">
<p>The set of automatically imported entities (types, aliases, functions) into
users' Mojo programs has been dramatically reduced. This can break existing
user code as users will need to explicitly import what they're using for cases
previously automatically included before.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/io/io/print/"><code>print()</code></a> now requires that its arguments
conform to the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/Writable/"><code>Formattable</code></a> trait.
This enables efficient stream-based writing by default, avoiding unnecessary
intermediate String heap allocations.</p>
</li>
<li class="">
<p>The new builtin <a class="" href="https://mojolang.static.modular-staging.com/docs/std/io/io/input/"><code>input()</code></a> function prints an
optional prompt and reads a line from standard input, in the same way as
Python.</p>
</li>
<li class="">
<p>Mojo now allows implicit definitions of variables within a <code>fn</code> in the same
way that has been allowed in a <code>def</code>. The <code>var</code> keyword is still allowed, but
is now optional.</p>
</li>
<li class="">
<p>Mojo now diagnoses "argument exclusivity" violations due to aliasing
references. Mojo requires references (including implicit references due to
<code>borrowed</code>/<code>inout</code> arguments) to be uniquely referenced (non-aliased) if
mutable. This is a warning in the 24.5 release, but will be upgraded to an
error in subsequent releases.</p>
</li>
<li class="">
<p>Mojo now supports "conditional conformances" where some methods on a struct
have additional trait requirements that the struct itself doesn't.</p>
</li>
<li class="">
<p><code>DTypePointer</code>, <code>LegacyPointer</code>, and <code>Pointer</code> have been removed. Use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> instead.
Functions that previously took a <code>DTypePointer</code> now take an equivalent
<code>UnsafePointer</code>. For more information on using pointers, see <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/pointers/unsafe-pointers/">Unsafe
pointers</a> in the Mojo Manual.</p>
</li>
<li class="">
<p>There are many new standard library APIs, with new features for strings,
collections, and interacting with the filesystem and environment. Changes are
listed in the standard library section.</p>
</li>
<li class="">
<p>The VS Code extension now supports a vendored MAX SDK for VS Code, which is
automatically downloaded by the extension and it's used for all Mojo features,
including the Mojo Language Server, the Mojo debugger, the Mojo formatter, and
more.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/tools/testing/"><code>mojo test</code></a> now uses the Mojo compiler for running unit
tests. This will resolve compilation issues that sometimes appeared, and will
also improve overall test execution times.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.5/#language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Mojo now allows implicit definitions of variables within a <code>fn</code> in the same
way that has been allowed in a <code>def</code>. The <code>var</code> keyword is still allowed and
still denotes the declaration of a new variable with a scope (in both <code>def</code>
and <code>fn</code>). Relaxing this makes <code>fn</code> and <code>def</code> more similar, but they still
differ in other important ways.</p>
</li>
<li class="">
<p>Mojo now diagnoses "argument exclusivity" violations due to aliasing
references. Mojo requires references (including implicit references due to
<code>borrowed</code>/<code>inout</code> arguments) to be uniquely referenced (non-aliased) if
mutable. This is important for code safety, because it allows the compiler
(and readers of code) to understand where and when a value is mutated. It is
also useful for performance optimization because it allows the compiler to
know that accesses through immutable references cannot change behind the
scenes. Here is an invalid example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">take_two_strings</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> String</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> String</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">   </span><span class="token comment" style="color:#a89984"># Mojo knows 'a' and 'b' cannot be the same string.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">   b </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> a</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">invalid_access</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> my_string </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># warning: passing `my_string` inout is invalid since it is also passed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># borrowed.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  take_two_strings</span><span class="token punctuation">(</span><span class="token plain">my_string</span><span class="token punctuation">,</span><span class="token plain"> my_string</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>This is similar to
<a href="https://swift.org/blog/swift-5-exclusivity/" target="_blank" rel="noopener noreferrer" class="">Swift exclusivity checking</a> and
the
<a href="https://doc.rust-lang.org/beta/book/ch04-02-references-and-borrowing.html" target="_blank" rel="noopener noreferrer" class="">Rust language</a>
sometimes known as "aliasing xor mutability". That said, the Mojo
implementation details are somewhat different because lifetimes are embedded
in types.</p>
<p>This is a warning in the 24.5 release, but will be upgraded to an error in
subsequent releases.</p>
<div style="--alert-bg:var(--Elements-Blue-20-Alpha);--alert-color:var(--Elements-Blue-120-100);--alert-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="admonitionAlertRoot_CLSZ my-6 alert alert--secondary m_66836ed3 mantine-Alert-root" id="mantine-R524qlluh" role="alert" aria-label="note" data-admonition-type="note" aria-describedby="mantine-R524qlluh-body"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" style="width:calc(1.25rem * var(--mantine-scale));height:calc(1.25rem * var(--mantine-scale))"><g clip-path="url(#:R6t24qlluh:)"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 2.5a.4.4 0 0 1-.5-.4V.8H.8v18.4h18.4V2.5h-1.3Zm-15.5 15v-15h14.6c.2 0 .4.2.4.4v14.6h-15Zm9-13v2h-2v-2h2Zm-2 5H8v-2h3.5v7h-2v-5Z" fill="currentColor"></path></g><defs><clipPath id=":R6t24qlluh:"><path fill="currentColor" d="M0 0h20v20H0z"></path></clipPath></defs></svg></div><div class="m_667c2793 mantine-Alert-body"><div id="mantine-R524qlluh-body" class="body-14-light m_7fa78076 mantine-Alert-message"><div class="admonitionAlertContent_Zg_U"><p>Argument exclusivity is not enforced for register-passable types. They are
passed by copy, so they don't form aliases.</p></div></div></div></div></div>
</li>
<li class="">
<p>Mojo now supports "conditional conformances" where some methods on a struct
have additional trait requirements that the struct itself doesn't. This is
expressed through an explicitly declared <code>self</code> type:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">GenericThing</span><span class="token punctuation">[</span><span class="token plain">Type</span><span class="token punctuation">:</span><span class="token plain"> AnyType</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Works with anything</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Sugar for 'fn normal_method[Type: AnyType](self: GenericThing[Type]):'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">normal_method</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Just redeclare the requirements with more specific types:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> needs_move</span><span class="token punctuation">[</span><span class="token plain">Type</span><span class="token punctuation">:</span><span class="token plain"> Movable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"> GenericThing</span><span class="token punctuation">[</span><span class="token plain">Type</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">owned</span><span class="token plain"> val</span><span class="token punctuation">:</span><span class="token plain"> Type</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> tmp </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> val</span><span class="token operator" style="color:#a89984">^</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Ok to move 'val' since it is Movable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">usage_example</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> GenericThing</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  a</span><span class="token punctuation">.</span><span class="token plain">normal_method</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Ok, Int conforms to AnyType</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  a</span><span class="token punctuation">.</span><span class="token plain">needs_move</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Ok, Int is movable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> b </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> GenericThing</span><span class="token punctuation">[</span><span class="token plain">NonMovable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  b</span><span class="token punctuation">.</span><span class="token plain">normal_method</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Ok, NonMovable conforms to AnyType</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># error: argument type 'NonMovable' does not conform to trait 'Movable'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  b</span><span class="token punctuation">.</span><span class="token plain">needs_move</span><span class="token punctuation">(</span><span class="token plain">NonMovable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Conditional conformance works with dunder methods and other things as well.</p>
</li>
<li class="">
<p>As a specific form of "conditional conformances", initializers in a struct
may indicate specific parameter bindings to use in the type of their <code>self</code>
argument. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">MyStruct</span><span class="token punctuation">[</span><span class="token plain">size</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"> MyStruct</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"> MyStruct</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"> MyStruct</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">test</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    a </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> MyStruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain">      </span><span class="token comment" style="color:#a89984"># Infers size=0 from 'self' type.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    b </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> MyStruct</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token plain">     </span><span class="token comment" style="color:#a89984"># Infers size=1 from 'self' type.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    c </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> MyStruct</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Infers size=2 from 'self' type.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now supports named result bindings. Named result bindings are useful for
directly emplacing function results into the output slot of a function. This
feature provides more flexibility and guarantees around emplacing the result
of a function compared to "guaranteed" named return value optimization (NRVO).
If a <code>@register_passable</code> result is bound to a name, the result value is made
accessible as a mutable reference.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">efficiently_return_string</span><span class="token punctuation">(</span><span class="token plain">b</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String </span><span class="token keyword" style="color:#af2528">as</span><span class="token plain"> output</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        output </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"emplaced!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        mutate</span><span class="token punctuation">(</span><span class="token plain">output</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"regular return"</span><br></div></code></pre></div></div>
<p>If we used a temporary for <code>output</code> instead, we would need to move into the
result slot, which wouldn't work if the result type was non-movable.</p>
<p>In a function with a named result, <code>return</code> may be used with no operand to
signal an exit from the function, or it can be used normally to specify the
return value of the function. The compiler will error if the result is not
initialized on all normal exit paths from the function.</p>
</li>
<li class="">
<p><code>__setitem__()</code> now works with variadic argument lists such as:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">YourType</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__setitem__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">indices</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> val</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>The Mojo compiler now always passes the "new value" being set using the last
keyword argument of the <code>__setitem__()</code>, e.g. turning <code>yourType[1, 2] = 3</code>
into <code>yourType.__setitem__(1, 2, val=3)</code>. This fixes <a href="https://github.com/modular/modular/issues/248" target="_blank" rel="noopener noreferrer" class="">Issue
#248</a>.</p>
</li>
<li class="">
<p>Mojo context managers used in regions of code that may raise no longer need to
define a "conditional" exit function in the form of
<code>fn __exit__(self, e: Error) -&gt; Bool</code>. This function allows the context
manager to conditionally intercept and handle the error and allow the function
to continue executing. This is useful for some applications, but in many cases
the conditional exit would delegate to the unconditional exit function
<code>fn __exit__(self)</code>.</p>
<p>Concretely, this enables defining <code>with</code> regions that unconditionally
propagate inner errors, allowing code like:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">might_raise</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">with</span><span class="token plain"> ContextMgr</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> might_raise</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># no longer complains about missing return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">with</span><span class="token plain"> ContextMgr</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> might_raise</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># no longer complains about 'x' being uninitialized</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>async</code> functions now support memory-only results (like <code>String</code>, <code>List</code>,
etc.) and <code>raises</code>. Accordingly, both
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/coroutine/Coroutine/"><code>Coroutine</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/coroutine/RaisingCoroutine/"><code>RaisingCoroutine</code></a> have
been changed to accept <code>AnyType</code> instead of <code>__TypeOfAllTypes</code>. This means
the result types of <code>async</code> functions do not need to be <code>Movable</code>.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">async</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">raise_or_string</span><span class="token punctuation">(</span><span class="token plain">c</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">)</span><span class="token plain"> raises </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> c</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">raise</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"whoops!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hello world!"</span><br></div></code></pre></div></div>
<p>Note that <code>async</code> functions do not yet support indirect calls, <code>ref</code> results,
and constructors.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/Pointer/"><code>Reference</code></a> type (and many
iterators) now use <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/parameters/#infer-only-parameters">infer-only
parameters</a> to represent the
mutability of their lifetime, simplifying the interface.</p>
</li>
<li class="">
<p>The environment variable <code>MOJO_PYTHON</code> can be pointed to an executable to pin
Mojo to a specific version:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token builtin class-name" style="color:#b4730e">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#af2528">MOJO_PYTHON</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"/usr/bin/python3.11"</span><br></div></code></pre></div></div>
<p>Or a virtual environment to always have access to those Python modules:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token builtin class-name" style="color:#b4730e">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#af2528">MOJO_PYTHON</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"~/venv/bin/python"</span><br></div></code></pre></div></div>
<p><code>MOJO_PYTHON_LIBRARY</code> still exists for environments with a dynamic <code>libpython</code>
but no Python executable.</p>
</li>
<li class="">
<p>The pointer aliasing semantics of Mojo have changed. Initially, Mojo adopted a
C-like set of semantics around pointer aliasing and derivation. However, the C
semantics bring a lot of history and baggage that are not needed in Mojo and
which complicate compiler optimizations. The language overall provides a
stronger set of invariants around pointer aliasing with lifetimes and
exclusive mutable references to values, etc.</p>
<p>It is now forbidden to convert a non-pointer-typed value derived from a
Mojo-allocated pointer, such as an integer address, to a pointer-typed value.
"Derived" means there is overlap in the bits of the non-pointer-typed value
with the original pointer value. Accordingly, the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a>
constructor that took an <code>address</code> keyword argument has been removed.</p>
<p>It is still possible to make this conversion in certain cases where it is
absolutely necessary, such as interoperating with other languages like Python.
In this case, the compiler makes two assumptions: any pointer derived from a
non-pointer-typed value does not alias any Mojo-derived pointer and that any
external function calls have arbitrary memory effects.</p>
</li>
<li class="">
<p><code>await</code> on a coroutine now consumes it. This strengthens the invariant that
coroutines can be awaited only once.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.5/#standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/"><code>builtin</code></a> package:</p>
<ul>
<li class="">
<p>The set of automatically imported entities (types, aliases, functions) into
users' Mojo programs has been dramatically reduced. Before, with the way the
<code>builtin</code> module was handled, all of the entities in the following modules
would be automatically included:</p>
<p><code>memory</code>, <code>sys</code>, <code>os</code>, <code>utils</code>, <code>python</code>, <code>bit</code>, <code>random</code>, <code>math</code>,
<code>builtin</code>, <code>collections</code></p>
<p>Now, only the explicitly enumerated entities in <code>prelude/__init__.mojo</code> are
the ones automatically imported into users' Mojo programs. This will break a
lot of user code as users will need to explicitly import what they're using
for cases previously commonly included before (such as
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/variant/Variant/"><code>Variant</code></a>, and functions such as
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/abort/"><code>abort()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/info/align_of/"><code>alignof()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe/bitcast/"><code>bitcast()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/info/bit_width_of/"><code>bitwidthof()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/ffi/external_call/"><code>external_call()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/info/simd_width_of/"><code>simdwidthof()</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/info/size_of/"><code>sizeof()</code></a>).</p>
</li>
<li class="">
<p>Some types from the <code>builtin</code> module have been moved to different modules
for clarity which is made possible now that we have a <code>prelude</code> module that
can re-export symbols from modules other than <code>builtin</code>.</p>
<p>In particular, the <code>builtin.string</code> module has been moved to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/"><code>collections.string</code></a>.</p>
</li>
</ul>
</li>
<li class="">
<p>Input and output:</p>
<ul>
<li class="">
<p>Added the builtin <a class="" href="https://mojolang.static.modular-staging.com/docs/std/io/io/input/"><code>input()</code></a> function, which
behaves the same as Python.
(<a href="https://github.com/modular/modular/pull/3392" target="_blank" rel="noopener noreferrer" class="">PR #3392</a>)</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">name </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">input</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Enter your name: "</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Hello, "</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> name </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"!"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>If the user enters "Mojo" it returns "Hello, Mojo!"</p>
<p>There is a known issue when running the <code>input()</code> function with JIT
compilation (see issue
<a href="https://github.com/modular/modular/issues/3479" target="_blank" rel="noopener noreferrer" class="">#3479</a>).</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/io/io/print/"><code>print()</code></a> now requires that its arguments conform
to the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/Writable/"><code>Formattable</code></a> trait. This enables
efficient stream-based writing by default, avoiding unnecessary intermediate
String heap allocations.</p>
<p>Previously, <code>print()</code> required types conform to <code>Stringable</code>. This meant
that to execute a call like <code>print(a, b, c)</code>, at least three separate String
heap allocations were down, to hold the formatted values of <code>a</code>, <code>b</code>, and
<code>c</code> respectively. The total number of allocations could be much higher if,
for example, <code>a.__str__()</code> was implemented to concatenate together the
fields of <code>a</code>, like in the following example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Point</span><span class="token punctuation">(</span><span class="token plain">Stringable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__str__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token comment" style="color:#a89984"># Performs 3 allocations: 1 each for str(..) of each of the fields,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token comment" style="color:#a89984"># and then the final returned `String` allocation.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"("</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">", "</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">y</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">")"</span><br></div></code></pre></div></div>
<p>A type like the one above can transition to additionally implementing
<code>Formattable</code> with the following changes:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Point</span><span class="token punctuation">(</span><span class="token plain">Stringable</span><span class="token punctuation">,</span><span class="token plain"> Formattable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__str__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> String</span><span class="token punctuation">.</span><span class="token plain">format_sequence</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">format_to</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> writer</span><span class="token punctuation">:</span><span class="token plain"> Formatter</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        writer</span><span class="token punctuation">.</span><span class="token plain">write</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"("</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">x</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">", "</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">y</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">")"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>In the example above,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#format_sequence"><code>String.format_sequence()</code></a>
is used to construct a <code>String</code> from a type that implements <code>Formattable</code>.
This pattern of implementing a type's <code>Stringable</code> implementation in terms
of its <code>Formattable</code> implementation minimizes boilerplate and duplicated
code, while retaining backwards compatibility with the requirements of the
commonly used <code>str()</code> function.</p>
<div style="--alert-bg:var(--Elements-Blue-20-Alpha);--alert-color:var(--Elements-Blue-120-100);--alert-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="admonitionAlertRoot_CLSZ my-6 alert alert--secondary m_66836ed3 mantine-Alert-root" id="mantine-Rsi26qlluh" role="alert" aria-label="note" data-admonition-type="note" aria-describedby="mantine-Rsi26qlluh-body"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" style="width:calc(1.25rem * var(--mantine-scale));height:calc(1.25rem * var(--mantine-scale))"><g clip-path="url(#:Rrsi26qlluh:)"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 2.5a.4.4 0 0 1-.5-.4V.8H.8v18.4h18.4V2.5h-1.3Zm-15.5 15v-15h14.6c.2 0 .4.2.4.4v14.6h-15Zm9-13v2h-2v-2h2Zm-2 5H8v-2h3.5v7h-2v-5Z" fill="currentColor"></path></g><defs><clipPath id=":Rrsi26qlluh:"><path fill="currentColor" d="M0 0h20v20H0z"></path></clipPath></defs></svg></div><div class="m_667c2793 mantine-Alert-body"><div id="mantine-Rsi26qlluh-body" class="body-14-light m_7fa78076 mantine-Alert-message"><div class="admonitionAlertContent_Zg_U"><p>The error shown when passing a type that does not implement <code>Formattable</code> to
<code>print()</code> is currently not entirely descriptive of the underlying cause:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">error: invalid call to </span><span class="token string" style="color:#477a5b">'print'</span><span class="token builtin class-name" style="color:#b4730e">:</span><span class="token plain"> callee with non-empty variadic pack argument expects </span><span class="token number" style="color:#924f79">0</span><span class="token plain"> positional operands, but </span><span class="token number" style="color:#924f79">1</span><span class="token plain"> was specified</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">   print</span><span class="token punctuation">(</span><span class="token plain">point</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">   ~~~~~^~~~~~~</span><br></div></code></pre></div></div><p>If you see the above error, ensure that all argument types implement
<code>Formattable</code>.</p></div></div></div></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/debug_assert/debug_assert/"><code>debug_assert()</code></a> now also
requires that its <code>message</code> argument conform to <code>Formattable</code>.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/tempfile/tempfile/TemporaryDirectory/"><code>TemporaryDirectory</code></a> in
module <code>tempfile</code>.
(<a href="https://github.com/modular/modular/pull/2743" target="_blank" rel="noopener noreferrer" class="">PR 2743</a>)</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/tempfile/tempfile/NamedTemporaryFile/"><code>NamedTemporaryFile</code></a> in
module <code>tempfile</code>.
(<a href="https://github.com/modular/modular/pull/2762" target="_blank" rel="noopener noreferrer" class="">PR 2762</a>)</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/"><code>String</code></a> and friends:</p>
<ul>
<li class="">
<p>The <code>builtin.string</code> module has been moved to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/"><code>collections.string</code></a>.</p>
</li>
<li class="">
<p>Added the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#format"><code>String.format()</code></a>
method. (<a href="https://github.com/modular/modular/pull/2771" target="_blank" rel="noopener noreferrer" class="">PR #2771</a>)</p>
<p>Supports automatic and manual indexing of <code>*args</code>.</p>
<p>Examples:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"{1} Welcome to {0} {1}"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">format</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"mojo"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"🔥"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># 🔥 Wecome to mojo 🔥</span><br></div></code></pre></div></div>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"{} {} {}"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">format</span><span class="token punctuation">(</span><span class="token boolean" style="color:#af2528">True</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1.125</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984">#True 1.125 2</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#format"><code>String.format()</code></a>
now supports conversion flags <code>!s</code> and <code>!r</code>, allowing for <code>str()</code> and
<code>repr()</code> conversions within format strings. (<a href="https://github.com/modular/modular/pull/3279" target="_blank" rel="noopener noreferrer" class="">PR
#3279</a>)</p>
<p>Example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"{} {!r}"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">format</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Mojo"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"Mojo"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># "Mojo 'Mojo'"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">String</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"{0!s} {0!r}"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">format</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Mojo"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># "Mojo 'Mojo'"</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>String</code> class now has
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#rjust"><code>rjust()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#ljust"><code>ljust()</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#center"><code>center()</code></a> methods
to return a justified string based on width and fillchar. (<a href="https://github.com/modular/modular/pull/3278" target="_blank" rel="noopener noreferrer" class="">PR
#3278</a>)</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/atol/"><code>atol()</code></a> function now
correctly supports leading underscores, (e.g.<code>atol("0x_ff", 0)</code>), when the
appropriate base is specified or inferred (base 0). non-base-10 integer
literals as per Python's
<a href="https://docs.python.org/3/reference/lexical_analysis.html#integers" target="_blank" rel="noopener noreferrer" class="">Integer Literals</a>.
(<a href="https://github.com/modular/modular/pull/3180" target="_blank" rel="noopener noreferrer" class="">PR #3180</a>)</p>
</li>
<li class="">
<p>Added the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#unsafe_cstr_ptr"><code>unsafe_cstr_ptr()</code></a>
method to <code>String</code> and <code>StringLiteral</code>, which returns an
<code>UnsafePointer[c_char]</code> for convenient interoperability with C APIs.</p>
</li>
<li class="">
<p>Added the <code>byte_length()</code> method to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#byte_length"><code>String</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#byte_length"><code>StringSlice</code></a>,
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/#byte_length"><code>StringLiteral</code></a>
and deprecated their private <code>_byte_length()</code> methods. Added a warning to
the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#__len__"><code>String.__len__()</code></a>
method that it will return the length in Unicode codepoints in the future
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#__len__"><code>StringSlice.__len__()</code></a>
now does return the Unicode codepoints length.
(<a href="https://github.com/modular/modular/pull/2960" target="_blank" rel="noopener noreferrer" class="">PR #2960</a>)</p>
</li>
<li class="">
<p>Added a new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/#aliases"><code>StaticString</code></a> type
alias. This can be used in place of
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/"><code>StringLiteral</code></a> for
runtime string arguments.</p>
</li>
<li class="">
<p>Added a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#__init__"><code>StringSlice</code></a>
initializer that accepts a <code>StringLiteral</code>.</p>
</li>
<li class="">
<p>The <code>StringRef</code> constructors from <code>DTypePointer.int8</code> have been changed to
take a <code>UnsafePointer[c_char]</code>, reflecting their use for compatibility with
C APIs.</p>
</li>
<li class="">
<p>Continued the transition to <code>UnsafePointer</code> and unsigned byte type for
strings:</p>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#unsafe_ptr"><code>String.unsafe_ptr()</code></a>
now returns an <code>UnsafePointer[UInt8]</code> (was <code>UnsafePointer[Int8]</code>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/#unsafe_ptr"><code>StringLiteral.unsafe_ptr()</code></a>
now returns an <code>UnsafePointer[UInt8]</code> (was <code>UnsafePointer[Int8]</code>)</p>
</li>
</ul>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> and other
reference type changes:</p>
<ul>
<li class="">
<p><code>DTypePointer</code>, <code>LegacyPointer</code>, and <code>Pointer</code> have been removed. Use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> instead.
For more information on using pointers, see <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/pointers/unsafe-pointers/">Unsafe
pointers</a> in the Mojo Manual.</p>
<p>Functions that previously took a <code>DTypePointer</code> now take an equivalent
<code>UnsafePointer</code>. A quick rule for conversion from <code>DTypePointer</code> to
<code>UnsafePointer</code> is:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">DTypePointer</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> UnsafePointer</span><span class="token punctuation">[</span><span class="token plain">Scalar</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">]</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
<p>There could be places that you have code of the form:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">f</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">:</span><span class="token plain"> DTypePointer</span><span class="token punctuation">)</span><span class="token punctuation">:</span><br></div></code></pre></div></div>
<p>which is equivalent to <code>DTypePointer[*_]</code>. In this case you would have to
add an infer-only <code>type</code> parameter to the function:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> f</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">:</span><span class="token plain"> DType</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">:</span><span class="token plain"> UnsafePointer</span><span class="token punctuation">[</span><span class="token plain">Scalar</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><br></div></code></pre></div></div>
<p>because we can’t have an unbound parameter inside the struct.</p>
<p>There could also be places where you use
<code>DTypePointer[Scalar[DType.invalid/index]]</code>, and it would be natural to
change these to <code>UnsafePointer[NoneType/Int]</code>. But since these are not an
<code>UnsafePointer</code> that stores a <code>Scalar</code>, you might have to <code>rebind/bitcast</code>
to appropriate types.</p>
</li>
<li class="">
<p>The <code>DTypePointer</code>
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#load"><code>load()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#store"><code>store()</code></a> methods
have been moved to <code>UnsafePointer</code>.</p>
</li>
<li class="">
<p><code>UnsafePointer</code> now supports
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#strided_load"><code>strided_load()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#strided_store"><code>strided_store()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#gather"><code>gather()</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#scatter"><code>scatter()</code></a> when
the underlying type is <code>Scalar[DType]</code>.</p>
</li>
<li class="">
<p>The global functions for working with <code>UnsafePointer</code> have transitioned to
being methods through the use of conditional conformances:</p>
<ul>
<li class=""><code>destroy_pointee(p)</code> =&gt;
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#destroy_pointee"><code>p.destroy_pointee()</code></a></li>
<li class=""><code>move_from_pointee(p)</code> =&gt;
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#take_pointee"><code>p.take_pointee()</code></a></li>
<li class=""><code>initialize_pointee_move(p, value)</code> =&gt;
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#init_pointee_move"><code>p.init_pointee_move(value)</code></a></li>
<li class=""><code>initialize_pointee_copy(p, value)</code> =&gt;
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#init_pointee_copy"><code>p.init_pointee_copy(value)</code></a></li>
<li class=""><code>move_pointee(src=p1, dst=p2)</code> =&gt;
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#move_pointee_into"><code>p.move_pointee_into(p2)</code></a></li>
</ul>
</li>
<li class="">
<p>The <code>UnsafePointer.offset()</code> method is deprecated and will be removed in a
future release. Use <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/pointers/#storing-multiple-values">pointer
arithmetic</a> instead.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">new_ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> ptr</span><span class="token punctuation">.</span><span class="token plain">offset</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Becomes:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">new_ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> ptr </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>UnsafePointer</code> now has an
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#parameters"><code>alignment</code></a>
parameter to specify the static alignment of the pointer. Consequently,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#alloc"><code>UnsafePointer.alloc()</code></a>
no longer takes in an alignment parameter, and the alignment should be
specified in the type.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">UnsafePointer</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">alloc</span><span class="token punctuation">[</span><span class="token plain">alignment</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># now becomes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">UnsafePointer</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token punctuation">,</span><span class="token plain"> alignment</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">alloc</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>UnsafePointer</code> has a new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#parameters"><code>exclusive: Bool = False</code></a>
parameter. Setting this parameter to true tells the compiler that the user
knows this pointer and all those derived from it have exclusive access to
the underlying memory allocation. The compiler is not guaranteed to do
anything with this information.</p>
</li>
<li class="">
<p>It is no longer possible to cast (implicitly or explicitly) from <code>Reference</code>
to <code>UnsafePointer</code>. Instead of <code>UnsafePointer(someRef)</code> please use the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#address_of"><code>UnsafePointer.address_of(someRef[])</code></a>
which makes the code explicit that the <code>UnsafePointer</code> gets the address of
what the reference points to.</p>
</li>
</ul>
</li>
<li class="">
<p>Python interoperability changes:</p>
<ul>
<li class="">
<p>Mojo now supports Python 3.12 interoperability.</p>
</li>
<li class="">
<p>Creating a nested
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> from a list
or tuple of Python objects is possible now:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> np </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Python</span><span class="token punctuation">.</span><span class="token plain">import_module</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"numpy"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> np</span><span class="token punctuation">.</span><span class="token plain">array</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> b </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> np</span><span class="token punctuation">.</span><span class="token plain">array</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> arrays </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> PythonObject</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">assert_equal</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">arrays</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Also allowing more convenient call syntax:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> stacked </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> np</span><span class="token punctuation">.</span><span class="token plain">hstack</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">assert_equal</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">(</span><span class="token plain">stacked</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"[1 2 3 4 5 6]"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>(<a href="https://github.com/modular/modular/pull/3264" target="_blank" rel="noopener noreferrer" class="">PR #3264</a>)</p>
</li>
<li class="">
<p>Accessing local Python modules with
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python/Python/#add_to_path"><code>Python.add_to_path(".")</code></a>
is no longer required. It now behaves the same as Python. You can access
modules in the same folder as the target file:</p>
<ul>
<li class="">
<p><code>mojo run /tmp/main.mojo</code> can access <code>/tmp/mymodule.py</code></p>
</li>
<li class="">
<p><code>mojo build main.mojo -o ~/myexe &amp;&amp; ~/myexe</code> can access <code>~/mymodule.py</code></p>
</li>
</ul>
</li>
</ul>
</li>
<li class="">
<p>Collections:</p>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a> values are now equality
comparable with <code>==</code> and <code>!=</code> when their element type is equality
comparable. (<a href="https://github.com/modular/modular/pull/3195" target="_blank" rel="noopener noreferrer" class="">PR #3195</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a> values are now
equality comparable with <code>==</code> and <code>!=</code> when their element type is equality
comparable.</p>
</li>
<li class="">
<p>Added a new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/counter/Counter/"><code>Counter</code></a>
dictionary-like type, matching most of the features of the Python one.
(<a href="https://github.com/modular/modular/pull/2910" target="_blank" rel="noopener noreferrer" class="">PR #2910</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a> now implements
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#setdefault"><code>setdefault()</code></a>, which gets
a value from the dictionary by key, or sets it to a default if it doesn't
exist.
(<a href="https://github.com/modular/modular/pull/2803" target="_blank" rel="noopener noreferrer" class="">PR #2803</a>)</p>
</li>
<li class="">
<p><code>Dict</code> now supports
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#popitem"><code>popitem()</code></a>, which removes and
returns the last item in the <code>Dict</code>.
(<a href="https://github.com/modular/modular/pull/2701" target="_blank" rel="noopener noreferrer" class="">PR #2701</a>)</p>
</li>
<li class="">
<p>Added a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#__init__"><code>Dict.__init__()</code></a>
overload to specify initial capacity.
(<a href="https://github.com/modular/modular/pull/3171" target="_blank" rel="noopener noreferrer" class="">PR #3171</a>)</p>
<p>The capacity has to be a power of two and greater than or equal to 8.</p>
<p>It allows for faster initialization by skipping incremental growth steps.</p>
<p>Example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> dictionary </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Dict</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">,</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">power_of_two_initial_capacity </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1024</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Insert (2/3 of 1024) entries</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>ListLiteral</code> now supports <code>__contains__()</code>.
(<a href="https://github.com/modular/modular/pull/3251" target="_blank" rel="noopener noreferrer" class="">PR #3251</a>)</p>
</li>
</ul>
</li>
<li class="">
<p>Filesystem and environment utilities:</p>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/#home"><code>Path.home()</code></a> has been added to
return a path of the user's home directory.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/path/path/expanduser/"><code>os.path.expanduser()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/#expanduser"><code>pathlib.Path.exapanduser()</code></a>
have been added to allow expanding a prefixed <code>~</code> in a <code>String</code> or <code>Path</code>
with the user's home path:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> os</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">os</span><span class="token punctuation">.</span><span class="token plain">path</span><span class="token punctuation">.</span><span class="token plain">expanduser</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"~/.modular"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># /Users/username/.modular</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">os</span><span class="token punctuation">.</span><span class="token plain">path</span><span class="token punctuation">.</span><span class="token plain">expanduser</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"~root/folder"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># /var/root/folder (on macos)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># /root/folder     (on linux)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/path/path/split/"><code>os.path.split()</code></a> has been added for
splitting a path into <code>head, tail</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> os</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">head</span><span class="token punctuation">,</span><span class="token plain"> tail </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> os</span><span class="token punctuation">.</span><span class="token plain">path</span><span class="token punctuation">.</span><span class="token plain">split</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"/this/is/head/tail"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"head:"</span><span class="token punctuation">,</span><span class="token plain"> head</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"tail:"</span><span class="token punctuation">,</span><span class="token plain"> tail</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># head: /this/is/head</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># tail: tail</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/makedirs/"><code>os.makedirs()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/removedirs/"><code>os.removedirs()</code></a> have been added for
creating and removing nested directories:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> os</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">path </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> os</span><span class="token punctuation">.</span><span class="token plain">path</span><span class="token punctuation">.</span><span class="token plain">join</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"dir1"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"dir2"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"dir3"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">os</span><span class="token punctuation">.</span><span class="token plain">path</span><span class="token punctuation">.</span><span class="token plain">makedirs</span><span class="token punctuation">(</span><span class="token plain">path</span><span class="token punctuation">,</span><span class="token plain"> exist_ok</span><span class="token operator" style="color:#a89984">=</span><span class="token boolean" style="color:#af2528">True</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">os</span><span class="token punctuation">.</span><span class="token plain">path</span><span class="token punctuation">.</span><span class="token plain">removedirs</span><span class="token punctuation">(</span><span class="token plain">path</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/pwd/pwd/"><code>pwd</code></a> module has been added for accessing user
information in <code>/etc/passwd</code> on POSIX systems. This follows the same logic
as Python:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> pwd</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> os</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">current_user </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> pwd</span><span class="token punctuation">.</span><span class="token plain">getpwuid</span><span class="token punctuation">(</span><span class="token plain">os</span><span class="token punctuation">.</span><span class="token plain">getuid</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">current_user</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># pwd.struct_passwd(pw_name='jack', pw_passwd='********', pw_uid=501,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># pw_gid=20, pw_gecos='Jack Clayton', pw_dir='/Users/jack',</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># pw_shell='/bin/zsh')</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">current_user</span><span class="token punctuation">.</span><span class="token plain">pw_uid</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># 501</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">root </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> pwd</span><span class="token punctuation">.</span><span class="token plain">getpwnam</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"root"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">root</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># pwd.struct_passwd(pw_name='root', pw_passwd='*', pw_uid=0, pw_gid=0,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># pw_gecos='System Administrator', pw_dir='/var/root', pw_shell='/bin/zsh')</span><br></div></code></pre></div></div>
</li>
</ul>
</li>
<li class="">
<p>Other new traits and related features:</p>
<ul>
<li class="">
<p>Added the
<code>ExplicitlyCopyable</code> trait
to mark types that can be copied explicitly, but which might not be
implicitly copyable.</p>
<p>This supports work to transition the standard library collection types away
from implicit copyability, which can lead to unintended expensive copies.</p>
</li>
<li class="">
<p>Added the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/identifiable/Identifiable/"><code>Identifiable</code></a>
trait, used to describe types that implement the <code>__is__()</code> and
<code>__isnot__()</code> trait methods.
(<a href="https://github.com/modular/modular/pull/2807" target="_blank" rel="noopener noreferrer" class="">PR #2807</a>)</p>
</li>
<li class="">
<p>Types conforming to <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/Boolable/"><code>Boolable</code></a> (that
is, those implementing <code>__bool__()</code>) no longer implicitly convert to <code>Bool</code>.
A new <code>ImplicitlyBoolable</code>
trait is introduced for types where this behavior is desired.</p>
</li>
</ul>
</li>
<li class="">
<p>Miscellaneous:</p>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/none/NoneType/"><code>NoneType</code></a> is now a normal standard
library type, and not an alias for a raw MLIR type.</p>
<p>Function signatures written as <code>fn() -&gt; NoneType</code> should transition to
being written as <code>fn() -&gt; None</code>.</p>
</li>
<li class="">
<p>Mojo now has a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/#uint"><code>UInt</code></a> type for modeling
unsigned (scalar) integers with a platform-dependent width. <code>UInt</code>
implements most arithmetic operations that make sense for integers, with the
notable exception of <code>__neg__()</code>. Builtin functions such as <code>min()</code>/<code>max()</code>,
as well as <code>math</code> functions like <code>ceildiv()</code>, <code>align_down()</code>, and
<code>align_up()</code> are also implemented for <code>UInt</code>.</p>
</li>
<li class="">
<p>Now that we have a <code>UInt</code> type, use this to represent the return type of a
hash. In general, hashes should be an unsigned integer, and can also lead to
improved performance in certain cases.</p>
</li>
<li class="">
<p>Added the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/ffi/#aliases"><code>c_char</code></a> type alias in <code>sys.ffi</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/sort/sort/"><code>sort()</code></a> now supports a <code>stable</code>
parameter. It can be called by</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">sort</span><span class="token punctuation">[</span><span class="token plain">cmp_fn</span><span class="token punctuation">,</span><span class="token plain"> stable</span><span class="token operator" style="color:#a89984">=</span><span class="token boolean" style="color:#af2528">True</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">list</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>The algorithm requires $$O(N)$$ auxiliary memory. If extra memory allocation
fails, the program crashes.</p>
</li>
<li class="">
<p><code>sort()</code> no longer takes <code>LegacyPointer</code> since that type is now removed.</p>
</li>
<li class="">
<p>Added the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/format_int/oct/"><code>oct()</code></a> builtin function
for formatting an integer in octal.
(<a href="https://github.com/modular/modular/pull/2914" target="_blank" rel="noopener noreferrer" class="">PR #2914</a>)</p>
</li>
<li class="">
<p>Added the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/testing/assert_is/"><code>assert_is()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/testing/assert_is_not/"><code>assert_is_not()</code></a> test
functions to the <code>testing</code> module.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/constants/"><code>math</code></a> package now includes the <code>pi</code>,
<code>e</code>, and <code>tau</code> constants (Closes Issue
<a href="https://github.com/modular/modular/issues/2135" target="_blank" rel="noopener noreferrer" class="">#2135</a>).</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/ulp/"><code>ulp</code></a> function from <code>numerics</code> has been
moved to the <code>math</code> module.</p>
</li>
<li class="">
<p><code>bit</code> module now supports
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/bit/bit/bit_reverse/"><code>bit_reverse()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/bit/bit/byte_swap/"><code>byte_swap()</code></a>, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/bit/bit/pop_count/"><code>pop_count()</code></a> for the <code>Int</code> type.
(<a href="https://github.com/modular/modular/pull/3150" target="_blank" rel="noopener noreferrer" class="">PR #3150</a>)</p>
</li>
<li class="">
<p>A few <code>bit</code> functions have been renamed for clarity:</p>
<ul>
<li class="">
<p><code>countl_zero()</code> -&gt;
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/bit/bit/count_leading_zeros/"><code>count_leading_zeros()</code></a></p>
</li>
<li class="">
<p><code>countr_zero()</code> -&gt;
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/bit/bit/count_trailing_zeros/"><code>count_trailing_zeros()</code></a></p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/builtin_slice/Slice/"><code>Slice</code></a> now uses
<code>OptionalReg[Int]</code> for <code>start</code> and <code>end</code> and implements a constructor which
accepts optional values. <code>Slice._has_end()</code> has also been removed since a
Slice with no end is now represented by an empty <code>Slice.end</code> option.
(<a href="https://github.com/modular/modular/pull/2495" target="_blank" rel="noopener noreferrer" class="">PR #2495</a>)</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> s </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Slice</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">None</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">s</span><span class="token punctuation">.</span><span class="token plain">start</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># must retrieve the value from the optional</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>rank</code> argument for
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/algorithm/functional/elementwise/"><code>algorithm.elementwise()</code></a>
is no longer required and is only inferred.</p>
</li>
<li class="">
<p>The <code>time.now()</code> function has been deprecated. Please use
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/time/time/perf_counter/"><code>time.perf_counter()</code></a> or
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/time/time/perf_counter_ns/"><code>time.perf_counter_ns</code></a> instead.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> construction from <code>Bool</code> has been
restricted to <code>DType.bool</code> data type.</p>
</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.5/#tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/tools/testing/"><code>mojo test</code></a> new features and changes:</p>
<ul>
<li class="">
<p><code>mojo test</code> now uses the Mojo compiler for running unit tests. This will
resolve compilation issues that sometimes appeared, and will also improve
overall test times, since we will only compile unit tests once before
executing all of them.</p>
<p>These changes do not apply to doctests, due to their different semantics.</p>
</li>
<li class="">
<p>The <code>mojo test</code> command now accepts a <code>--filter</code> option that will narrow the
set of tests collected and executed. The filter string is a POSIX extended
regular expression.</p>
</li>
<li class="">
<p>The <code>mojo test</code> command now supports using the same compilation options as
<code>mojo build</code>.</p>
</li>
<li class="">
<p>You can now debug unit tests using <code>mojo test</code> by passing the <code>--debug</code>
flag. Most debug flags are supported; run <code>mojo test --help</code> for a full
listing.</p>
<p>Debugging doctests is not currently supported.</p>
</li>
</ul>
</li>
<li class="">
<p>Mojo debugger new features and changes:</p>
<ul>
<li class="">
<p>The <code>mojo debug --rpc</code> command has been renamed to <a class="" href="https://mojolang.static.modular-staging.com/docs/cli/debug/#debug-server-options"><code>mojo debug   --vscode</code></a>, which is now able to
manage multiple VS Code windows.</p>
</li>
<li class="">
<p>The Mojo debugger now supports a <code>break-on-raise</code> command that indicated the
debugger to stop at any <code>raise</code> statements. A similar features has been
added to the debugger on VS Code.</p>
</li>
<li class="">
<p>The Mojo debugger now hides the artificial function arguments <code>__result__</code>
and <code>__error__</code> created by the compiler for Mojo code.</p>
</li>
</ul>
</li>
<li class="">
<p>VS Code support changes:</p>
<ul>
<li class="">
<p>The VS Code extension now supports a vendored MAX SDK for VS Code, which is
automatically downloaded by the extension and it's used for all Mojo
features, including the Mojo Language Server, the Mojo debugger, the Mojo
formatter, and more.</p>
</li>
<li class="">
<p>A proxy has been added to the Mojo Language Server on VS Code that handles
crashes more gracefully.</p>
</li>
</ul>
</li>
<li class="">
<p>The Mojo Language Server no longer sets <code>.</code> as a commit character for
auto-completion.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.5/#-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p>Support for the legacy <code>fn __init__(...) -&gt; Self:</code> form has been removed from
the compiler, please switch to using <code>fn __init__(inout self, ...):</code> instead.</p>
</li>
<li class="">
<p>The builtin <code>tensor</code> module has been removed. Identical functionality is
available in <code>max.tensor</code>, but it is generally
recommended to use structs from the <code>buffer</code>
module when possible instead.</p>
</li>
<li class="">
<p>Removed <code>String.unsafe_uint8_ptr()</code>. <code>String.unsafe_ptr()</code> now returns the
same thing.</p>
</li>
<li class="">
<p>Removed <code>StringLiteral.unsafe_uint8_ptr()</code> and <code>StringLiteral.as_uint8_ptr()</code>.</p>
</li>
<li class="">
<p>Removed <code>SIMD.splat(value: Scalar[type])</code>. Use the constructor for <code>SIMD</code>
instead.</p>
</li>
<li class="">
<p>Removed the <code>SIMD.{add,mul,sub}_with_overflow()</code> methods.</p>
</li>
<li class="">
<p>Removed the <code>SIMD.min()</code> and <code>SIMD.max()</code> methods. Identical functionality is
available using the builtin <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/min/"><code>min()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/max/"><code>max()</code></a> functions.</p>
</li>
<li class="">
<p>Removed the Mojo Language Server warnings for unused function arguments.</p>
</li>
<li class="">
<p><code>Run Mojo File in Dedicated Terminal</code> action has been removed, and the
action <code>Run Mojo File</code> will always open a dedicated terminal for each mojo
file to guarantee a correct environment.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.5/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p>Fixed a crash in the Mojo Language Server when importing the current file.</p>
</li>
<li class="">
<p>Fixed crash when specifying variadic keyword arguments without a type
expression in <code>def</code> functions, e.g.:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">**</span><span class="token plain">kwargs</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># now works</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now prints <code>ref</code> arguments and results in generated documentation
correctly.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1734" target="_blank" rel="noopener noreferrer" class="">#1734</a> - Calling
<code>__copyinit__</code> on self causes crash.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3142" target="_blank" rel="noopener noreferrer" class="">#3142</a> - [QoI] Confusing
<code>__setitem__</code> method is failing with a "must be mutable" error.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/248" target="_blank" rel="noopener noreferrer" class="">#248</a> - [Feature] Enable
<code>__setitem__</code> to take variadic arguments</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3065" target="_blank" rel="noopener noreferrer" class="">#3065</a> - Fix incorrect
behavior of <code>SIMD.__int__</code> on unsigned types</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3045" target="_blank" rel="noopener noreferrer" class="">#3045</a> - Disable implicit
SIMD conversion routes through <code>Bool</code></p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3126" target="_blank" rel="noopener noreferrer" class="">#3126</a> - [BUG] List doesn't
work at compile time.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3237" target="_blank" rel="noopener noreferrer" class="">#3237</a> - [BUG] Difference
between <code>__getitem__</code> and <code>[.]</code> operator.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/3336" target="_blank" rel="noopener noreferrer" class="">#3336</a> - Fix outdated
references to <code>let</code> in REPL documentation.</p>
</li>
<li class="">
<p>The VS Code extension no longer caches the information of the selected
MAX SDK, which was causing issues upon changes in the SDK.</p>
</li>
<li class="">
<p>The Mojo debugger now stops showing spurious warnings when parsing closures.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.24.5/#special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h2>
<p>Special thanks to our community contributors:
<a href="https://github.com/jjvraw" target="_blank" rel="noopener noreferrer" class="">@jjvraw</a>,
<a href="https://github.com/artemiogr97" target="_blank" rel="noopener noreferrer" class="">@artemiogr97</a>,
<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>,
<a href="https://github.com/jayzhan211" target="_blank" rel="noopener noreferrer" class="">@jayzhan211</a>,
<a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>, <a href="https://github.com/mzaks" target="_blank" rel="noopener noreferrer" class="">@mzaks</a>,
<a href="https://github.com/msaelices" target="_blank" rel="noopener noreferrer" class="">@msaelices</a>,
<a href="https://github.com/rd4com" target="_blank" rel="noopener noreferrer" class="">@rd4com</a>, <a href="https://github.com/jiex-liu" target="_blank" rel="noopener noreferrer" class="">@jiex-liu</a>,
<a href="https://github.com/kszucs" target="_blank" rel="noopener noreferrer" class="">@kszucs</a>,
<a href="https://github.com/thatstoasty" target="_blank" rel="noopener noreferrer" class="">@thatstoasty</a></p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v24.4]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.24.4/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.24.4/"/>
        <updated>2024-06-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.24.4/#-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<p>Big themes for this release:</p>
<ul>
<li class="">
<p>Improvements to the performance and ease-of-use for <code>def</code> functions.</p>
</li>
<li class="">
<p>Continued unification of standard library APIs around the <code>UnsafePointer</code>
type.</p>
</li>
<li class="">
<p>Many quality-of-life improvements for the standard library collection types.</p>
</li>
<li class="">
<p>Significant performance improvements when inserting into a <code>Dict</code>. Performance
on this metric is still not where we'd like it to be, but it is much improved.</p>
</li>
<li class="">
<p>A new <code>@parameter for</code> mechanism for expressing compile-time loops, which
replaces the earlier (and less reliable) <code>@unroll</code> decorator.</p>
</li>
<li class="">
<p>New Mojo Manual pages on <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/control-flow/">Control flow</a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/tools/testing/">Testing</a> and using
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/pointers/unsafe-pointers/">unsafe pointers</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.4/#language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Mojo has changed how <code>def</code> function arguments are processed. Previously, by
default, arguments to a <code>def</code> were treated according to the <code>owned</code>
convention, which makes a copy of the value, enabling that value to be mutable
in the callee.</p>
<p>This could lead to major performance issues because of the proliferation of
unnecessary copies. It also required you to declare non-copyable types as
<code>borrowed</code> explicitly. Now Mojo takes a different approach: <code>def</code> functions
take arguments as <code>borrowed</code> by default (consistent with <code>fn</code> functions) but
will make a local copy of the value <strong>only if the argument is mutated</strong> in the
body of the function.</p>
<p>This improves consistency, performance, and ease of use.</p>
</li>
<li class="">
<p>Implicit variable definitions in a <code>def</code> function are more flexible: you can
now implicitly declare variables as the result of a tuple return, using
<code>a,b,c = foo()</code>. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">return_two</span><span class="token punctuation">(</span><span class="token plain">i</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">Int</span><span class="token punctuation">,</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> i</span><span class="token punctuation">,</span><span class="token plain"> i</span><span class="token operator" style="color:#a89984">+</span><span class="token number" style="color:#924f79">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">a</span><span class="token punctuation">,</span><span class="token plain"> b </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> return_two</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Implicit variable declarations can also now shadow global immutable symbols
(such as module names and built-ins) without getting a compiler error.
For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token builtin" style="color:#b4730e">slice</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo functions can return an auto-dereferenced reference to storage with a
new <code>ref</code> keyword in the result type specifier. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Pair</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> first</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> second</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">get_first_ref</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token special-vars">self</span><span class="token punctuation">]</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">first</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">show_mutation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> somePair </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Pair</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    somePair</span><span class="token punctuation">.</span><span class="token plain">get_first_ref</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><br></div></code></pre></div></div>
<p>This approach provides a general way to return an "automatically dereferenced"
reference of a given type. Notably, this eliminates the need for
<code>__refitem__()</code> to exist. <code>__refitem__()</code> has thus been removed and replaced
with <code>__getitem__()</code> that returns a reference.</p>
</li>
<li class="">
<p>Mojo added support for <em>infer-only parameters</em>. Infer-only parameters must
appear at the beginning of the parameter list and cannot be explicitly
specified by the user. They are declared to the left of a <code>//</code> marker, much
like positional-only parameters. This allows programmers to define functions
with dependent parameters to be called without the caller specifying all the
necessary parameters. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> parameter_simd</span><span class="token punctuation">[</span><span class="token plain">dt</span><span class="token punctuation">:</span><span class="token plain"> DType</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Scalar</span><span class="token punctuation">[</span><span class="token plain">dt</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">value</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">call_it</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    parameter_simd</span><span class="token punctuation">[</span><span class="token plain">Int32</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>In the above example, <code>Int32(42)</code> is passed directly into <code>value</code>, the first
parameter that isn't infer-only. <code>dt</code> is inferred from the parameter itself
to be <code>DType.int32</code>.</p>
<p>This also works with structs. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">ScalarContainer</span><span class="token punctuation">[</span><span class="token plain">dt</span><span class="token punctuation">:</span><span class="token plain"> DType</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">//</span><span class="token punctuation">,</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Scalar</span><span class="token punctuation">[</span><span class="token plain">dt</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> ScalarContainer</span><span class="token punctuation">[</span><span class="token plain">Int32</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># 'dt' is inferred as `DType.int32`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">pass</span><br></div></code></pre></div></div>
<p>This should make working with dependent parameters more ergonomic. See
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/parameters/#infer-only-parameters">Infer-only parameters</a> in the
Mojo Manual.</p>
</li>
<li class="">
<p>Mojo now allows functions overloaded on parameters to be resolved when forming
references to, but not calling, those functions. For example, the following
now works:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> overloaded_parameters</span><span class="token punctuation">[</span><span class="token plain">value</span><span class="token punctuation">:</span><span class="token plain"> Int32</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> overloaded_parameters</span><span class="token punctuation">[</span><span class="token plain">value</span><span class="token punctuation">:</span><span class="token plain"> Float32</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">form_reference</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">ref</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> overloaded_parameters</span><span class="token punctuation">[</span><span class="token plain">Int32</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># works!</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now supports adding a <code>@deprecated</code> decorator on structs, functions,
traits, aliases, and global variables. The decorator marks the attached
declaration as deprecated and causes a warning to be emitted when the
deprecated declaration is referenced in user code. The decorator requires a
deprecation message, specified as a string literal.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@deprecated</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Foo is deprecated, use Bar instead"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Foo</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">outdated_api</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> Foo</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># warning: Foo is deprecated, use Bar instead</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@deprecated</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"use another function!"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">techdebt</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># warning: use another function!</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo has introduced
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/decorators/parameter/#parametric-for-statement"><code>@parameter for</code></a>,
a new feature for compile-time programming. <code>@parameter for</code> defines a for
loop where the sequence and the induction values in the sequence must be
parameter values. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> parameter_for</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">max</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">max</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> i </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> </span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"found 10!"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Currently, <code>@parameter for</code> requires the sequence's <code>__iter__()</code> method to
return a <code>_StridedRangeIterator</code>, meaning the induction variables must be
<code>Int</code>. The intention is to lift these restrictions in the future.</p>
</li>
<li class="">
<p>The <code>is_mutable</code> parameter of <code>Reference</code> and <code>AnyLifetime</code> is now a <code>Bool</code>,
not a low-level <code>__mlir_type.i1</code> value.</p>
<p>This improves the ergonomics of spelling out a
<code>Reference</code> type explicitly.</p>
</li>
<li class="">
<p>Mojo will now link to a Python dynamic library based on the Python on top of
your search path: <code>PATH</code>. This enables you to activate a virtual environment
like <code>conda</code> and have access to Python modules installed in that environment
without setting <code>MOJO_PYTHON_LIBRARY</code>. Previously Mojo would find a
<code>libpython</code> dynamic library on installation and put the path in
<code>.modular/modular.cfg</code>, which could result in version conflicts if you
activated a virtual environment of a different Python version.</p>
</li>
<li class="">
<p><code>AnyRegType</code> has been renamed to <code>__TypeOfAllTypes</code> and Mojo now forbids
binding non-trivial register-passable types to <code>__TypeOfAllTypes</code>. This
closes a major safety hole in the language. Please use <code>AnyType</code> for generic
code going forward.</p>
</li>
<li class="">
<p>The <code>let</code> keyword has been completely removed from the language. We previously
removed <code>let</code> declarations but still provided an error message to users. Now,
it is completely gone from the grammar.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.4/#standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>New traits and related features:</p>
<ul>
<li class="">
<p>Added built-in <a class="" href="https://mojolang.static.modular-staging.com/docs/std/format/repr/repr/"><code>repr()</code></a> function and
<code>Representable</code> trait.
(<a href="https://github.com/modular/modular/pull/2361" target="_blank" rel="noopener noreferrer" class="">PR #2361</a>)</p>
</li>
<li class="">
<p>Added the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Indexer/"><code>Indexer</code></a> trait to denote
types that implement the <code>__index__()</code> method which allows these types to be
accepted in common <code>__getitem__()</code> and <code>__setitem__()</code> implementations, as
well as allow a new built-in
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/index-function/"><code>index()</code></a>
function to be called on them. Most standard library containers can now be
indexed by any type that implements <code>Indexer</code>. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">AlwaysZero</span><span class="token punctuation">(</span><span class="token plain">Indexer</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__index__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">MyList</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> data</span><span class="token punctuation">:</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">data </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> __getitem__</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Indexer</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> idx</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">data</span><span class="token punctuation">[</span><span class="token plain">index</span><span class="token punctuation">(</span><span class="token plain">idx</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">MyList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token plain">AlwaysZero</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints `1`</span><br></div></code></pre></div></div>
<p>Types conforming to the <code>Indexer</code> trait are implicitly convertible to Int.
This means you can write generic APIs that take <code>Int</code> instead of making them
take a generic type that conforms to <code>Indexer</code>. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">AlwaysZero</span><span class="token punctuation">(</span><span class="token plain">Indexer</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__index__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Incrementer</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__getitem__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> idx</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> idx </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Incrementer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">[</span><span class="token plain">AlwaysZero</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># works and prints 1</span><br></div></code></pre></div></div>
<p>(<a href="https://github.com/modular/modular/pull/2685" target="_blank" rel="noopener noreferrer" class="">PR #2685</a>)</p>
</li>
<li class="">
<p>Added traits allowing user-defined types to be supported by various built-in
and math functions.</p>













































<table><thead><tr><th>Function</th><th>Trait</th><th>Required method</th></tr></thead><tbody><tr><td><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/abs/"><code>abs()</code></a></td><td><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/Absable/"><code>Absable</code></a></td><td><code>__abs__()</code></td></tr><tr><td><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/pow/"><code>pow()</code></a></td><td><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/Powable/"><code>Powable</code></a></td><td><code>__pow__()</code></td></tr><tr><td><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/round/"><code>round()</code></a></td><td><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/Roundable/"><code>Roundable</code></a></td><td><code>__round__()</code></td></tr><tr><td><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/ceil/"><code>math.ceil</code></a></td><td><code>math.Ceilable</code></td><td><code>__ceil__()</code></td></tr><tr><td><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/ceildiv/"><code>math.ceildiv</code></a></td><td><code>math.CeilDivable</code> <br> <code>math.CeilDivableRaising</code></td><td><code>__ceildiv__()</code></td></tr><tr><td><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/floor/"><code>math.floor</code></a></td><td><code>math.Floorable</code></td><td><code>__floor__()</code></td></tr><tr><td><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/trunc/"><code>math.trunc</code></a></td><td><code>Truncable</code></td><td><code>__trunc__()</code></td></tr></tbody></table>
<p>Notes:</p>
<ul>
<li class="">
<p>Conforming to the <code>Powable</code> trait also means that the type can be used
with the power operator (<code>**</code>).</p>
</li>
<li class="">
<p>For <code>ceildiv()</code>, structs can conform to either the <code>CeilDivable</code> trait
or <code>CeilDivableRaising</code> trait.</p>
</li>
<li class="">
<p>Due to ongoing refactoring, the traits <code>Ceilable</code>, <code>CeilDivable</code>,
<code>Floorable</code>, and <code>Truncable</code> do not appear in the API reference. They
should be imported from the <code>math</code> module, except for <code>Truncable</code> which
is (temporarily) available as a built-in trait and does not need to be
imported.</p>
</li>
</ul>
<p>Example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> math </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> sqrt</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Complex2</span><span class="token punctuation">(</span><span class="token plain">Absable</span><span class="token punctuation">,</span><span class="token plain"> Roundable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> re</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> im</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__abs__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Self</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> Self</span><span class="token punctuation">(</span><span class="token plain">sqrt</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">re </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">re </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">im </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">im</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0.0</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__round__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Self</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> Self</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">round</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">re</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">round</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">im</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__round__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> ndigits</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Self</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> Self</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">round</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">re</span><span class="token punctuation">,</span><span class="token plain"> ndigits</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">round</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">im</span><span class="token punctuation">,</span><span class="token plain"> ndigits</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
</li>
</ul>
</li>
<li class="">
<p>Benchmarking:</p>
<ul>
<li class="">The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/benchmark/bencher/"><code>bencher</code></a> module as part of the
<code>benchmark</code> package is now public and documented. This module provides
types such as <code>Bencher</code> which provides the ability to execute a <code>Benchmark</code>
and allows for benchmarking configuration via the <code>BenchmarkConfig</code> struct.</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/"><code>String</code></a> and friends:</p>
<ul>
<li class="">
<p><strong>Breaking.</strong> Implicit conversion to <code>String</code> is now removed for builtin
classes/types. Use <code>str()</code> explicitly to convert to <code>String</code>.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#isspace"><code>String.isspace()</code></a>
method conformant with Python's universal separators. This replaces the
<code>isspace()</code> free function from the <code>string</code> module. (If you need the old
function, it is temporarily available as <code>_isspace()</code>. It now takes a
<code>UInt8</code> but is otherwise unchanged.)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#split"><code>String.split()</code></a> now
defaults to whitespace and has Pythonic behavior in that it removes all
adjacent whitespace by default.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#strip"><code>String.strip()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#lstrip"><code>lstrip()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#rstrip"><code>rstrip()</code></a> can now
remove custom characters other than whitespace. In addition, there are now
several useful aliases for whitespace, ASCII lower/uppercase, and so on.
(<a href="https://github.com/modular/modular/pull/2555" target="_blank" rel="noopener noreferrer" class="">PR #2555</a>)</p>
</li>
<li class="">
<p><code>String</code> now has a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#splitlines"><code>splitlines()</code></a>
method, which allows splitting strings at line boundaries. This method
supports <a href="https://docs.python.org/3/glossary.html#term-universal-newlines" target="_blank" rel="noopener noreferrer" class="">universal
newlines</a>
and provides an option to retain or remove the line break characters. (<a href="https://github.com/modular/modular/pull/2810" target="_blank" rel="noopener noreferrer" class="">PR
#2810</a>)</p>
</li>
<li class="">
<p><code>InlinedString</code> has been renamed to
<code>InlineString</code>
to be consistent with other types.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringRef</code></a> now
implements
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#strip"><code>strip()</code></a>,
which can be used to remove leading and trailing whitespace. (<a href="https://github.com/modular/modular/pull/2683" target="_blank" rel="noopener noreferrer" class="">PR
#2683</a>)</p>
</li>
<li class="">
<p><code>StringRef</code> now implements
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#startswith"><code>startswith()</code></a>
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#endswith"><code>endswith()</code></a>.
(<a href="https://github.com/modular/modular/pull/2710" target="_blank" rel="noopener noreferrer" class="">PR #2710</a>)</p>
</li>
<li class="">
<p>Added a new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/"><code>StringSlice</code></a>
type, to replace uses of the unsafe <code>StringRef</code> type in standard library
code.</p>
<p><code>StringSlice</code> is a non-owning reference to encoded string data. Unlike
<code>StringRef</code>, a <code>StringSlice</code> is safely tied to the lifetime of the data it
points to.</p>
<ul>
<li class="">Added new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#as_string_slice"><code>as_string_slice()</code></a>
methods to <code>String</code> and <code>StringLiteral</code>.</li>
<li class="">Added <code>StringSlice</code> initializer from an <code>UnsafePointer</code> and a length in
bytes.</li>
</ul>
</li>
<li class="">
<p>Added a new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#as_bytes_slice"><code>as_bytes_slice()</code></a>
method to <code>String</code> and <code>StringLiteral</code>, which returns a <code>Span</code> of the bytes
owned by the string.</p>
</li>
<li class="">
<p>Continued transition to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> and
unsigned byte type for strings:</p>
<ul>
<li class="">Renamed <code>String._as_ptr()</code> to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#unsafe_ptr"><code>String.unsafe_ptr()</code></a>,
and changed return type to <code>UnsafePointer</code> (was <code>DTypePointer</code>).</li>
<li class="">Renamed <code>StringLiteral.data()</code> to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/#unsafe_ptr"><code>StringLiteral.unsafe_ptr()</code></a>,
and changed return type to <code>UnsafePointer</code> (was <code>DTypePointer</code>).</li>
<li class=""><code>InlineString.as_ptr()</code> has been renamed to
<code>unsafe_ptr()</code>
and now returns an <code>UnsafePointer[UInt8]</code> (was
<code>DTypePointer[DType.int8]</code>).</li>
<li class=""><code>StringRef.data</code> is now an <code>UnsafePointer</code> (was <code>DTypePointer</code>) and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#unsafe_ptr"><code>StringRef.unsafe_ptr()</code></a>
now returns an <code>UnsafePointer[UInt8]</code> (was <code>DTypePointer[DType.int8]</code>).</li>
</ul>
</li>
</ul>
</li>
<li class="">
<p>Other built-ins:</p>
<ul>
<li class="">
<p>The <code>Slice.__len__()</code> function has been removed and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/builtin_slice/Slice/"><code>Slice</code></a> no longer conforms
to the <code>Sized</code> trait. This clarifies the ambiguity of the semantics: the
length of a slice always depends on the length of the object being sliced.
Users that need the existing functionality can use the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/builtin_slice/Slice/#indices"><code>Slice.unsafe_indices()</code></a>
method. This makes it explicit that this implementation does not check if
the slice bounds are concrete or within any given object's length.</p>
</li>
<li class="">
<p>Added a built-in <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/sort/sort/"><code>sort()</code></a> function for
lists of elements that conform to the
<code>ComparableCollectionElement</code>
trait.(<a href="https://github.com/modular/modular/pull/2609" target="_blank" rel="noopener noreferrer" class="">PR #2609</a>)</p>
</li>
<li class="">
<p><code>int()</code> can now take a string and a
specified base to parse an integer from a
string: <code>int("ff", 16)</code> returns <code>255</code>. Additionally, if a base of zero is
specified, the string will be parsed as if it was an integer literal, with
the base determined by whether the string contains the prefix <code>"0x"</code>,
<code>"0o"</code>, or <code>"0b"</code>.
(<a href="https://github.com/modular/modular/pull/2273" target="_blank" rel="noopener noreferrer" class="">PR #2273</a>,
fixes <a href="https://github.com/modular/modular/issues/2274" target="_blank" rel="noopener noreferrer" class="">#2274</a>)</p>
</li>
<li class="">
<p>Added the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/format_int/bin/"><code>bin()</code></a> built-in function
to convert integral types into their binary
string representation.
(<a href="https://github.com/modular/modular/pull/2603" target="_blank" rel="noopener noreferrer" class="">PR #2603</a>)</p>
</li>
<li class="">
<p>Added the <code>atof()</code> built-in
function, which can convert a <code>String</code> to a <code>float64</code>. (<a href="https://github.com/modular/modular/pull/2649" target="_blank" rel="noopener noreferrer" class="">PR
#2649</a>)</p>
</li>
<li class="">
<p>You can now use the built-in <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/any/"><code>any()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/all/"><code>all()</code></a> functions to check for truthy
elements in a collection. Because <code>SIMD.__bool__()</code> is now constrained to
<code>size=1</code>, You must explicitly use these to get the truthy value of a SIMD
vector with more than one element. This avoids common bugs around implicit
conversion of <code>SIMD</code> to <code>Bool</code>.
(<a href="https://github.com/modular/modular/pull/2600" target="_blank" rel="noopener noreferrer" class="">PR #2600</a>)</p>
<p>For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">truthy_simd</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> vec </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int32</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">any</span><span class="token punctuation">(</span><span class="token plain">vec</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"any elements are truthy"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">all</span><span class="token punctuation">(</span><span class="token plain">vec</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"all elements are truthy"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>object</code> now implements all the bitwise
operators.
(<a href="https://github.com/modular/modular/pull/2324" target="_blank" rel="noopener noreferrer" class="">PR #2324</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/tuple/Tuple/"><code>Tuple</code></a> now supports <code>__contains__()</code>.
(<a href="https://github.com/modular/modular/pull/2709" target="_blank" rel="noopener noreferrer" class="">PR #2709</a>) For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Tuple</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">True</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"x contains 1"</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>ListLiteral</code> and <code>Tuple</code>
now only require that element types be <code>Movable</code>. Consequently,
<code>ListLiteral</code> and <code>Tuple</code> are themselves no longer <code>Copyable</code>.</p>
</li>
<li class="">
<p>Added new <code>ImmutableStaticLifetime</code> and <code>MutableStaticLifetime</code> helpers.</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> and
others:</p>
<ul>
<li class="">
<p>Added new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/memory/memcpy/"><code>memcpy()</code></a> overload for
<code>UnsafePointer[Scalar[_]]</code> pointers.</p>
</li>
<li class="">
<p>Removed the <code>get_null()</code> method from <code>UnsafePointer</code> and other pointer
types. Please use the default constructor instead: <code>UnsafePointer[T]()</code>.</p>
</li>
<li class="">
<p>Many functions returning a pointer type have been unified to have a public
API function of <code>unsafe_ptr()</code>.</p>
</li>
<li class="">
<p>The <code>Tensor.data()</code> method has been renamed to <code>unsafe_ptr()</code>. The return
type is still a <code>DTypePointer[T]</code>.</p>
</li>
</ul>
</li>
<li class="">
<p>Collections:</p>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a> now has an
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/#index"><code>index()</code></a> method that allows you
to find the (first) location of an element in a <code>List</code> of
<code>EqualityComparable</code> types. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> my_list </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">7</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">my_list</span><span class="token punctuation">.</span><span class="token plain">index</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints 1</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>List</code> can now be converted to a <code>String</code> with a simplified syntax:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> my_list </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">my_list</span><span class="token punctuation">.</span><span class="token plain">__str__</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints [2, 3]</span><br></div></code></pre></div></div>
<p>Note that <code>List</code> doesn't conform to the <code>Stringable</code> trait yet so you cannot
use <code>str(my_list)</code> yet.
(<a href="https://github.com/modular/modular/pull/2673" target="_blank" rel="noopener noreferrer" class="">PR #2673</a>)</p>
</li>
<li class="">
<p><code>List</code> has a simplified syntax to call the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/#count"><code>count()</code></a> method:
<code>my_list.count(x)</code>.
(<a href="https://github.com/modular/modular/pull/2675" target="_blank" rel="noopener noreferrer" class="">PR #2675</a>)</p>
</li>
<li class="">
<p><code>List()</code> now supports <code>__contains__()</code>, so you can now use lists with the
<code>in</code> operator:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> x </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> my_list</span><span class="token punctuation">:</span><br></div></code></pre></div></div>
<p>(<a href="https://github.com/modular/modular/pull/2667" target="_blank" rel="noopener noreferrer" class="">PR #2667</a>)</p>
</li>
<li class="">
<p><code>List</code> now has an
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/#unsafe_get"><code>unsafe_get()</code></a> to get the
reference to an element without bounds check or wraparound for negative
indices. Note that this method is unsafe. Use with caution.
<a href="https://github.com/modular/modular/pull/2800" target="_blank" rel="noopener noreferrer" class="">PR #2800</a></p>
</li>
<li class="">
<p>Added a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#fromkeys"><code>fromkeys()</code></a> method
to <code>Dict</code> to return a <code>Dict</code> with the specified keys and values.
(<a href="https://github.com/modular/modular/pull/2622" target="_blank" rel="noopener noreferrer" class="">PR 2622</a>)</p>
</li>
<li class="">
<p>Added a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#clear"><code>clear()</code></a> method to
<code>Dict</code>. (<a href="https://github.com/modular/modular/pull/2627" target="_blank" rel="noopener noreferrer" class="">PR 2627</a>)</p>
</li>
<li class="">
<p><code>Dict</code> now supports <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/reversed/reversed/"><code>reversed()</code></a>
for its <code>items()</code> and <code>values()</code> iterators.
(<a href="https://github.com/modular/modular/pull/2340" target="_blank" rel="noopener noreferrer" class="">PR #2340</a>)</p>
</li>
<li class="">
<p><code>Dict</code> now has a simplified conversion to <code>String</code> with <code>my_dict.__str__()</code>.
Note that <code>Dict</code> does not conform to the <code>Stringable</code> trait so
<code>str(my_dict)</code> is not possible yet.
(<a href="https://github.com/modular/modular/pull/2674" target="_blank" rel="noopener noreferrer" class="">PR #2674</a>)</p>
</li>
<li class="">
<p><code>Dict</code> now implements <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/#get"><code>get(key)</code></a>
and <code>get(key, default)</code> functions.
(<a href="https://github.com/modular/modular/pull/2519" target="_blank" rel="noopener noreferrer" class="">PR #2519</a>)</p>
</li>
<li class="">
<p>Added a temporary <code>__get_ref(key)</code> method to <code>Dict</code>, allowing you to get a
<code>Reference</code> to a dictionary value.</p>
</li>
<li class="">
<p>Added a new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlineList</code></a> type, a
stack-allocated list with a static maximum size. (<a href="https://github.com/modular/modular/pull/2587" target="_blank" rel="noopener noreferrer" class="">PR
2587#</a>)
(<a href="https://github.com/modular/modular/pull/2703" target="_blank" rel="noopener noreferrer" class="">PR #2703</a>)</p>
</li>
<li class="">
<p>Added a new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/span/Span/"><code>Span</code></a> type for taking slices
of contiguous collections. (<a href="https://github.com/modular/modular/pull/2595" target="_blank" rel="noopener noreferrer" class="">PR
#2595</a>)</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/"><code>os</code></a> module:</p>
<ul>
<li class="">
<p>The <code>os</code> module now provides functionality for adding and removing
directories using <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/mkdir/"><code>mkdir()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/rmdir/"><code>rmdir()</code></a>.
(<a href="https://github.com/modular/modular/pull/2430" target="_blank" rel="noopener noreferrer" class="">PR #2430</a>)</p>
</li>
<li class="">
<p>Added the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/path/path/getsize/"><code>os.path.getsize()</code></a> function,
which gives the size in bytes of the file identified by the path.
(<a href="https://github.com/modular/modular/pull/2626" target="_blank" rel="noopener noreferrer" class="">PR 2626</a>)</p>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/path/path/join/"><code>os.path.join()</code></a> function.
(<a href="https://github.com/modular/modular/pull/2792" target="_blank" rel="noopener noreferrer" class="">PR 2792</a>)</p>
</li>
<li class="">
<p>Added a new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/tempfile/tempfile/"><code>tempfile</code></a> module, with
<code>gettempdir()</code> and <code>mkdtemp()</code> functions.
(<a href="https://github.com/modular/modular/pull/2742" target="_blank" rel="noopener noreferrer" class="">PR 2742</a>)</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> type:</p>
<ul>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#shuffle"><code>SIMD.shuffle()</code></a> with
<code>IndexList</code> mask.
(<a href="https://github.com/modular/modular/pull/2315" target="_blank" rel="noopener noreferrer" class="">PR #2315</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#__bool__"><code>SIMD.__bool__()</code></a> is constrained
such that it only works when <code>size</code> is <code>1</code>. For SIMD vectors with more than
one element, use <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/any/"><code>any()</code></a> or
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/all/"><code>all()</code></a>.
(<a href="https://github.com/modular/modular/pull/2502" target="_blank" rel="noopener noreferrer" class="">PR #2502</a>)</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#reduce_or"><code>SIMD.reduce_or()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#reduce_and"><code>SIMD.reduce_and()</code></a> methods are
now bitwise operations, and support integer types.
(<a href="https://github.com/modular/modular/pull/2671" target="_blank" rel="noopener noreferrer" class="">PR #2671</a>)</p>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/#__repr__"><code>SIMD.__repr__()</code></a> to get
the verbose string representation of <code>SIMD</code> types.
(<a href="https://github.com/modular/modular/pull/2728" target="_blank" rel="noopener noreferrer" class="">PR #2728</a>)</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/"><code>math</code></a> package:</p>
<ul>
<li class="">
<p>The <code>math.bit</code> module has been moved to a new top-level
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/bit/bit/"><code>bit</code></a> module. The following functions in this
module have been renamed:</p>
<ul>
<li class=""><code>ctlz</code> -&gt; <code>countl_zero</code></li>
<li class=""><code>cttz</code> -&gt; <code>countr_zero</code></li>
<li class=""><code>bit_length</code> -&gt; <code>bit_width</code></li>
<li class=""><code>ctpop</code> -&gt; <code>pop_count</code></li>
<li class=""><code>bswap</code> -&gt; <code>byte_swap</code></li>
<li class=""><code>bitreverse</code> -&gt; <code>bit_reverse</code></li>
</ul>
</li>
<li class="">
<p>The <code>math.rotate_bits_left()</code> and <code>math.rotate_bits_right()</code> functions have
been moved to the <code>bit</code> module.</p>
</li>
<li class="">
<p>The <code>is_power_of_2()</code> function in the <code>math</code> module is now called
<code>is_power_of_two()</code> and located in the <code>bit</code> module.</p>
</li>
<li class="">
<p>The <code>abs()</code>, <code>round()</code>, <code>min()</code>, <code>max()</code>, <code>pow()</code>, and <code>divmod()</code> functions
have moved from <code>math</code> to <code>builtin</code>, so you no longer need to import these
functions.</p>
</li>
<li class="">
<p>The <code>math.tgamma()</code> function has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/gamma/"><code>math.gamma()</code></a> to conform with Python's
naming.</p>
</li>
<li class="">
<p>The implementation of the following functions have been moved from the
<code>math</code> module to the new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/numerics/"><code>utils.numerics</code></a>
module: <code>isfinite()</code>, <code>isinf()</code>, <code>isnan()</code>, <code>nan()</code>, <code>nextafter()</code>, and
<code>ulp()</code>. The functions continue to be exposed in the <code>math</code> module.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/gcd/"><code>math.gcd()</code></a> now works on negative inputs, and
like Python's implementation, accepts a variadic list of integers. New
overloads for a <code>List</code> or <code>Span</code>of integers are also added.
(<a href="https://github.com/modular/modular/pull/2777" target="_blank" rel="noopener noreferrer" class="">PR #2777</a>)</p>
</li>
</ul>
</li>
<li class="">
<p>Async and coroutines:</p>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/coroutine/Coroutine/"><code>Coroutine</code></a> now requires a
lifetime parameter. This parameter is set automatically by the parser when
calling an async function. It contains the lifetimes of all the arguments
and any lifetime accesses by the arguments. This ensures that argument
captures by async functions keep the arguments alive as long as the
coroutine is alive.</p>
</li>
<li class="">
<p>Async function calls are no longer allowed to borrow non-trivial
register-passable types. Because async functions capture their arguments but
register-passable types don't have lifetimes (yet), Mojo is not able to
correctly track the reference, making this unsafe. To cover this safety gap,
Mojo has temporarily disallowed binding non-trivial register-passable types
to borrowed arguments in async functions.</p>
</li>
</ul>
</li>
<li class="">
<p>Miscellaneous:</p>
<ul>
<li class="">
<p>Added an <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlineArray</code></a>
type that works on memory-only types. Compare with the existing
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/static_tuple/StaticTuple/"><code>StaticTuple</code></a> type, which is
conceptually an array type, but only works on <code>__TypeOfAllTypes</code>. (<a href="https://github.com/modular/modular/pull/2294" target="_blank" rel="noopener noreferrer" class="">PR
#2294</a>)</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/base64/"><code>base64</code></a> package now includes encoding and
decoding support for both the Base64 and Base16 encoding schemes.
(<a href="https://github.com/modular/modular/pull/2364" target="_blank" rel="noopener noreferrer" class="">PR #2364</a>)
(<a href="https://github.com/modular/modular/pull/2584" target="_blank" rel="noopener noreferrer" class="">PR #2584</a>)</p>
</li>
<li class="">
<p>The <code>take()</code> function in <a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/variant/Variant/"><code>Variant</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a> has been renamed to
<code>unsafe_take()</code>.</p>
</li>
<li class="">
<p>The <code>get()</code> function in <code>Variant</code> has been replaced by <code>__getitem__()</code>. That
is, <code>v.get[T]()</code> should be replaced with <code>v[T]</code>.</p>
</li>
<li class="">
<p>Various functions in the <code>algorithm</code> module are now built-in functions. This
includes <code>sort()</code>, <code>swap()</code>, and <code>partition()</code>. <code>swap()</code> and <code>partition()</code>
will likely shuffle around as we're reworking our built-in <code>sort()</code> function
and optimizing it.</p>
</li>
</ul>
</li>
<li class="">
<p><code>infinity</code> and <code>NaN</code> are now correctly handled in
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/testing/assert_almost_equal/"><code>testing.assert_almost_equal()</code></a>
and an <code>inf</code> function has been added to <code>utils/numerics.mojo</code>.
(<a href="https://github.com/modular/modular/pull/2375" target="_blank" rel="noopener noreferrer" class="">PR #2375</a>)</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.4/#tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Invoking <code>mojo package my-package -o my-dir</code> on the command line, where
<code>my-package</code> is a Mojo package source directory, and <code>my-dir</code> is an existing
directory, now outputs a Mojo package to <code>my-dir/my-package.mojopkg</code>.
Previously, this had to be spelled out, as in <code>-o my-dir/my-package.mojopkg</code>.</p>
</li>
<li class="">
<p>The Mojo Language Server now reports a warning when a local variable is
unused.</p>
</li>
<li class="">
<p>Several <code>mojo</code> subcommands now support a <code>--diagnostic-format</code> option that
changes the format with which errors, warnings, and other diagnostics are
printed. By specifying <code>--diagnostic-format json</code> on the command line, errors
and other diagnostics will be output in a structured
<a href="https://jsonlines.org/" target="_blank" rel="noopener noreferrer" class="">JSON Lines</a> format that is easier for machines to
parse.</p>
<p>The full list of subcommands that support <code>--diagnostic-format</code> is as follows:
<code>mojo build</code>, <code>mojo doc</code>, <code>mojo run</code>, <code>mojo package</code>, and <code>mojo test</code>.
Further, the <code>mojo test --json</code> option has been subsumed into this new option;
for the same behavior, run <code>mojo test --diagnostic-format json</code>.</p>
<p>Note that the format of the JSON output may change; we don't currently
guarantee its stability across releases of Mojo.</p>
</li>
<li class="">
<p>A new <code>--validate-doc-strings</code> option has been added to <code>mojo</code> to emit errors
on invalid doc strings instead of warnings.</p>
</li>
<li class="">
<p>The <code>--warn-missing-doc-strings</code> flag for <code>mojo</code> has been renamed to
<code>--diagnose-missing-doc-strings</code>.</p>
</li>
<li class="">
<p>A new decorator, <code>@doc_private</code>, was added that can be used to hide a
declaration from being generated in the output of <code>mojo doc</code>. It also removes
the requirement that the declaration has documentation (for example, when used
with <code>--diagnose-missing-doc-strings</code>).</p>
</li>
<li class="">
<p>Debugger users can now set breakpoints on function calls in O0 builds even if
the call has been inlined by the compiler.</p>
</li>
<li class="">
<p>The Mojo Language Server now supports renaming local variables.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-changes">Other changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.4/#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.4/#-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <code>@unroll</code> decorator has been deprecated and removed. The decorator was
supposed to guarantee that a decorated loop would be unrolled, or else the
compiler would error. In practice, this guarantee was eroded over time, as
a compiler-based approach cannot be as robust as the Mojo parameter system.
In addition, the <code>@unroll</code> decorator did not make the loop induction variables
parameter values, limiting its usefulness. Please see <code>@parameter for</code> for a
replacement!</p>
</li>
<li class="">
<p>The method <code>object.print()</code> has been removed. Since <code>object</code> now conforms to
the <code>Stringable</code> trait, you can use <code>print(my_object)</code> instead.</p>
</li>
<li class="">
<p>The following functions have been removed from the math module:</p>
<ul>
<li class=""><code>clamp()</code>; use the new <code>SIMD.clamp()</code> method instead.</li>
<li class=""><code>round_half_down()</code> and <code>round_half_up()</code>; these can be trivially
implemented using the <code>ceil()</code> and <code>floor()</code> functions.</li>
<li class=""><code>add()</code>, <code>sub()</code>, <code>mul()</code>, <code>div()</code>, <code>mod()</code>, <code>greater()</code>, <code>greater_equal()</code>,
<code>less()</code>, <code>less_equal()</code>, <code>equal()</code>, <code>not_equal()</code>, <code>logical_and()</code>,
<code>logical_xor()</code>, and <code>logical_not()</code>; Instead, users should rely directly on
the corresponding operators (<code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>, <code>%</code>, <code>&gt;</code>, <code>&gt;=</code>, <code>&lt;</code>, <code>&lt;=</code>,
<code>==</code>, <code>!=</code>, <code>&amp;</code>, <code>^</code>, and <code>~</code>).</li>
<li class=""><code>identity()</code> and <code>reciprocal()</code>; users can implement these trivially.</li>
<li class=""><code>select()</code>; removed in favor of using <code>SIMD.select()</code> directly.</li>
<li class=""><code>is_even()</code> and <code>is_odd()</code>; these can be trivially implemented using bitwise
<code>&amp;</code> with <code>1</code>.</li>
<li class=""><code>roundeven()</code>; the new <code>SIMD.roundeven()</code> method now provides the identical
functionality.</li>
<li class=""><code>div_ceil()</code>; use the new <code>ceildiv()</code> function.</li>
<li class=""><code>rotate_left()</code> and <code>rotate_right()</code>; the same functionality is available in
the builtin <code>SIMD.rotate_{left,right}()</code> methods for <code>SIMD</code> types, and the
<code>bit.rotate_bits_{left,right})()</code> methods for <code>Int</code>.</li>
<li class="">An overload of <code>math.pow()</code> taking an integer parameter exponent.</li>
<li class=""><code>align_down_residual()</code>; it can be trivially implemented using
<code>align_down()</code>.</li>
<li class=""><code>all_true()</code>, <code>any_true()</code>, and <code>none_true()</code>; use <code>SIMD.reduce_and()</code> and
<code>SIMD.reduce_or()</code> directly.</li>
<li class=""><code>reduce_bit_count()</code>; use the new <code>SIMD.reduce_bit_count()</code> directly.</li>
<li class=""><code>rint()</code> and <code>nearbyint()</code>; use <code>round()</code> or <code>SIMD.roundeven()</code> as
appropriate.</li>
</ul>
</li>
<li class="">
<p>The <code>EvaluationMethod</code> has been removed from <code>math.polynomial</code> and Estrin's
method is no longer available. This method was limited to degree 10 or less,
underutilized, and its performance unclear. In the future, this might be
reintroduced with an improved implementation if needed, when better
performance benchmarking infrastructure is available. The default behavior of
<code>math.polynomial.polynomial_evaluate()</code> is unchanged (Horner's method).</p>
</li>
<li class="">
<p>The <code>math.bit.select()</code> and <code>math.bit.bit_and()</code> functions have been removed.
The same functionality is available in the builtin <code>SIMD.select</code> and
<code>SIMD.__and__()</code> methods, respectively.</p>
</li>
<li class="">
<p>The <code>math.limit</code> module has been removed. The same functionality is available
as follows:</p>
<ul>
<li class=""><code>math.limit.inf()</code>: use <code>utils.numerics.max_or_inf()</code></li>
<li class=""><code>math.limit.neginf()</code>: use <code>utils.numerics.min_or_neg_inf()</code></li>
<li class=""><code>math.limit.max_finite()</code>: use <code>utils.numerics.max_finite()</code></li>
<li class=""><code>math.limit.min_finite()</code>: use <code>utils.numerics.min_finite()</code></li>
</ul>
</li>
<li class="">
<p>The <code>tensor.random</code> module has been removed. The same functionality is now
accessible via the <code>Tensor.rand()</code> and <code>Tensor.randn()</code> static methods.</p>
</li>
<li class="">
<p>The builtin <code>SIMD</code> struct no longer conforms to <code>Indexer</code>; users must
explicitly cast <code>Scalar</code> values using <code>int</code>.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.4/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://github.com/modular/modular/issues/1837" target="_blank" rel="noopener noreferrer" class="">#1837</a> Fix self-referential
variant crashing the compiler.</li>
<li class=""><a href="https://github.com/modular/modular/issues/2363" target="_blank" rel="noopener noreferrer" class="">#2363</a> Fix LSP crashing on
simple trait definitions.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1787" target="_blank" rel="noopener noreferrer" class="">#1787</a> Fix error when using
<code>//</code> on <code>FloatLiteral</code> in alias expression.</li>
<li class="">Made several improvements to dictionary performance. Dicts with integer keys
are most heavily affected, but large dicts and dicts with large values
will also see large improvements.</li>
<li class=""><a href="https://github.com/modular/modular/issues/2692" target="_blank" rel="noopener noreferrer" class="">#2692</a> Fix <code>assert_raises</code>
to include calling location.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="special-thanks">Special thanks<a href="https://mojolang.static.modular-staging.com/releases/v0.24.4/#special-thanks" class="hash-link" aria-label="Direct link to Special thanks" title="Direct link to Special thanks" translate="no">​</a></h2>
<p>Special thanks to our community contributors:</p>
<p><a href="https://github.com/rd4com" target="_blank" rel="noopener noreferrer" class="">@rd4com</a>,
@toiletsandpaper,
<a href="https://github.com/helehex" target="_blank" rel="noopener noreferrer" class="">@helehex</a>,
<a href="https://github.com/artemiogr97" target="_blank" rel="noopener noreferrer" class="">@artemiogr97</a>,
<a href="https://github.com/mikowals" target="_blank" rel="noopener noreferrer" class="">@mikowals</a>,
<a href="https://github.com/kernhanda" target="_blank" rel="noopener noreferrer" class="">@kernhanda</a>, <a href="https://github.com/lsh" target="_blank" rel="noopener noreferrer" class="">@lsh</a>,
@LJ-9801,
<a href="https://github.com/YichengDWu" target="_blank" rel="noopener noreferrer" class="">@YichengDWu</a>,
<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>,
<a href="https://github.com/fknfilewalker" target="_blank" rel="noopener noreferrer" class="">@fknfilewalker</a>,
<a href="https://github.com/jayzhan211" target="_blank" rel="noopener noreferrer" class="">@jayzhan211</a>,
<a href="https://github.com/martinvuyk" target="_blank" rel="noopener noreferrer" class="">@martinvuyk</a>,
<a href="https://github.com/ChristopherLR" target="_blank" rel="noopener noreferrer" class="">@ChristopherLR</a>,
<a href="https://github.com/mzaks" target="_blank" rel="noopener noreferrer" class="">@mzaks</a>, <a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>,
<a href="https://github.com/Brian-M-J" target="_blank" rel="noopener noreferrer" class="">@Brian-M-J</a>,
<a href="https://github.com/leandrolcampos" target="_blank" rel="noopener noreferrer" class="">@leandrolcampos</a></p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v24.3]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.24.3/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.24.3/"/>
        <updated>2024-05-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[✨ Highlights]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights">✨ Highlights<a href="https://mojolang.static.modular-staging.com/releases/v0.24.3/#-highlights" class="hash-link" aria-label="Direct link to ✨ Highlights" title="Direct link to ✨ Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p><code>AnyPointer</code> was renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>UnsafePointer</code></a> and is now
Mojo's preferred unsafe pointer type. It has several enhancements, including:</p>
<ul>
<li class="">
<p>The element type can now be any type: it doesn't require <code>Movable</code>.</p>
</li>
<li class="">
<p>Because of this, the <code>take_value()</code>, <code>emplace_value()</code>, and <code>move_into()</code>
methods have been changed to top-level functions and renamed. The new
functions are:</p>
<ul>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#init_pointee_copy"><code>initialize_pointee_copy</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#init_pointee_move"><code>initialize_pointee_move</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#take_pointee"><code>move_from_pointee()</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#move_pointee_into"><code>move_pointee</code></a></li>
</ul>
</li>
<li class="">
<p>A new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#destroy_pointee"><code>destroy_pointee()</code></a>
function runs the destructor on the pointee.</p>
</li>
<li class="">
<p><code>UnsafePointer</code> can be initialized directly from a <code>Reference</code> with
<code>UnsafePointer(someRef)</code> and can convert to a reference with
<code>yourPointer[]</code>. Both infer element type and address space. Note that when
you convert a pointer to a reference, there's no way for Mojo to track the
lifetime of the original value. So the resulting reference is no safer than
the original pointer.</p>
</li>
</ul>
</li>
<li class="">
<p>All of the pointer types received some cleanup to make them more consistent,
for example the <code>unsafe.bitcast()</code> global function is now a consistent
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#bitcast"><code>bitcast()</code></a> method
on the pointers, which can convert element type and address space.</p>
</li>
<li class="">
<p>Improvements to variadic arguments support.</p>
<ul>
<li class="">
<p>Heterogeneous variadic pack arguments now work reliably even with memory
types, and have a more convenient API to use, as defined by the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicPack/"><code>VariadicPack</code></a> type. For
example, a simplified version of <code>print</code> can be implemented like this:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Stringable</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">:</span><span class="token plain"> Stringable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">first</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">rest</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    print_string</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">(</span><span class="token plain">first</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> print_elt</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Stringable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        print_string</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">" "</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        print_string</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    rest</span><span class="token punctuation">.</span><span class="token plain">each</span><span class="token punctuation">[</span><span class="token plain">print_elt</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now supports declaring functions that have both optional and variadic
arguments, both positional and keyword-only. For example, this now works:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">variadic_arg_after_default</span><span class="token punctuation">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> d</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">**</span><span class="token plain">kwargs</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>Positional variadic parameters also work in the presence of optional
parameters. That is:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> variadic_param_after_default</span><span class="token punctuation">[</span><span class="token plain">e</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> f</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">params</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">pass</span><br></div></code></pre></div></div>
<p>Note that variadic keyword parameters are not supported yet.</p>
</li>
</ul>
<p>For more information, see
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/functions/#variadic-arguments">Variadic arguments</a> in the Mojo
Manual.</p>
</li>
<li class="">
<p>The <code>mojo build</code> and <code>mojo run</code> commands now support a <code>-g</code> option. This
shorter alias is equivalent to writing <code>--debug-level full</code>. This option is
also available in the <code>mojo debug</code> command, but is already the default.</p>
</li>
<li class="">
<p>Many new standard library APIs have been filled in, including many community
contributions. Changes are listed in the standard library section.</p>
</li>
<li class="">
<p>The Mojo Manual has a new page on <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/types/">Types</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.3/#language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>Certain dunder methods that take indices (<code>__getitem__()</code>, <code>__setitem__()</code>,
and <code>__refitem__()</code>) or names (<code>__getattr__()</code> and <code>__setattr__()</code>) can now
take the index or name as a parameter value instead of an argument value. This
is enabled when you define one of these methods with no argument other than
<code>self</code> (for a getter) or <code>self</code> and the set value (for a setter).</p>
<p>This enables types that can only be subscripted into with parameters, as well
as things like the following example, which passes the attribute name as a
parameter so that attribute names can be checked at compile time.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">RGB</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">   </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> __getattr__</span><span class="token punctuation">[</span><span class="token plain">name</span><span class="token punctuation">:</span><span class="token plain"> StringLiteral</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">       </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">       </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> name </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"r"</span><span class="token punctuation">:</span><span class="token plain">   </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">       </span><span class="token keyword" style="color:#af2528">elif</span><span class="token plain"> name </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"g"</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">       </span><span class="token keyword" style="color:#af2528">else</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">           constrained</span><span class="token punctuation">[</span><span class="token plain">name </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"b"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"can only access with r, g, or b members"</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">           </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> rgb </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> RGB</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">rgb</span><span class="token punctuation">.</span><span class="token plain">b</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Works</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">rgb</span><span class="token punctuation">.</span><span class="token plain">q</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Compile error</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now allows users to capture the source location of code and call location
of functions dynamically using the <code>__source_location()</code> and
<code>__call_location()</code> functions. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> builtin</span><span class="token punctuation">.</span><span class="token plain">_location </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> __call_location</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@always_inline</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">my_assert</span><span class="token punctuation">(</span><span class="token plain">cond</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">,</span><span class="token plain"> msg</span><span class="token punctuation">:</span><span class="token plain"> String</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">not</span><span class="token plain"> cond</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> call_loc </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> __call_location</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"In"</span><span class="token punctuation">,</span><span class="token plain"> call_loc</span><span class="token punctuation">.</span><span class="token plain">file_name</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"on line"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">(</span><span class="token plain">call_loc</span><span class="token punctuation">.</span><span class="token plain">line</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">":"</span><span class="token punctuation">,</span><span class="token plain"> msg</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    my_assert</span><span class="token punctuation">(</span><span class="token boolean" style="color:#af2528">False</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"always fails"</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># some_file.mojo, line 193</span><br></div></code></pre></div></div>
<p>This prints "<code>In /path/to/some_file.mojo on line 193: always fails</code>". Note
that <code>__call_location()</code> only works in <code>@always_inline</code> or
<code>@always_inline("nodebug")</code> functions. It gives incorrect results if placed in
an <code>@always_inline</code> function that's called <em>from</em> an
<code>@always_inline("nodebug")</code> function.</p>
<p>This feature is still evolving and for the time being you need to explicitly
import these APIs, as shown above. In the future, these will probably be
built-in functions and not require an import statement.</p>
<p>Neither <code>__source_location()</code> nor <code>__call_location()</code> work when called in a
parameter context. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> builtin</span><span class="token punctuation">.</span><span class="token plain">_location </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> __call_location</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@always_inline</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">mystery_location</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> loc </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> __call_location</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">(</span><span class="token plain">loc</span><span class="token punctuation">.</span><span class="token plain">file_name</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> doesnt_work </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> mystery_location</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># &lt;unknown location in parameter context&gt;</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.3/#standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-new">⭐️ New<a href="https://mojolang.static.modular-staging.com/releases/v0.24.3/#%EF%B8%8F-new" class="hash-link" aria-label="Direct link to ⭐️ New" title="Direct link to ⭐️ New" translate="no">​</a></h3>
<ul>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a> has several new methods:</p>
<ul>
<li class="">
<p><code>pop(index)</code> for removing an element at a particular index.
By default, <code>List.pop()</code> removes the last element in the list.
(@LJ-9801, fixes
<a href="https://github.com/modular/modular/issues/2017" target="_blank" rel="noopener noreferrer" class="">#2017</a>)</p>
</li>
<li class="">
<p><code>resize(new_size)</code> for resizing the list without the need to
specify an additional value.
(<a href="https://github.com/mikowals" target="_blank" rel="noopener noreferrer" class="">@mikowals</a>, fixes
<a href="https://github.com/modular/modular/issues/2133" target="_blank" rel="noopener noreferrer" class="">#2133</a>)</p>
</li>
<li class="">
<p><code>insert(index, value)</code> for inserting a value at a specified index
into the <code>List</code>. (<a href="https://github.com/whym1here" target="_blank" rel="noopener noreferrer" class="">@whym1here</a>, fixes
<a href="https://github.com/modular/modular/issues/2134" target="_blank" rel="noopener noreferrer" class="">#2134</a>)</p>
</li>
<li class="">
<p>A new constructor <code>List(ptr, size, capacity)</code> to avoid needing to
do a deep copy of an existing contiguous memory allocation when constructing
a new <code>List</code>. (<a href="https://github.com/StandinKP" target="_blank" rel="noopener noreferrer" class="">@StandinKP</a>, fixes
<a href="https://github.com/modular/modular/issues/2170" target="_blank" rel="noopener noreferrer" class="">#2170</a>)</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a> now has a <code>update()</code> method to
update keys/values from another <code>Dict</code>.
(<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a> now has named methods for set
operations:</p>
<ul>
<li class=""><code>difference()</code> mapping to <code>-</code></li>
<li class=""><code>difference_update()</code> mapping to <code>-=</code></li>
<li class=""><code>intersection_update()</code> mapping to <code>&amp;=</code></li>
<li class=""><code>update()</code> mapping to <code>|=</code></li>
</ul>
<p>(<a href="https://github.com/arvindavoudi" target="_blank" rel="noopener noreferrer" class="">@arvindavoudi</a>)</p>
</li>
<li class="">
<p><code>Dict</code>, <code>List</code>, and <code>Set</code> all conform to the <code>Boolable</code> trait. The collections
evaluate to <code>True</code> if they contain any elements, <code>False</code> otherwise:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">list_names</span><span class="token punctuation">(</span><span class="token plain">names</span><span class="token punctuation">:</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">String</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> names</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> name </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> names</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">name</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">else</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"No names to list."</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>(<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>)</p>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/reversed/reversed/"><code>reversed()</code></a> function for
creating reversed iterators. Several range types, <code>List</code>, and <code>Dict</code> now
support iterating in reverse.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> numbers </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> number </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">reversed</span><span class="token punctuation">(</span><span class="token plain">numbers</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">number</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>(<a href="https://github.com/helehex" target="_blank" rel="noopener noreferrer" class="">@helehex</a> and
<a href="https://github.com/jayzhan211" target="_blank" rel="noopener noreferrer" class="">@jayzhan211</a>, contributes towards
<a href="https://github.com/modular/modular/issues/2325" target="_blank" rel="noopener noreferrer" class="">#2325</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a> now implements
<code>__is__</code> and <code>__isnot__</code> methods so that you can compare an <code>Optional</code> with
<code>None</code>. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> opt </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Optional</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> opt </span><span class="token keyword" style="color:#af2528">is</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">not</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">None</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">opt</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>(<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/tuple/Tuple/"><code>Tuple</code></a> now works with memory-only element
types like <code>String</code> and allows you to directly index into it with a parameter
expression. This means you can now simply use <code>x = tup[1]</code> like Python
instead of <code>x = tup.get[1, Int]()</code>. You can also assign into tuple elements
now as well with <code>tup[1] = x</code>.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">tuple</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Green"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">9.3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> name </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">tuple</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> value </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">tuple</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
<p>Note that because the subscript must be a parameter expression, you can't
iterate through a <code>Tuple</code> using an ordinary <code>for</code> loop.</p>
</li>
<li class="">
<p>The <code>Reference</code> type has several
changes, including:</p>
<ul>
<li class="">
<p>It has moved to the <code>memory.reference</code> module instead of <code>memory.unsafe</code>.</p>
</li>
<li class="">
<p><code>Reference</code> now has an
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#bitcast"><code>unsafe_bitcast()</code></a>
method, similar to the pointer types.</p>
</li>
<li class="">
<p>Several unsafe methods were removed, including <code>offset()</code>,
<code>destroy_element_unsafe()</code> and <code>emplace_ref_unsafe()</code>. This is because
<code>Reference</code> is a safe type—use <code>UnsafePointer</code> to do unsafe operations.</p>
</li>
</ul>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/Bool/"><code>Bool</code></a> can now be implicitly converted from
any type conforming to the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/Boolable/"><code>Boolable</code></a>
trait. This means that you no longer need to write code like this:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">MyBoolable</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__bool__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Bool</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> takes_boolable</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Boolable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">cond</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">takes_boolable</span><span class="token punctuation">(</span><span class="token plain">MyBoolable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Instead, you can simply write:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">takes_bool</span><span class="token punctuation">(</span><span class="token plain">cond</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">takes_bool</span><span class="token punctuation">(</span><span class="token plain">MyBoolable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Note that calls to <code>takes_bool()</code> will perform the implicit conversion, so in
some cases is it still better to explicitly declare a type parameter, e.g.:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> takes_two_boolables</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Boolable</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token comment" style="color:#a89984"># Short circuit means `b.__bool__()` might not be evaluated.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> a</span><span class="token punctuation">.</span><span class="token plain">__bool__</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">and</span><span class="token plain"> b</span><span class="token punctuation">.</span><span class="token plain">__bool__</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> now conforms
to the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/#keyelement"><code>KeyElement</code></a> trait, meaning
that it can be used as key type for
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/Dict/"><code>Dict</code></a>. This allows you to easily build
and interact with Python dictionaries in Mojo:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    d </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> PythonObject</span><span class="token punctuation">(</span><span class="token plain">Dict</span><span class="token punctuation">[</span><span class="token plain">PythonObject</span><span class="token punctuation">,</span><span class="token plain"> PythonObject</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    d</span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"foo"</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">12</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    d</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">7</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"bar"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    d</span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"foo"</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"something else"</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">d</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints `{'foo': [1, 2, 'something else'], 7: 'bar'}`</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/io/file/FileHandle/#seek"><code>FileHandle.seek()</code></a> now has a
<code>whence</code> argument that defaults to <code>os.SEEK_SET</code> to seek from the beginning of
the file. You can now set to <code>os.SEEK_CUR</code> to offset by the current
<code>FileHandle</code> seek position:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> f </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">open</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"/tmp/example.txt"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Skip 32 bytes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">f</span><span class="token punctuation">.</span><span class="token plain">seek</span><span class="token punctuation">(</span><span class="token plain">os</span><span class="token punctuation">.</span><span class="token plain">SEEK_CUR</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">32</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Or <code>os.SEEK_END</code> to offset from the end of file:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Start from 32 bytes before the end of the file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">f</span><span class="token punctuation">.</span><span class="token plain">seek</span><span class="token punctuation">(</span><span class="token plain">os</span><span class="token punctuation">.</span><span class="token plain">SEEK_END</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token number" style="color:#924f79">32</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/io/file/FileHandle/#read"><code>FileHandle.read()</code></a> can now
read straight into a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>DTypePointer</code></a>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">file</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">open</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"/tmp/example.txt"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"r"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Allocate and load 8 elements</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> DTypePointer</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">float32</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">alloc</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">bytes</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">file</span><span class="token punctuation">.</span><span class="token keyword" style="color:#af2528">read</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"bytes read"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">bytes</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">.</span><span class="token plain">load</span><span class="token punctuation">[</span><span class="token plain">width</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>sys</code> module now contains an <code>exit()</code> function that would exit a Mojo
program with the specified error code.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> sys </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> exit</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">exit</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The constructors for <code>Tensor</code> have been changed to be more consistent. As a
result, constructors take the shape as the first argument (instead of the
second) when constructing a tensor with pointer data.</p>
<p>If you pass a single scalar value to the <code>Tensor</code> constructor, it now
broadcasts the value to all elements in the tensor. For example,
<code>Tensor[DType.float32](TensorShape(2,2), 0)</code> constructs a <code>2x2</code> tensor
initialized with all zeros. This provides an easy way to fill in the data of a
tensor.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/"><code>String</code></a> now has
<code>removeprefix()</code> and <code>removesuffix()</code> methods.
(<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>)</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/ord/"><code>ord</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/chr/"><code>chr</code></a> functions have been
improved to accept any Unicode character. (<a href="https://github.com/mzaks" target="_blank" rel="noopener noreferrer" class="">@mzaks</a>,
contributes towards <a href="https://github.com/modular/modular/issues/1616" target="_blank" rel="noopener noreferrer" class="">#1616</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/atol/"><code>atol()</code></a> now handles
whitespace. The <code>atol()</code>function is used internally by <code>String.__int__()</code>, so
<code>int(String( " 10 "))</code> now returns <code>10</code> instead of raising an error.
(<a href="https://github.com/artemiogr97" target="_blank" rel="noopener noreferrer" class="">@artemiogr97</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> now implements the <code>__rmod__()</code>
method. (<a href="https://github.com/bgreni" target="_blank" rel="noopener noreferrer" class="">@bgreni</a>, fixes
<a href="https://github.com/modular/modular/issues/1482" target="_blank" rel="noopener noreferrer" class="">#1482</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/bool-function/"><code>bool(None)</code></a> is now implemented.
(@zhoujingya)</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>DTypePointer</code></a> type
now implements <code>gather()</code> for gathering a <code>SIMD</code> vector from offsets of a
current pointer. Similarly, support for <code>scatter()</code> was added to scatter a
<code>SIMD</code> vector into offsets of the current pointer.
(<a href="https://github.com/leandrolcampos" target="_blank" rel="noopener noreferrer" class="">@leandrolcampos</a>)</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/len/len/"><code>len()</code></a> function now handles a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/range/range/"><code>range()</code></a> specified with a negative end
value, so that things like <code>len(range(-1))</code> work correctly.
(<a href="https://github.com/soraros" target="_blank" rel="noopener noreferrer" class="">@soraros</a>)</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/debug_assert/debug_assert/"><code>debug_assert()</code></a> now prints
its location (filename, line, and column where it was called) in its error
message. Similarly, the <code>assert</code> helpers in the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/testing/"><code>testing</code></a> module now include location
information in their messages.</p>
</li>
<li class="">
<p>The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/testing/assert_equal/"><code>testing.assert_equal[SIMD]()</code></a>
function now raises if any of the elements mismatch in the two <code>SIMD</code>
arguments being compared.
(<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>)</p>
</li>
<li class="">
<p>The
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/testing/assert_almost_equal/"><code>testing.assert_almost_equal()</code></a>
and <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/isclose/"><code>math.isclose()</code></a> functions now have an
<code>equal_nan</code> flag. When set to <code>True</code>, then NaNs are considered equal.</p>
</li>
<li class="">
<p>The <code>object</code> type now supports the
division, modulo, and left and right shift operators, including the in-place
and reverse variants.
(@LJ-9801, fixes
<a href="https://github.com/modular/modular/issues/2224" target="_blank" rel="noopener noreferrer" class="">#2224</a>)</p>
</li>
<li class="">
<p>Added checked arithmetic operations for <code>SIMD</code> integers.</p>
<p><code>SIMD</code> integer types (including the sized integer scalars like <code>Int64</code>) can
now perform checked additions, subtractions, and multiplications using the
following new methods:</p>
<ul>
<li class=""><code>add_with_overflow()</code></li>
<li class=""><code>sub_with_overflow()</code></li>
<li class=""><code>mul_with_overflow()</code></li>
</ul>
<p>Checked arithmetic allows the caller to determine if an operation exceeded
the numeric limits of the type. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> simd </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int8</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">7</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">11</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">13</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">17</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> product</span><span class="token punctuation">:</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int8</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> overflow</span><span class="token punctuation">:</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">bool</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">(</span><span class="token plain">product</span><span class="token punctuation">,</span><span class="token plain"> overflow</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> simd</span><span class="token punctuation">.</span><span class="token plain">mul_with_overflow</span><span class="token punctuation">(</span><span class="token plain">simd</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">product</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> overflow</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"&lt;overflow&gt;"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">else</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">          </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">product</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>(<a href="https://github.com/lsh" target="_blank" rel="noopener noreferrer" class="">@lsh</a>)</p>
</li>
<li class="">
<p>Added <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/remove/"><code>os.remove()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/unlink/"><code>os.unlink()</code></a> for deleting files.
(<a href="https://github.com/artemiogr97" target="_blank" rel="noopener noreferrer" class="">@artemiogr97</a>, fixes
<a href="https://github.com/modular/modular/issues/2306" target="_blank" rel="noopener noreferrer" class="">#2306</a>)</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-changed">🦋 Changed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.3/#-changed" class="hash-link" aria-label="Direct link to 🦋 Changed" title="Direct link to 🦋 Changed" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/algorithm/memory/parallel_memcpy/"><code>parallel_memcpy()</code></a>
function has moved from the <code>buffer</code> package to the <code>algorithm</code> package.
Please update your imports accordingly.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/#value"><code>Optional.value()</code></a> now
returns a reference instead of a copy of the contained value.</p>
<p>To perform a copy manually, dereference the result:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> result </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Optional</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">123</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> value </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> result</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
<p>(<a href="https://github.com/lsh" target="_blank" rel="noopener noreferrer" class="">@lsh</a>, fixes
<a href="https://github.com/modular/modular/issues/2179" target="_blank" rel="noopener noreferrer" class="">#2179</a>)</p>
</li>
<li class="">
<p>Per the accepted community proposal, <a href="https://github.com/modular/modular/blob/main/mojo/proposals/byte-as-uint8.md" target="_blank" rel="noopener noreferrer" class="">Standardize the representation of byte
sequence as a sequence of unsigned 8-bit
integers</a>,
began transition to using <code>UInt8</code> by changing the data pointer of <code>Error</code> to
<code>DTypePointer[DType.uint8]</code>.
(<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>, contributes
towards <a href="https://github.com/modular/modular/issues/2317" target="_blank" rel="noopener noreferrer" class="">#2317</a>)</p>
</li>
<li class="">
<p>Continued transition to <code>UnsafePointer</code> from the legacy <code>Pointer</code> type
in various standard library APIs and internals.
(<a href="https://github.com/gabrieldemarmiesse" target="_blank" rel="noopener noreferrer" class="">@gabrieldemarmiesse</a>)</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.3/#tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<ul>
<li class="">
<p>The behavior of <code>mojo build</code> when invoked without an output <code>-o</code> argument has
changed slightly: <code>mojo build ./test-dir/program.mojo</code> now outputs an
executable to the path <code>./program</code>, whereas before it would output to the path
<code>./test-dir/program</code>.</p>
</li>
<li class="">
<p>The <code>mojo package</code> command no longer supports the <code>-D</code> flag. All compilation
environment flags should be provided at the point of package use (e.g.
<code>mojo run</code> or <code>mojo build</code>).</p>
</li>
<li class="">
<p>The REPL no longer allows type level variable declarations to be
uninitialized, e.g. it will reject <code>var s: String</code>. This is because it does
not do proper lifetime tracking (yet!) across cells, and so such code would
lead to a crash. You can work around this by initializing to a dummy value
and overwriting later. This limitation only applies to top level variables,
variables in functions work as they always have.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-changes">Other changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.3/#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="low-level-language-changes">Low-level language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.3/#low-level-language-changes" class="hash-link" aria-label="Direct link to Low-level language changes" title="Direct link to Low-level language changes" translate="no">​</a></h3>
<ul>
<li class="">
<p>A low-level <code>__get_mvalue_as_litref(x)</code> builtin was added to give access to
the underlying memory representation as a <code>!lit.ref</code> value without checking
initialization status of the underlying value. This is useful in very
low-level logic but isn't designed for general usability and will likely
change in the future.</p>
</li>
<li class="">
<p>Properties can now be specified on inline MLIR ops:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">_ </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">__mlir_op</span><span class="token punctuation">.</span><span class="token plain">`kgen</span><span class="token punctuation">.</span><span class="token plain">source_loc`</span><span class="token punctuation">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    _type </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token builtin" style="color:#b4730e">__mlir_type</span><span class="token punctuation">.</span><span class="token plain">index</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">__mlir_type</span><span class="token punctuation">.</span><span class="token plain">index</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">__mlir_type</span><span class="token punctuation">.</span><span class="token plain">`!kgen</span><span class="token punctuation">.</span><span class="token plain">string`</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    _properties </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">__mlir_attr</span><span class="token punctuation">.</span><span class="token plain">`</span><span class="token punctuation">{</span><span class="token plain">inlineCount </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token plain"> </span><span class="token punctuation">:</span><span class="token plain"> i64</span><span class="token punctuation">}</span><span class="token plain">`</span><span class="token punctuation">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>As the example shows above, the protected <code>_properties</code> attribute can be
passed during op construction, with an MLIR <code>DictionaryAttr</code> value.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.3/#-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h3>
<ul>
<li class="">
<p>Support for "register only" variadic packs has been removed. Instead of
<code>AnyRegType</code>, please upgrade your code to <code>AnyType</code> in examples like this:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> your_function</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Types</span><span class="token punctuation">:</span><span class="token plain"> AnyRegType</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">Ts</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>This move gives you access to a nicer API and has the benefit of being memory
safe and correct for non-trivial types. If you need specific APIs on the
types, please use the correct trait instead of <code>AnyType</code>.</p>
</li>
<li class="">
<p><code>List.pop_back()</code> has been removed. Use <code>List.pop()</code> instead which defaults
to popping the last element in the list.</p>
</li>
<li class="">
<p><code>SIMD.to_int(value)</code> has been removed. Use <code>int(value)</code> instead.</p>
</li>
<li class="">
<p>The <code>__get_lvalue_as_address(x)</code> magic function has been removed. To get a
reference to a value use <code>Reference(x)</code> and if you need an unsafe pointer, you
can use <code>UnsafePointer.address_of(x)</code>.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.3/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h3>
<ul>
<li class="">
<p><a href="https://github.com/modular/modular/issues/516" target="_blank" rel="noopener noreferrer" class="">#516</a> and
<a href="https://github.com/modular/modular/issues/1817" target="_blank" rel="noopener noreferrer" class="">#1817</a> and many others, e.g.
"Can't create a function that returns two strings."</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1178" target="_blank" rel="noopener noreferrer" class="">#1178</a> (os/kern) failure (5).</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1609" target="_blank" rel="noopener noreferrer" class="">#1609</a> alias with
<code>DynamicVector[Tuple[Int]]</code> fails.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1987" target="_blank" rel="noopener noreferrer" class="">#1987</a> Defining <code>main</code>
in a Mojo package is an error, for now. This is not intended to work yet,
erroring for now will help to prevent accidental undefined behavior.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1215" target="_blank" rel="noopener noreferrer" class="">#1215</a> and
<a href="https://github.com/modular/modular/issues/1949" target="_blank" rel="noopener noreferrer" class="">#1949</a> The Mojo LSP server no
longer cuts off hover previews for functions with functional arguments,
parameters, or results.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1901" target="_blank" rel="noopener noreferrer" class="">#1901</a> Fixed Mojo LSP and
documentation generation handling of inout arguments.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1913" target="_blank" rel="noopener noreferrer" class="">#1913</a> - <code>0__</code> no longer
crashes the Mojo parser.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1924" target="_blank" rel="noopener noreferrer" class="">#1924</a> JIT debugging on Mac
has been fixed.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1941" target="_blank" rel="noopener noreferrer" class="">#1941</a> Mojo variadic
arguments don't work with non-trivial register-only types.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1963" target="_blank" rel="noopener noreferrer" class="">#1963</a> <code>a!=0</code> is now parsed
and formatted correctly by <code>mojo format</code>.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1676" target="_blank" rel="noopener noreferrer" class="">#1676</a> Fix a crash related to
<code>@value</code> decorator and structs with empty body.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1917" target="_blank" rel="noopener noreferrer" class="">#1917</a> Fix a crash after
syntax error during tuple creation.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/2006" target="_blank" rel="noopener noreferrer" class="">#2006</a> The Mojo LSP now
properly supports signature types with named arguments and parameters.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/2007" target="_blank" rel="noopener noreferrer" class="">#2007</a> and
<a href="https://github.com/modular/modular/issues/1997" target="_blank" rel="noopener noreferrer" class="">#1997</a> The Mojo LSP no longer
crashes on certain types of closures.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1675" target="_blank" rel="noopener noreferrer" class="">#1675</a> Ensure <code>@value</code>
decorator fails gracefully after duplicate field error.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/2068" target="_blank" rel="noopener noreferrer" class="">#2068</a>
Fix <code>SIMD.reduce()</code> for size_out == 2.
(<a href="https://github.com/soraros" target="_blank" rel="noopener noreferrer" class="">@soraros</a>)</p>
</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v24.2]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.24.2/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.24.2/"/>
        <updated>2024-03-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[🔥 Legendary]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-legendary">🔥 Legendary<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#-legendary" class="hash-link" aria-label="Direct link to 🔥 Legendary" title="Direct link to 🔥 Legendary" translate="no">​</a></h2>
<ul>
<li class="">
<p>The Mojo standard library is now open source! Check out the
<a href="https://github.com/modular/modular/blob/main/mojo/stdlib/README.md" target="_blank" rel="noopener noreferrer" class="">README</a>
for everything you need to get started.</p>
</li>
<li class="">
<p>Structs and other nominal types are now allowed to implicitly conform to
traits. A struct implicitly conforms to a trait if it implements all the
requirements for the trait. For example, any struct that implements the
<code>__str__()</code> method implicitly conforms to <code>Stringable</code>, and is usable with
the <code>str()</code> built-in function.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Foo</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__str__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"foo!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">(</span><span class="token plain">Foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># prints 'foo!'</span><br></div></code></pre></div></div>
<p>We still strongly encourage you to explicitly list the traits a struct
conforms to when possible:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Foo</span><span class="token punctuation">(</span><span class="token plain">Stringable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>Not only is this useful for documentation and for communicating intentions,
but in the future, explicit conformance will be useful for features like
default methods and extensions.</p>
</li>
<li class="">
<p>Mojo's Python interoperability now supports passing keyword arguments to
Python functions:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> python </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Python</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    plt </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Python</span><span class="token punctuation">.</span><span class="token plain">import_module</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"matplotlib.pyplot"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    plt</span><span class="token punctuation">.</span><span class="token plain">plot</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">15</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> color</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"red"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    plt</span><span class="token punctuation">.</span><span class="token plain">show</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="language-changes">Language changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#language-changes" class="hash-link" aria-label="Direct link to Language changes" title="Direct link to Language changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-new">⭐️ New<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#%EF%B8%8F-new" class="hash-link" aria-label="Direct link to ⭐️ New" title="Direct link to ⭐️ New" translate="no">​</a></h3>
<ul>
<li class="">
<p>Mojo now has support for variadic keyword arguments, often referred to as
<code>**kwargs</code>. This means you can now declare and call functions like this:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">print_nicely</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">**</span><span class="token plain">kwargs</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token plain"> raises</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> key </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> kwargs</span><span class="token punctuation">.</span><span class="token plain">keys</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">      </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">key</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"="</span><span class="token punctuation">,</span><span class="token plain"> kwargs</span><span class="token punctuation">[</span><span class="token plain">key</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"> </span><span class="token comment" style="color:#a89984"># prints:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"> </span><span class="token comment" style="color:#a89984"># `a = 7`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"> </span><span class="token comment" style="color:#a89984"># `y = 8`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">print_nicely</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">7</span><span class="token punctuation">,</span><span class="token plain"> y</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>For more details (and a list of current limitations), see <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/functions/#variadic-keyword-arguments">Variadic keyword
arguments</a> in the Mojo
manual.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-changed-or-removed">🦋 Changed or removed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#-changed-or-removed" class="hash-link" aria-label="Direct link to 🦋 Changed or removed" title="Direct link to 🦋 Changed or removed" translate="no">​</a></h3>
<ul>
<li class="">
<p><code>let</code> declarations now produce a compile time error instead of a warning, our
next step in
<a href="https://github.com/modular/modular/blob/main/mojo/proposals/remove-let-decls.md" target="_blank" rel="noopener noreferrer" class="">removing let declarations</a>.
The compiler still recognizes the <code>let</code> keyword for now in order to produce a
good error message, but that will be removed in subsequent releases.</p>
</li>
<li class="">
<p>Mojo now warns about unused values in both <code>def</code> and <code>fn</code> declarations,
instead of completely disabling the warning in <code>def</code>s. It never warns about
unused <code>object</code> or <code>PythonObject</code> values, tying the warning to these types
instead of the kind of function they are unused in. This will help catch API
usage bugs in <code>def</code>s and make imported Python APIs more ergonomic in <code>fn</code>s.</p>
</li>
<li class="">
<p>For the time being, dynamic type values will be disabled in the language. For
example, the following will now fail with an error:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> t </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Int  </span><span class="token comment" style="color:#a89984"># dynamic type values not allowed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">SomeType</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">takes_type</span><span class="token punctuation">(</span><span class="token plain">SomeType</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># dynamic type values not allowed</span><br></div></code></pre></div></div>
<p>We want to take a step back and (re)design type valued variables,
existentials, and other dynamic features. This does not affect type valued
<strong>parameters</strong>, so the following works as before:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> t </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Int  </span><span class="token comment" style="color:#a89984"># still 🔥</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">SomeType</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">takes_type</span><span class="token punctuation">[</span><span class="token plain">SomeType</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># already 🔥</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token operator" style="color:#a89984">&gt;</span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> uses_trait</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> SomeTrait</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">value</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># still 🔥</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>*_</code> expression in parameter expressions is now required to occur at the
end of a positional parameter list, instead of being allowed in the middle.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># No longer supported</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> FirstUnbound </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> MidUnbound   </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">7</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Still supported</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> LastUnbound  </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">_</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
<p>We narrowed this because we want to encourage type designers
to get the order of parameters right, and want to extend <code>*_</code> to support
keyword parameters as well in the future.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="standard-library-changes">Standard library changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#standard-library-changes" class="hash-link" aria-label="Direct link to Standard library changes" title="Direct link to Standard library changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-new-1">⭐️ New<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#%EF%B8%8F-new-1" class="hash-link" aria-label="Direct link to ⭐️ New" title="Direct link to ⭐️ New" translate="no">​</a></h3>
<ul>
<li class="">
<p><code>DynamicVector</code> has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>List</code></a>, and has moved from the
<code>collections.vector</code> module to the <code>collections.list</code> module. In addition:</p>
<ul>
<li class="">
<p>You can now construct a <code>List</code> from a variadic number of values. For
example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> numbers </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> List</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>List</code> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlinedFixedVector</code></a>
types now support negative indexing. This means that you can write <code>vec[-1]</code>
which is equivalent to <code>vec[len(vec)-1]</code>.</p>
</li>
<li class="">
<p><code>List.push_back()</code> has been removed. Please use the <code>append()</code> function
instead.</p>
</li>
</ul>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/io/io/print/"><code>print()</code></a> function now takes <code>sep</code> and
<code>end</code> keyword arguments. This means that you can write:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Hello"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"Mojo"</span><span class="token punctuation">,</span><span class="token plain"> sep</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">", "</span><span class="token punctuation">,</span><span class="token plain"> end</span><span class="token operator" style="color:#a89984">=</span><span class="token string" style="color:#477a5b">"!!!\n"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># prints Hello, Mojo!!!</span><br></div></code></pre></div></div>
<p><code>sep</code> defaults to the empty string and <code>end</code> defaults to "\n".</p>
<p>Also, the <code>print_no_newline()</code> function has been removed. Please use
<code>print(end="")</code> instead.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/float_literal/FloatLiteral/"><code>FloatLiteral</code></a> type is
now an infinite-precision nonmaterializable type. This means you can do
compile-time calculations using <code>FloatLiteral</code> without rounding errors. When
materialized at runtime, a <code>FloatLiteral</code> value is converted to a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/"><code>Float64</code></a>.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># third is an infinite-precision FloatLiteral value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> third </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1.0</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">/</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3.0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># t is a Float64</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> t </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> third</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>String types all conform to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/IntableRaising/"><code>IntableRaising</code></a> trait. This means
that you can now call <code>int("123")</code> to get the integer <code>123</code>. If the integer
cannot be parsed from the string, then an error is raised.</p>
</li>
<li class="">
<p>The <code>Tensor</code> type now has <code>argmax()</code> and <code>argmin()</code> functions to compute the
position of the max or min value. Note: this should return a <code>Tensor[Int]</code> but
currently the output tensor is the same type as the input tensor. This will be
fixed in a future release.</p>
</li>
<li class="">
<p>Added a new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/OptionalReg/"><code>collections.OptionalReg</code></a>
type, a register-passable alternative to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/optional/Optional/"><code>Optional</code></a>.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/math/math/ulp/"><code>ulp()</code></a> function has been added to the
<code>math</code> module. This allows you to get the units of least precision (or units
of last place) of a floating point value.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-changed">🦋 Changed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#-changed" class="hash-link" aria-label="Direct link to 🦋 Changed" title="Direct link to 🦋 Changed" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <code>simd_load()</code>, <code>simd_store()</code>, <code>aligned_simd_load()</code>, and
<code>aligned_simd_store()</code> methods on
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>DTypePointer</code></a>,
<code>Buffer</code>, and <code>NDBuffer</code> have been merged into
a more expressive set of <code>load()</code> and <code>store()</code> methods with keyword-only
<code>width</code> and <code>alignment</code> parameters:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Doesn't work</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">my_simd </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> my_buffer</span><span class="token punctuation">.</span><span class="token plain">simd_load</span><span class="token punctuation">[</span><span class="token plain">simd_width</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">index</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Works</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">my_simd </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> my_buffer</span><span class="token punctuation">.</span><span class="token plain">load</span><span class="token punctuation">[</span><span class="token plain">width</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">simd_width</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">index</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Doesn't work</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">my_buffer</span><span class="token punctuation">.</span><span class="token plain">aligned_simd_store</span><span class="token punctuation">[</span><span class="token plain">width</span><span class="token punctuation">,</span><span class="token plain"> alignment</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">my_simd</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Works</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">my_buffer</span><span class="token punctuation">.</span><span class="token plain">store</span><span class="token punctuation">[</span><span class="token plain">width</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">width</span><span class="token punctuation">,</span><span class="token plain"> alignment</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">alignment</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">my_simd</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The
<code>EqualityComparable</code>
trait now requires the <code>__ne__()</code> method for conformance in addition to the
previously required <code>__eq__()</code> method.</p>
</li>
<li class="">
<p>Many types now declare conformance to <code>EqualityComparable</code> trait.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/static_tuple/StaticTuple/"><code>StaticTuple</code></a> parameter order
has changed to <code>StaticTuple[type, size]</code> for consistency with <code>SIMD</code> and
similar collection types.</p>
</li>
<li class="">
<p>The signature of the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/algorithm/functional/elementwise/"><code>elementwise()</code></a> function has
been changed. The new order is <code>function</code>, <code>simd_width</code>, and then <code>rank</code>.
As a result, the rank parameter can now be inferred and one can call
<code>elementwise()</code> without it:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">elementwise</span><span class="token punctuation">[</span><span class="token plain">func</span><span class="token punctuation">,</span><span class="token plain"> simd_width</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">shape</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>PythonObject</code> is now register-passable.</p>
</li>
<li class="">
<p><code>PythonObject.__iter__()</code> now works correctly on more types of iterable Python
objects. Attempting to iterate over non-iterable objects will now raise an
exception instead of behaving as if iterating over an empty sequence.
<code>__iter__()</code> also now borrows <code>self</code> rather than requiring <code>inout</code>, allowing
code like:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> value </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> my_dict</span><span class="token punctuation">.</span><span class="token plain">values</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">  </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-moved">🚚 Moved<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#-moved" class="hash-link" aria-label="Direct link to 🚚 Moved" title="Direct link to 🚚 Moved" translate="no">​</a></h3>
<ul>
<li class="">
<p>We took the opportunity to rehome some modules into their correct package
as we were going through the process of open-sourcing the Mojo standard
library. Specifically, the following are some breaking changes worth
calling out. Please update your import statements accordingly.</p>
<ul>
<li class="">
<p><code>Buffer</code>, <code>NDBuffer</code>, and friends have moved
from the <code>memory</code> package into a new <code>buffer</code> package.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">buffer</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Buffer</span><span class="token punctuation">,</span><span class="token plain"> NDBuffer</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>utils.list</code>, including the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/buffer/dimlist/Dim/"><code>Dim</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/buffer/dimlist/DimList/"><code>DimList</code></a> types, has moved to
the <code>buffer</code> package.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">buffer</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Dim</span><span class="token punctuation">,</span><span class="token plain"> DimList</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/algorithm/memory/parallel_memcpy/"><code>parallel_memcpy()</code></a>
function has moved from the <code>memory</code> package into the <code>buffer</code> package.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">buffer</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> parallel_memcpy</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>rand()</code> and
<code>randn()</code>
functions from the
<code>random</code> package that return a <code>Tensor</code> have moved to the <code>tensor</code> package.
Note that the overloads that write to a <code>DTypePointer</code> remain in the
<code>random</code> package.</p>
<p>If you happen to be using both versions in the same source file, you can
import them both using the <code>import as</code> syntax:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> tensor </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> rand</span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> random </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> rand </span><span class="token keyword" style="color:#af2528">as</span><span class="token plain"> rand_dt</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>trap()</code> function has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/os/abort/"><code>abort()</code></a>. It also has moved from the <code>debug</code>
module to the <code>os</code> module.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> os </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> abort</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/numerics/isinf/"><code>isinf()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/numerics/isfinite/"><code>isfinite()</code></a> methods have been moved
from <code>math.limits</code> to the <code>math</code> module.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> math </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> ininf</span><span class="token punctuation">,</span><span class="token plain"> isfinite</span><br></div></code></pre></div></div>
</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling-changes">Tooling changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#tooling-changes" class="hash-link" aria-label="Direct link to Tooling changes" title="Direct link to Tooling changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-new-2">⭐️ New<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#%EF%B8%8F-new-2" class="hash-link" aria-label="Direct link to ⭐️ New" title="Direct link to ⭐️ New" translate="no">​</a></h3>
<ul>
<li class="">
<p>Docstring code blocks can now use <code>%#</code> to hide lines of code from
documentation generation.</p>
<p>For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> value </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token operator" style="color:#a89984">%</span><span class="token comment" style="color:#a89984"># print(value)</span><br></div></code></pre></div></div>
<p>Will generate documentation of the form:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> value </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><br></div></code></pre></div></div>
<p>Hidden lines are processed as if they were normal code lines during test
execution. This allows for writing additional code within a docstring
example that is only used to ensure the example is runnable/testable.</p>
</li>
<li class="">
<p>The Mojo LSP server now allow you to specify additional search paths to use
when resolving imported modules in a document. You can specify search paths
on the command line, using the <code>-I</code> option, or you can add them to the
<code>mojo.lsp.includeDirs</code> setting in the VS Code extension.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-changes">Other changes<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h3>
<ul>
<li class="">
<p>The <code>__get_address_as_lvalue</code> magic function has been removed. You can now
get an LValue from a <code>Pointer</code> or <code>Reference</code> by using the dereference
operator (<code>[]</code>):</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ptr</span><span class="token punctuation">:</span><span class="token plain"> Pointer</span><span class="token punctuation">[</span><span class="token plain">MyRecord</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Doesn't work</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">__get_address_as_lvalue</span><span class="token punctuation">(</span><span class="token plain">ptr</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> MyRecord</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Works</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">ptr</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> MyRecord</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The type parameter for the <code>memcpy</code> function is now automatically inferred.
This means that calls to <code>memcpy</code> of the form <code>memcpy[Dtype.xyz](...)</code> will
no longer work and the user would have to change the code to <code>memcpy(...)</code>.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/memory/memcpy/"><code>memcpy()</code></a> overload that worked on
<code>Buffer</code> types has been removed in favor of just overloads for
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>Pointer</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>DTypePointer</code></a>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># Doesn't work</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">memcpy</span><span class="token punctuation">(</span><span class="token plain">destBuffer</span><span class="token punctuation">,</span><span class="token plain"> srcBuffer</span><span class="token punctuation">,</span><span class="token plain"> count</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Works</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">memcpy</span><span class="token punctuation">(</span><span class="token plain">destBuffer</span><span class="token punctuation">.</span><span class="token plain">data</span><span class="token punctuation">,</span><span class="token plain"> srcBuffer</span><span class="token punctuation">.</span><span class="token plain">data</span><span class="token punctuation">,</span><span class="token plain"> count</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The functions <code>max_or_inf()</code>, <code>min_or_neginf()</code> have been removed from
<code>math.limit</code>. These functions were only used by the SIMD type.</p>
</li>
<li class="">
<p>As mentioned previously, the <code>print_no_newline()</code> function has been removed.
Please use <code>print(end="")</code> instead.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.2/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://github.com/modular/modular/issues/1362" target="_blank" rel="noopener noreferrer" class="">#1362</a> - Parameter inference
now recursively matches function types.</li>
<li class=""><a href="https://github.com/modular/modular/issues/951" target="_blank" rel="noopener noreferrer" class="">#951</a> - Functions that were
both <code>async</code> and <code>@always_inline</code> incorrectly errored.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1858" target="_blank" rel="noopener noreferrer" class="">#1858</a> - Trait with
parametric methods regression.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1892" target="_blank" rel="noopener noreferrer" class="">#1892</a> - Forbid unsupported
decorators on traits.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1735" target="_blank" rel="noopener noreferrer" class="">#1735</a> - Trait-typed values
are incorrectly considered equal.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1909" target="_blank" rel="noopener noreferrer" class="">#1909</a> - Crash due to nested
import in unreachable block.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1921" target="_blank" rel="noopener noreferrer" class="">#1921</a> - Parser crashes
binding <code>Reference</code> to lvalue with subtype lifetime.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1945" target="_blank" rel="noopener noreferrer" class="">#1945</a> -
<code>Optional[T].or_else()</code> should return <code>T</code> instead of <code>Optional[T]</code>.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1940" target="_blank" rel="noopener noreferrer" class="">#1940</a> - Constrain
<code>math.copysign</code> to floating point or integral types.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1838" target="_blank" rel="noopener noreferrer" class="">#1838</a> - Variadic <code>print</code>
does not work when specifying <code>end=""</code></li>
<li class=""><a href="https://github.com/modular/modular/issues/1826" target="_blank" rel="noopener noreferrer" class="">#1826</a> - The <code>SIMD.reduce</code>
methods correctly handle edge cases where <code>size_out &gt;= size</code>.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v24.1]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.24.1/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.24.1/"/>
        <updated>2024-02-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[🔥 Legendary]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-legendary">🔥 Legendary<a href="https://mojolang.static.modular-staging.com/releases/v0.24.1/#-legendary" class="hash-link" aria-label="Direct link to 🔥 Legendary" title="Direct link to 🔥 Legendary" translate="no">​</a></h2>
<ul>
<li class="">
<p>Mojo is now bundled with <a class="" href="https://mojolang.static.modular-staging.com/max/">the MAX platform</a>!</p>
<p>As such, the Mojo package version now matches the MAX version, which follows
a <code>YY.MAJOR.MINOR</code> version scheme. Because this is our first release in 2024,
that makes this version <code>24.1</code>.</p>
</li>
<li class="">
<p>Mojo debugging support is here! The Mojo VS Code extension includes debugger
support. For details, see <a class="" href="https://mojolang.static.modular-staging.com/docs/tools/debugging/">Debugging</a> in the Mojo
Manual.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-new">⭐️ New<a href="https://mojolang.static.modular-staging.com/releases/v0.24.1/#%EF%B8%8F-new" class="hash-link" aria-label="Direct link to ⭐️ New" title="Direct link to ⭐️ New" translate="no">​</a></h2>
<ul>
<li class="">
<p>We now have a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/set/Set/"><code>Set</code></a> type in our
collections! <code>Set</code> is backed by a <code>Dict</code>, so it has fast add, remove, and <code>in</code>
checks, and requires member elements to conform to the <code>KeyElement</code> trait.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> collections </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Set</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">set</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Set</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">set</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># 3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token builtin" style="color:#b4730e">set</span><span class="token punctuation">.</span><span class="token plain">add</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> element </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">set</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">element</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token builtin" style="color:#b4730e">set</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-=</span><span class="token plain"> Set</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">set</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> Set</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># True</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">set</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">|</span><span class="token plain"> Set</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> Set</span><span class="token punctuation">[</span><span class="token plain">Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># True</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> element </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">set</span><span class="token punctuation">.</span><span class="token plain">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">set</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># 1</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now supports the <code>x in y</code> expression as syntax sugar for
<code>y.__contains__(x)</code> as well as <code>x not in y</code>.</p>
</li>
<li class="">
<p>Mojo now has support for keyword-only arguments and parameters. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">my_product</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> d</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">a </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> b </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> c </span><span class="token operator" style="color:#a89984">*</span><span class="token plain"> d</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">my_product</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">)</span><span class="token plain">     </span><span class="token comment" style="color:#a89984"># prints '30'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">my_product</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> d</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">7</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># error: missing 1 required keyword-only argument: 'c'</span><br></div></code></pre></div></div>
<p>This includes support for declaring signatures that use both variadic and
keyword-only arguments/parameters. For example, the following is now possible:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">prod_with_offset</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">args</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> offset</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">0</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> res </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">args</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        res </span><span class="token operator" style="color:#a89984">*=</span><span class="token plain"> args</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> res </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> offset</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">prod_with_offset</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">         </span><span class="token comment" style="color:#a89984"># prints 240</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">prod_with_offset</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">,</span><span class="token plain"> offset</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints 34</span><br></div></code></pre></div></div>
<p>Note that variadic keyword-only arguments/parameters (for example, <code>**kwargs</code>)
are not supported yet. That is, the following is not allowed:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">variadic_kw_only</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">**</span><span class="token plain">kwargs</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>For more information, see
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/functions/#positional-only-and-keyword-only-arguments">Positional-only and keyword-only arguments</a>
in the Mojo Manual.</p>
</li>
<li class="">
<p>The <code>print()</code> function now accepts a keyword-only argument for the <code>end</code>
which is useful for controlling whether a newline is printed or not
after printing the elements. By default, <code>end</code> defaults to "\n" as before.</p>
</li>
<li class="">
<p>The Mojo SDK can now be installed on AWS Graviton instances.</p>
</li>
<li class="">
<p>A new version of the Mojo Playground is available. The new
playground is a simple interactive editor for Mojo code, similar to the Rust
Playground or Go Playground. The old JupyterLab based playground will remain
online until March 20th.</p>
</li>
<li class="">
<p>The Mojo LSP server will now generate fixits for populating empty
documentation strings:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token plain">arg</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:#477a5b">""""""</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># Unexpected empty documentation string</span><br></div></code></pre></div></div>
<p>Applying the fixit from above will generate:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token plain">arg</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:#477a5b">"""[summary].</span><br></div><div class="token-line" style="color:#654735"><span class="token triple-quoted-string string" style="display:inline-block;color:#477a5b"></span><br></div><div class="token-line" style="color:#654735"><span class="token triple-quoted-string string" style="color:#477a5b">    Args:</span><br></div><div class="token-line" style="color:#654735"><span class="token triple-quoted-string string" style="color:#477a5b">        arg: [description].</span><br></div><div class="token-line" style="color:#654735"><span class="token triple-quoted-string string" style="color:#477a5b">    """</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Added new <code>*_</code> syntax that allows users to explicitly unbind any number of
positional parameters. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">StructWithDefault</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">,</span><span class="token plain"> d</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">9</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> all_unbound </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithDefault</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">_</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># equivalent to</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> all_unbound </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithDefault</span><span class="token punctuation">[</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> first_bound </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithDefault</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">_</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># equivalent to</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> first_bound </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithDefault</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> last_bound </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithDefault</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># equivalent to</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> last_bound </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithDefault</span><span class="token punctuation">[</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> mid_unbound </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithDefault</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># equivalent to</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> mid_unbound </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithDefault</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
<p>As demonstrated above, this syntax can be used to explicitly unbind an
arbitrary number of parameters, at the beginning, at the end, or in the middle
of the operand list. Since these unbound parameters must be explicitly
specified at some point, default values for these parameters are not applied.
For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> last_bound </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> StructWithDefault</span><span class="token punctuation">[</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">6</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># When using last_bound, you must specify a, b, and c. last_bound</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># doesn't have a default value for `c`.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> s </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> last_bound</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>For more information see the Mojo Manual sections on
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/parameters/#fully-bound-partially-bound-and-unbound-types">partially-bound types</a>
and
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/parameters/#automatic-parameterization">automatic parameterization of functions</a>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>DynamicVector</code></a> now supports iteration.
Iteration values are instances of <code>Reference</code> and require dereferencing:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> v</span><span class="token punctuation">:</span><span class="token plain"> DynamicVector</span><span class="token punctuation">[</span><span class="token plain">String</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">v</span><span class="token punctuation">.</span><span class="token plain">append</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Alice"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">v</span><span class="token punctuation">.</span><span class="token plain">append</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Bob"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">v</span><span class="token punctuation">.</span><span class="token plain">append</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Charlie"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> x </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> v</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    x</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Hello, "</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> x</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> x </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> v</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>DynamicVector</code> now has
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/#reverse"><code>reverse()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/#extend"><code>extend()</code></a> methods.</p>
</li>
<li class="">
<p>The <code>mojo package</code> command now produces compilation agnostic packages.
Compilation options such as O0, or --debug-level, are no longer needed or
accepted. As a result, packages are now smaller, and extremely portable.</p>
</li>
<li class="">
<p>Initializers for <code>@register_passable</code> values can (and should!) now be
specified with <code>inout self</code> arguments just like memory-only types:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@register_passable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">YourPair</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">a </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">b </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">17</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__copyinit__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> existing</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">a </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> existing</span><span class="token punctuation">.</span><span class="token plain">a</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">b </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> existing</span><span class="token punctuation">.</span><span class="token plain">b</span><br></div></code></pre></div></div>
<p>This form makes the language more consistent, more similar to Python, and
easier to implement advanced features for. There is also no performance
impact of using this new form: the compiler arranges to automatically return
the value in a register without requiring you to worry about it.</p>
<p>The older <code>-&gt; Self</code> syntax is still supported in this release, but will be
removed in a subsequent one, so please migrate your code. One thing to watch
out for: a given struct should use one style or the other, mixing some of
each won't work well.</p>
</li>
<li class="">
<p>The <code>inout self</code> initializer form is <strong>required</strong> for initializers of
<code>@register_passable</code> types that may raise errors:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@register_passable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">RaisingCtor</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> raises</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">raise</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>async</code> functions that may raise errors have been temporarily disabled in this
build. The implementation of Mojo async is undergoing a rework 🚧.</p>
</li>
<li class="">
<p>The standard library <code>slice</code> type has been renamed to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/builtin_slice/Slice/"><code>Slice</code></a>, and a <code>slice</code>
function has been introduced. This makes Mojo closer to Python and makes the
<code>Slice</code> type follow the naming conventions of other types like <code>Int</code>.</p>
</li>
<li class="">
<p>"Slice" syntax in subscripts is no longer hard coded to the builtin <code>slice</code>
type: it now works with any type accepted by a container's <code>__getitem__()</code>
method. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">UnusualSlice</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Float64</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> c</span><span class="token punctuation">:</span><span class="token plain"> String</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">YourContainer</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__getitem__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">slice</span><span class="token punctuation">:</span><span class="token plain"> UnusualSlice</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> T</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>Given this implementation, you can subscript into an instance of
<code>YourContainer</code> like <code>yc[42:3.14:"🔥"]</code> and the three values are passed to the
<code>UnusualSlice</code> constructor.</p>
</li>
<li class="">
<p>The <code>__refitem__()</code> accessor method may now return a <code>Reference</code> instead of
having to return an MLIR internal reference type.</p>
</li>
<li class="">
<p>Added
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/#init_pointee_move"><code>AnyPointer.move_into()</code></a>
method, for moving a value from one pointer memory location to another.</p>
</li>
<li class="">
<p>Added built-in <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/format_int/hex/"><code>hex()</code></a> function, which
can be used to format any value whose type implements the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Intable/"><code>Intable</code></a> trait as a hexadecimal string.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> now
implements <code>__is__</code> and <code>__isnot__</code> so that you can use expressions of the
form <code>x is y</code> and <code>x is not y</code> with <code>PythonObject</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> now conforms
to the <code>SizedRaising</code> trait. This means the built-in
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/len/len/"><code>len()</code></a> function now works on <code>PythonObject</code>.</p>
</li>
<li class="">
<p>The <code>os</code> package now contains the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/fstat/stat/"><code>stat()</code></a>
and <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/fstat/lstat/"><code>lstat()</code></a> functions.</p>
</li>
<li class="">
<p>A new <a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/path/path/"><code>os.path</code></a> package now allows you to query
properties on paths.</p>
</li>
<li class="">
<p>The <code>os</code> package now has a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/os/pathlike/PathLike/"><code>PathLike</code></a> trait. A struct conforms
to the <code>PathLike</code> trait by implementing the <code>__fspath__()</code> function.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/"><code>pathlib.Path</code></a> now has functions to
query properties of the path.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/#listdir"><code>listdir()</code></a> method now exists on
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/"><code>pathlib.Path</code></a> and also exists in the <code>os</code>
module to work on <code>PathLike</code> structs. For example, the following sample
lists all the directories in the <code>/tmp</code> directory:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> pathlib </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Path</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">walktree</span><span class="token punctuation">(</span><span class="token plain">top</span><span class="token punctuation">:</span><span class="token plain"> Path</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> files</span><span class="token punctuation">:</span><span class="token plain"> DynamicVector</span><span class="token punctuation">[</span><span class="token plain">Path</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">try</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> ls </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> top</span><span class="token punctuation">.</span><span class="token plain">listdir</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">ls</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> child </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> top </span><span class="token operator" style="color:#a89984">/</span><span class="token plain"> ls</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> child</span><span class="token punctuation">.</span><span class="token plain">is_dir</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">                walktree</span><span class="token punctuation">(</span><span class="token plain">child</span><span class="token punctuation">,</span><span class="token plain"> files</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token keyword" style="color:#af2528">elif</span><span class="token plain"> child</span><span class="token punctuation">.</span><span class="token plain">is_file</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">                files</span><span class="token punctuation">.</span><span class="token plain">append</span><span class="token punctuation">(</span><span class="token plain">child</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">            </span><span class="token keyword" style="color:#af2528">else</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">                </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"Skipping '"</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">str</span><span class="token punctuation">(</span><span class="token plain">child</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"'"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">except</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> files </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> DynamicVector</span><span class="token punctuation">[</span><span class="token plain">Path</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    walktree</span><span class="token punctuation">(</span><span class="token plain">Path</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"/tmp"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> files</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">files</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">files</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/#find"><code>find()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/#rfind"><code>rfind()</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string_slice/StringSlice/#count"><code>count()</code></a>, and
<code>__contains__()</code>
methods now work on string literals. This means that you can write:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"Mojo"</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"Hello Mojo"</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Breakpoints can now be inserted programmatically within the code using the
builtin <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/breakpoint/breakpoint/"><code>breakpoint()</code></a> function.</p>
<p>Note: on Graviton instances, the debugger might not be able to resume after
hitting this kind of breakpoint.</p>
</li>
<li class="">
<p>Added a builtin <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/Boolable/"><code>Boolable</code></a> trait that
describes a type that can be represented as a boolean value. To conform to the
trait, a type must implement the <code>__bool__()</code> method.</p>
</li>
<li class="">
<p>Modules within packages can now use purely relative <code>from</code> imports:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> another_module</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Trivial types, like MLIR types and function types, can now be bound implicitly
to traits that require copy constructors or move constructors, such as
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Movable/"><code>Movable</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Copyable/"><code>Copyable</code></a>, and
<code>CollectionElement</code>.</p>
</li>
<li class="">
<p>A new magic <code>__origin_of(expr)</code> call will yield the lifetime of a memory
value. We hope and expect that this will eventually be replaced by
<code>Reference(expr).lifetime</code> as the parameter system evolves, but this is
important in the meantime for use in function signatures.</p>
</li>
<li class="">
<p>A new magic <code>__type_of(expr)</code> call will yield the type of a value. This allows
one to refer to types of other variables. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">my_function</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> y</span><span class="token punctuation">:</span><span class="token plain"> __type_of</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> z</span><span class="token punctuation">:</span><span class="token plain"> __type_of</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> y</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> z</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-changed">🦋 Changed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.1/#-changed" class="hash-link" aria-label="Direct link to 🦋 Changed" title="Direct link to 🦋 Changed" translate="no">​</a></h2>
<ul>
<li class="">
<p>As another step towards
<a href="https://github.com/modular/modular/blob/main/mojo/proposals/remove-let-decls.md" target="_blank" rel="noopener noreferrer" class="">removing let declarations</a>
we have removed support for let declarations inside the compiler. To ease
migration, we parse <code>let</code> declarations as a <code>var</code> declaration so your code
won't break. We emit a warning about this, but please switch your code to
using <code>var</code> explicitly, because this migration support will be removed in a
subsequent update.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># treated as a var, but please update your code!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">42</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># warning: 'let' is being removed, please use 'var' instead</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    x </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">9</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>It is no longer possible to explicitly specify implicit argument parameters in
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/parameters/#automatic-parameterization">automatically parameterized
functions</a>.
This ability was an oversight and this is now an error:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">autoparameterized</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> SIMD</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">pass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">autoparameterized</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int32</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># error: too many parameters</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>vectorize_unroll</code> has been removed, and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/algorithm/functional/vectorize/"><code>vectorize</code></a> now has a parameter
named <code>unroll_factor</code> with a default value of 1. Increasing <code>unroll_factor</code>
may improve performance at the cost of binary size. See the
<a href="https://www.modular.com/blog/what-is-loop-unrolling-how-you-can-speed-up-mojo" target="_blank" rel="noopener noreferrer" class="">loop unrolling blog here</a>
for more details.</p>
</li>
<li class="">
<p>The <code>vectorize</code> signatures have changed with the closure <code>func</code> moved to the
first parameter:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">vectorize</span><span class="token punctuation">[</span><span class="token plain">func</span><span class="token punctuation">,</span><span class="token plain"> width</span><span class="token punctuation">,</span><span class="token plain"> unroll_factor </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">size</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">vectorize</span><span class="token punctuation">[</span><span class="token plain">func</span><span class="token punctuation">,</span><span class="token plain"> width</span><span class="token punctuation">,</span><span class="token plain"> size</span><span class="token punctuation">,</span><span class="token plain"> unroll_factor </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>The doc string has been updated with examples demonstrating the difference
between the two signatures.</p>
</li>
<li class="">
<p>The <code>unroll</code> signatures have changed with the closure <code>func</code> moved to the
first parameter:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">unroll</span><span class="token punctuation">[</span><span class="token plain">func</span><span class="token punctuation">,</span><span class="token plain"> unroll_count</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The signature of the <code>NDBuffer</code> and <code>Buffer</code> types have changed. Now, both
take the type as the first parameter and no longer require the shape
parameter. This allows you to use these types and have sensible defaults.
For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">NDBuffer</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">float32</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
<p>is equivalent to</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">NDBuffer</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">float32</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> DimList</span><span class="token punctuation">.</span><span class="token plain">create_unknown</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
<p>Users can still specify the static shape (if known) to the type:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">NDBuffer</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">float32</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> DimList</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">128</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">128</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">)</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The error message for missing function arguments is improved: instead of
describing the number of arguments (e.g. <code>callee expects at least 3 arguments, but 1 was specified</code>) the missing arguments are now described by
name (e.g. <code>missing 2 required positional arguments: 'b', 'c'</code>).</p>
</li>
<li class="">
<p>The <code>CollectionElement</code> trait
is now a built-in trait and has been removed from <code>collections.vector</code>.</p>
</li>
<li class="">
<p>The <code>DynamicVector(capacity: Int)</code> constructor has been changed to take
<code>capacity</code> as a keyword-only argument to prevent implicit conversion from
<code>Int</code>.</p>
</li>
<li class="">
<p><code>Variant.get[T]()</code> now
returns a <code>Reference</code> to the value rather than a copy.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/"><code>String</code></a> methods <code>tolower()</code>
and <code>toupper()</code> have been renamed to <code>str.lower()</code> and <code>str.upper()</code>.</p>
</li>
<li class="">
<p>The <code>ref</code> and <code>mutref</code> identifiers are no longer reserved as Mojo keywords.
We originally thought about using those as language sugar for references, but
we believe that generic language features combined with the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/Pointer/"><code>Reference</code></a> type will provide a good
experience without dedicated sugar.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.24.1/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to ��🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/modular/modular/issues/435" target="_blank" rel="noopener noreferrer" class="">#435</a>
Structs with Self type don't always work.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1540" target="_blank" rel="noopener noreferrer" class="">#1540</a>
Crash in register_passable self referencing struct.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1664" target="_blank" rel="noopener noreferrer" class="">#1664</a> - Improve error
message when <code>StaticTuple</code> is constructed with a negative size for
the number of elements.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1679" target="_blank" rel="noopener noreferrer" class="">#1679</a> - crash on SIMD of
zero elements.</li>
<li class="">Various crashes on invalid code:
<a href="https://github.com/modular/modular/issues/1230" target="_blank" rel="noopener noreferrer" class="">#1230</a>,
<a href="https://github.com/modular/modular/issues/1699" target="_blank" rel="noopener noreferrer" class="">#1699</a>,
<a href="https://github.com/modular/modular/issues/1708" target="_blank" rel="noopener noreferrer" class="">#1708</a></li>
<li class=""><a href="https://github.com/modular/modular/issues/1223" target="_blank" rel="noopener noreferrer" class="">#1223</a> - Crash when
parametric function is passed as (runtime) argument. The parser now errors out
instead.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1530" target="_blank" rel="noopener noreferrer" class="">#1530</a> - Crash during
diagnostic emission for parameter deduction failure.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1538" target="_blank" rel="noopener noreferrer" class="">#1538</a> and
<a href="https://github.com/modular/modular/issues/1607" target="_blank" rel="noopener noreferrer" class="">#1607</a> - Crash when returning
type value instead of instance of expected type. This is a common mistake and
the error now includes a hint to point users to the problem.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1613" target="_blank" rel="noopener noreferrer" class="">#1613</a> - Wrong type name in
error for incorrect <code>self</code> argument type in trait method declaration.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1670" target="_blank" rel="noopener noreferrer" class="">#1670</a> - Crash on implicit
conversion in a global variable declaration.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1741" target="_blank" rel="noopener noreferrer" class="">#1741</a> - Mojo documentation
generation doesn't show <code>inout</code>/<code>owned</code> on variadic arguments.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1621" target="_blank" rel="noopener noreferrer" class="">#1621</a> - VS Code does not
highlight <code>raises</code> and <code>capturing</code> in functional type expressions.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1617" target="_blank" rel="noopener noreferrer" class="">#1617</a> - VS Code does not
highlight <code>fn</code> in specific contexts.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1740" target="_blank" rel="noopener noreferrer" class="">#1740</a> - LSP shows unrelated
info when hovering over a struct.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1238" target="_blank" rel="noopener noreferrer" class="">#1238</a> - File shadows Mojo
package path.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1429" target="_blank" rel="noopener noreferrer" class="">#1429</a> - Crash when using
nested import statement.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1322" target="_blank" rel="noopener noreferrer" class="">#1322</a> - Crash when missing
types in variadic argument.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1314" target="_blank" rel="noopener noreferrer" class="">#1314</a> - Typecheck error when
binding alias to parametric function with default argument.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1248" target="_blank" rel="noopener noreferrer" class="">#1248</a> - Crash when importing
from file the same name as another file in the search path.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1354" target="_blank" rel="noopener noreferrer" class="">#1354</a> - Crash when importing
from local package.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1488" target="_blank" rel="noopener noreferrer" class="">#1488</a> - Crash when setting
generic element field.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1476" target="_blank" rel="noopener noreferrer" class="">#1476</a> - Crash in interpreter
when calling functions in parameter context.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1537" target="_blank" rel="noopener noreferrer" class="">#1537</a> - Crash when copying
parameter value.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1546" target="_blank" rel="noopener noreferrer" class="">#1546</a> - Modify nested vector
element crashes parser.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1558" target="_blank" rel="noopener noreferrer" class="">#1558</a> - Invalid import
causes parser to crash.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1562" target="_blank" rel="noopener noreferrer" class="">#1562</a> - Crash when calling
parametric type member function.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1577" target="_blank" rel="noopener noreferrer" class="">#1577</a> - Crash when using
unresolved package as a variable.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1579" target="_blank" rel="noopener noreferrer" class="">#1579</a> - Member access into
type instances causes a crash.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1602" target="_blank" rel="noopener noreferrer" class="">#1602</a> - Interpreter failure
when constructing strings at compile time.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1696" target="_blank" rel="noopener noreferrer" class="">#1696</a> - Fixed an issue that
caused syntax highlighting to occasionally fail.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1549" target="_blank" rel="noopener noreferrer" class="">#1549</a> - Fixed an issue when
the shift amount is out of range in <code>SIMD.shift_left</code> and <code>SIMD.shift_right</code>.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v0.7.0]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.7.0/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.7.0/"/>
        <updated>2024-01-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[⭐️ New]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-new">⭐️ New<a href="https://mojolang.static.modular-staging.com/releases/v0.7.0/#%EF%B8%8F-new" class="hash-link" aria-label="Direct link to ⭐️ New" title="Direct link to ⭐️ New" translate="no">​</a></h2>
<ul>
<li class="">
<p>A new Mojo-native dictionary type,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/"><code>Dict</code></a> for storing key-value pairs.
<code>Dict</code> stores values that conform to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/CollectionElement/"><code>CollectionElement</code></a>
trait. Keys need to conform to the new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/dict/#keyelement"><code>KeyElement</code></a> trait, which is
not yet implemented by other standard library types. In the short term, you
can create your own wrapper types to use as keys. For example, the following
sample defines a <code>StringKey</code> type and uses it to create a dictionary that maps
strings to <code>Int</code> values:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> collections</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">dict</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> Dict</span><span class="token punctuation">,</span><span class="token plain"> KeyElement</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">StringKey</span><span class="token punctuation">(</span><span class="token plain">KeyElement</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> s</span><span class="token punctuation">:</span><span class="token plain"> String</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">owned</span><span class="token plain"> s</span><span class="token punctuation">:</span><span class="token plain"> String</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">s </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> s </span><span class="token operator" style="color:#a89984">^</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> s</span><span class="token punctuation">:</span><span class="token plain"> StringLiteral</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">s </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> String</span><span class="token punctuation">(</span><span class="token plain">s</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__hash__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">hash</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">s</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__eq__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> other</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Bool</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">s </span><span class="token operator" style="color:#a89984">==</span><span class="token plain"> other</span><span class="token punctuation">.</span><span class="token plain">s</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">def</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> d </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Dict</span><span class="token punctuation">[</span><span class="token plain">StringKey</span><span class="token punctuation">,</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    d</span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"cats"</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    d</span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"dogs"</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">d</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">         </span><span class="token comment" style="color:#a89984"># prints 2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">d</span><span class="token punctuation">[</span><span class="token string" style="color:#477a5b">"cats"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain">      </span><span class="token comment" style="color:#a89984"># prints 1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">d</span><span class="token punctuation">.</span><span class="token plain">pop</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"dogs"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints 2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">d</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain">         </span><span class="token comment" style="color:#a89984"># prints 1</span><br></div></code></pre></div></div>
<p>We plan to add <code>KeyElement</code> conformance to standard library types in
subsequent releases.</p>
</li>
<li class="">
<p>Users can opt-in to assertions used in the standard library code by
specifying <code>-D MOJO_ENABLE_ASSERTIONS</code> when invoking <code>mojo</code> to
compile your source file(s). In the case that an assertion is fired,
the assertion message will be printed along with the stack trace
before the program exits. By default, assertions are <em>not enabled</em>
in the standard library right now for performance reasons.</p>
</li>
<li class="">
<p>The Mojo Language Server now implements the References request. IDEs use
this to provide support for <strong>Go to References</strong> and <strong>Find All References</strong>.
A current limitation is that references outside of the current document are
not supported, which will be addressed in the future.</p>
</li>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/std/sys/info/"><code>sys.info</code></a> module now includes
<code>num_physical_cores()</code>, <code>num_logical_cores()</code>, and <code>num_performance_cores()</code>
functions.</p>
</li>
<li class="">
<p>Homogeneous variadic arguments consisting of memory-only types, such as
<code>String</code> are more powerful and easier to use. These arguments are projected
into a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicListMem/"><code>VariadicListMem</code></a>.</p>
<p>(Previous releases made it easier to use variadic lists of register-passable
types, like <code>Int</code>.)</p>
<p>Subscripting into a <code>VariadicListMem</code> now returns the element instead of an
obscure internal type. In addition, we now support <code>inout</code> and <code>owned</code>
variadic arguments:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">make_worldly</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">strs</span><span class="token punctuation">:</span><span class="token plain"> String</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># This "just works" as you'd expect!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">strs</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        strs</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">" world"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> s1</span><span class="token punctuation">:</span><span class="token plain"> String </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hello"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> s2</span><span class="token punctuation">:</span><span class="token plain"> String </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"konnichiwa"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> s3</span><span class="token punctuation">:</span><span class="token plain"> String </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"bonjour"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    make_worldly</span><span class="token punctuation">(</span><span class="token plain">s1</span><span class="token punctuation">,</span><span class="token plain"> s2</span><span class="token punctuation">,</span><span class="token plain"> s3</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">s1</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># hello world</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">s2</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># konnichiwa world</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">s3</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># bonjour world</span><br></div></code></pre></div></div>
<p>(Previous releases made it easier to use variadic lists, but subscripting into
a <code>VariadicListMem</code> returned a low-level pointer, which required the user to
call <code>__get_address_as_lvalue()</code> to access the element.)</p>
<p>Note that subscripting the variadic list works nicely as above, but iterating
over the variadic list directly with a <code>for</code> loop produces a <code>Reference</code>
(described below) instead of the desired value, so an extra subscript is
required; We intend to fix this in the future.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">make_worldly</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">*</span><span class="token plain">strs</span><span class="token punctuation">:</span><span class="token plain"> String</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Requires extra [] to dereference the reference for now.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> strs</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        i</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">" world"</span><br></div></code></pre></div></div>
<p>Heterogeneous variadic arguments have not yet been moved to the new model, but
will in future updates.</p>
<p>Note that for variadic arguments of register-passable types like <code>Int</code>, the
variadic list contains values, not references, so the dereference operator
(<code>[]</code>) is not required. This code continues to work as it did previously:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">print_ints</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">nums</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> num </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> nums</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">num</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">nums</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now has a prototype version of a safe
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/pointer/Pointer/"><code>Reference</code></a> type. The compiler's
lifetime tracking pass can reason about references to safely extend local
variable lifetime, and check indirect access safety. The <code>Reference</code> type
is brand new (and currently has no syntactic sugar) so it must be explicitly
dereferenced with an empty subscript: <code>ref[]</code> provides access to the
underlying value.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"> String </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hello"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> String </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">" references"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> aref </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Reference</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    aref</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> b</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">)</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># prints "hello references"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    aref</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">+=</span><span class="token plain"> b</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># ^last use of b, it is destroyed here.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">aref</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># prints "hello references references"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># ^last use of a, it is destroyed here.</span><br></div></code></pre></div></div>
<p>While the <code>Reference</code> type has the same in-memory representation as a C
pointer or the Mojo <code>Pointer</code> type, it also tracks a symbolic "lifetime" value
so the compiler can reason about the potentially accessed set of values. This
lifetime is part of the static type of the reference, so it propagates through
generic algorithms and abstractions built around it.</p>
<p>The <code>Reference</code> type can form references to both mutable and immutable memory
objects, e.g. those on the stack or borrowed/inout/owned function arguments.
It is fully parametric over mutability, eliminating the <a href="https://duckki.github.io/2024/01/01/inferred-mutability.html" target="_blank" rel="noopener noreferrer" class="">problems with code
duplication due to mutability
specifiers</a> and
provides the base for unified user-level types. For example, it could be
used to implement an array slice object that handles both mutable and
immutable array slices.</p>
<p>While this is a major step forward for the lifetimes system in Mojo, it is
still <em>very</em> early and awkward to use. Notably, there is no syntactic sugar
for using references, such as automatic dereferencing. Several aspects of it
need to be more baked. It is getting exercised by variadic memory arguments,
which is why they are starting to behave better now.</p>
<p>Note: the safe <code>Reference</code> type and the unsafe pointer types are defined in
the same module, currently named <code>memory.unsafe</code>. We expect to restructure
this module in a future release.</p>
</li>
<li class="">
<p>Mojo now allows types to implement <code>__refattr__()</code> and <code>__refitem__()</code> to
enable attribute and subscript syntax with computed accessors that return
references. For common situations where these address a value in memory this
provides a more convenient and significantly more performant alternative to
implementing the traditional get/set pairs. Note: this may be changed in the
future when references auto-dereference—at that point we may switch to just
returning a reference from <code>__getattr__()</code>.</p>
</li>
<li class="">
<p>Parametric closures can now capture register passable typed values by copy
using the <code>__copy_capture</code> decorator. For example, the following code will
print <code>5</code>, not <code>2</code>.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">foo</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> z </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> x</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@__copy_capture</span><span class="token punctuation">(</span><span class="token plain">z</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">formatter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> Int</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> z</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    z </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">formatter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    foo</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>String now implements KeyElement and may be used as a key in Dict.</p>
</li>
<li class="">
<p>More robust support for structs with fields of self referencing types.
For example, the following code will work and print <code>0</code>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Foo</span><span class="token punctuation">(</span><span class="token plain">CollectionElement</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> vec</span><span class="token punctuation">:</span><span class="token plain"> DynamicVector</span><span class="token punctuation">[</span><span class="token plain">Self</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__init__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">vec </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> DynamicVector</span><span class="token punctuation">[</span><span class="token plain">Self</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__moveinit__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">owned</span><span class="token plain"> existing</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">vec </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> existing</span><span class="token punctuation">.</span><span class="token plain">vec </span><span class="token operator" style="color:#a89984">^</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__copyinit__</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">,</span><span class="token plain"> existing</span><span class="token punctuation">:</span><span class="token plain"> Self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">vec </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> existing</span><span class="token punctuation">.</span><span class="token plain">vec</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> foo </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">foo</span><span class="token punctuation">.</span><span class="token plain">vec</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-removed">❌ Removed<a href="https://mojolang.static.modular-staging.com/releases/v0.7.0/#-removed" class="hash-link" aria-label="Direct link to ❌ Removed" title="Direct link to ❌ Removed" translate="no">​</a></h2>
<ul>
<li class="">
<p>The <code>__takeinit__</code> special constructor form has been removed from the
language. This "non-destructive move" operation was previously wired into the
<code>x^</code> transfer operator, but had unpredictable behavior that wasn't consistent.
Now that Mojo has traits, it is better to model this as an explicit <code>.take()</code>
operation on a type, which would transfer out the contents of the type without
ending its lifetime. For example, for a type that holds a pointer, <code>take()</code>
might return a new instance pointing to the same data, and null out its own
internal pointer.</p>
<p>This change makes it clear when a lifetime is ended versus when the
contents of an LValue are explicitly taken.</p>
</li>
<li class="">
<p>The current implementation of autotuning has been deprecated, as Mojo's
autotuning implementation is undergoing a redesign. Tutorials around the
current implementation have also been removed as they are being rewritten.</p>
<p>Consequently, the <code>autotune()</code>, <code>autotune_fork()</code>, and <code>search()</code> functions
have been removed from the standard library.</p>
</li>
<li class="">
<p>The <code>_OldDynamicVector</code> type that worked only on register passable element
types has been removed. Please migrate uses to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>DynamicVector</code></a> which
works on both register passable and memory types.</p>
</li>
<li class="">
<p>The <code>UnsafeFixedVector</code> in <code>utils.vector</code> has been removed. We recommend using
either <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>DynamicVector</code></a>
or <a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/inline_array/InlineArray/"><code>InlinedFixedVector</code></a>
instead.</p>
</li>
<li class="">
<p>The <code>@adaptive</code> decorator has been removed from the language. Any uses of the
decorator in a non-search context can be replaced with <code>@parameter if</code>. For
example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@adaptive</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    constrained</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    body1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token decorator annotation punctuation">@adaptive</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    constrained</span><span class="token punctuation">[</span><span class="token keyword" style="color:#af2528">not</span><span class="token plain"> a</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    body2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Can be rewritten as:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> foo</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token decorator annotation punctuation">@parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> a</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        body1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">else</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        body2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Consequently, the special <code>__adaptive_set</code> attribute has been removed as well.</p>
</li>
<li class="">
<p>Result parameters have been removed from Mojo. Result parameter declarations
in function parameter lists are no longer allowed, nor are forward alias
declarations. This includes removing the <code>param_return</code> statement.</p>
</li>
<li class="">
<p>The <code>@noncapturing</code> and <code>@closure</code> decorators have been removed due to
refinements and improvements to the closure model. See below for more details!</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-changed">🦋 Changed<a href="https://mojolang.static.modular-staging.com/releases/v0.7.0/#-changed" class="hash-link" aria-label="Direct link to 🦋 Changed" title="Direct link to 🦋 Changed" translate="no">​</a></h2>
<ul>
<li class="">
<p>The Mojo closure model has been refined to be more straightforward and safe.
Mojo has two closure types: parameter closures and runtime closures. Parameter
closures can be used in higher-order functions and are the backbone of
functions like <code>vectorize</code> and <code>parallelize</code>. They are always denoted by
<code>@parameter</code> and have type <code>fn() capturing -&gt; T</code> (where <code>T</code> is the return
type).</p>
<p>On the other hand, runtime closures are always dynamic values, capture values
by invoking their copy constructor, and retain ownership of their capture
state. You can define a runtime closure by writing a nested function that
captures values:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">outer</span><span class="token punctuation">(</span><span class="token plain">b</span><span class="token punctuation">:</span><span class="token plain"> Bool</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> String</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">fn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> escaping </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#af2528">None</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">closure</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># 'x' is captured by calling String.__copyinit__</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">bare_function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"hello"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token comment" style="color:#a89984"># nothing is captured</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">if</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token comment" style="color:#a89984"># closure can be safely returned because it owns its state</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> closure</span><span class="token operator" style="color:#a89984">^</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># function pointers can be converted to runtime closures</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> bare_function</span><br></div></code></pre></div></div>
<p>The type of runtime closures are of the form <code>fn() escaping -&gt; T</code>. You
can pass equivalent function pointers as runtime closures.</p>
<p>Stay tuned for capture list syntax for move capture and capture by reference,
and a more unified closure model!</p>
</li>
<li class="">
<p>The <code>@unroll(n)</code> decorator can now take a parameter expression for
the unroll factor, i.e. <code>n</code> can be a parameter expression that is
of integer type.</p>
</li>
<li class="">
<p>The <code>cpython</code> module in the <code>python</code> package has been moved to be an internal
module, i.e, <code>_cpython</code>.</p>
</li>
<li class="">
<p><code>AnyType</code> and <code>Destructable</code> have been unified into a single trait, <code>AnyType</code>.
Every nominal type (i.e. all structs) now automatically conform to <code>AnyType</code>.</p>
</li>
<li class="">
<p>Previously, the <code>mojo package</code> command would output a Mojo package that
included both partly-compiled Mojo code, as well as fully-compiled machine
code for a specific computer architecture -- the architecture of the machine
being used to invoke the <code>mojo package</code> command.</p>
<p>Now, <code>mojo package</code> only includes partly-compiled Mojo code. It is only fully
compiled for the specific computer architecture being used at the point that
the package is first <code>import</code>-ed. As a result, Mojo packages are smaller and
more portable.</p>
</li>
<li class="">
<p>The <code>simd_width</code> and <code>dtype</code> parameters of <code>polynomial_evaluate</code> have been
switched. Based on the request in
<a href="https://github.com/modular/modular/issues/1587" target="_blank" rel="noopener noreferrer" class="">#1587</a>, the
<code>polynomial_evaluate</code> function has also been extended so that the
<code>coefficients</code> parameter can take either a either a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/utils/static_tuple/StaticTuple/"><code>StaticTuple</code></a> or a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicList/"><code>VariadicList</code></a>.</p>
</li>
<li class="">
<p>As a tiny step towards removing <code>let</code> declarations, this release removes the
warning: <code>'var' was never mutated, consider switching to a 'let'</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.7.0/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/modular/modular/issues/1595" target="_blank" rel="noopener noreferrer" class="">#1595</a> - Improve error
message when trying to materialize <code>IntLiteral</code> in runtime code.</li>
<li class="">Raising an error from the initializer of a memory-only type now works
correctly in the presence of complex control flow. Previously Mojo could run
the destructor on <code>self</code> before it was initialized when exiting with an
error.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1096" target="_blank" rel="noopener noreferrer" class="">#1096</a> - Improve warning
messages for dead code in conditionals like <code>or</code> expressions.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1419" target="_blank" rel="noopener noreferrer" class="">#1419</a> - Fix assertion
failure with uninitialized lattice values.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1402" target="_blank" rel="noopener noreferrer" class="">#1402</a> - Fix movable trait
not detected on recursive struct implemented with <code>AnyPointer</code>.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1399" target="_blank" rel="noopener noreferrer" class="">#1399</a> - Fix parser crash
when a parameter type in a struct that implements a trait is misspelled.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1152" target="_blank" rel="noopener noreferrer" class="">#1152</a> - Allow mutable <code>self</code>
argument when overloading operators using dunder methods.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1493" target="_blank" rel="noopener noreferrer" class="">#1493</a> - Fix crash in
<code>DynamicVector</code> copy constructor in certain situations.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1316" target="_blank" rel="noopener noreferrer" class="">#1316</a> - The <code>benchmark.keep</code>
function now properly handles vector types.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1505" target="_blank" rel="noopener noreferrer" class="">#1505</a> - The <code>simd.shuffle</code>
operation now works on 64 element permutations.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1355" target="_blank" rel="noopener noreferrer" class="">#1355</a> - Fix <code>String.find()</code>
returning wrong value when starting index is non-zero.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1367" target="_blank" rel="noopener noreferrer" class="">#1367</a> - Fix
<code>String.replace()</code> returning incorrect results for multi-character search
strings.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1535" target="_blank" rel="noopener noreferrer" class="">#1535</a> - Invalid error <code>field 'w.x.y' destroyed out of the middle of a value, preventing the overall value from being destroyed</code>.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1475" target="_blank" rel="noopener noreferrer" class="">#1475</a> - Assertion failure in
nested loop.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1591" target="_blank" rel="noopener noreferrer" class="">#1591</a> - Assertion failure
when using <code>AnyType</code> struct member.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1503" target="_blank" rel="noopener noreferrer" class="">#1503</a> - Rename the mojo
build of LLDB to <code>mojo-lldb</code>, to prevent name collisions with the system's
LLDB.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1542" target="_blank" rel="noopener noreferrer" class="">#1542</a> - <code>@unroll</code> does not
accept alias as unroll factor.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1443" target="_blank" rel="noopener noreferrer" class="">#1443</a> - Compiler crash on
variadic list of traits.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1604" target="_blank" rel="noopener noreferrer" class="">#1604</a> - Variable of trivial
type not destroyed by transferring ownership.</li>
<li class=""><a href="https://github.com/modular/modular/issues/1341" target="_blank" rel="noopener noreferrer" class="">#1341</a> - Segmentation fault
when passing closures around.</li>
<li class=""><a href="https://github.com/modular/modular/issues/217" target="_blank" rel="noopener noreferrer" class="">#217</a> - Closure state is
stack allocated.</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v0.6.1]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.6.1/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.6.1/"/>
        <updated>2023-12-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[⭐️ New]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-new">⭐️ New<a href="https://mojolang.static.modular-staging.com/releases/v0.6.1/#%EF%B8%8F-new" class="hash-link" aria-label="Direct link to ⭐️ New" title="Direct link to ⭐️ New" translate="no">​</a></h2>
<ul>
<li class="">
<p>The Mojo REPL now provides limited support for the <code>%cd</code> magic command.</p>
<p>This command automatically maintains an internal stack of directories you
visit during the REPL session. Usage:</p>
<ul>
<li class=""><code>%cd 'dir'</code>: change to directory <code>dir</code> and push it on the directory stack.</li>
<li class=""><code>%cd -</code>: pop the directory stack and change to the last visited directory.</li>
</ul>
</li>
<li class="">
<p>Structs decorated with <code>@value</code> now automatically conform to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Movable/"><code>Movable</code></a>
and <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Copyable/"><code>Copyable</code></a> built-in traits.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/"><code>String</code></a> now has new
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#upper"><code>toupper()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#lower"><code>tolower()</code></a> methods
analogous, respectively, to Python's <code>str.toupper()</code> and <code>str.tolower()</code>.</p>
</li>
<li class="">
<p>Added a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/hashlib/hash/hash/"><code>hash()</code></a> built-in function and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/hashlib/hash/Hashable/"><code>Hashable</code></a> trait for types
implementing the <code>__hash__()</code> method. Future releases will add <code>Hashable</code>
support to Standard Library types. In the meantime, the <code>hash</code> module includes
a version of the <code>hash()</code> function that works on arbitrary byte strings. To
generate hashes for <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/simd/SIMD/"><code>SIMD</code></a> types, you
use the internal <code>_hash_simd()</code> function:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">from</span><span class="token plain"> builtin</span><span class="token punctuation">.</span><span class="token builtin" style="color:#b4730e">hash</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">import</span><span class="token plain"> _hash_simd</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">gen_simd_hash</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> vector </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int64</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">hash</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> _hash_simd</span><span class="token punctuation">(</span><span class="token plain">vector</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Several standard library types now conform to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/CollectionElement/"><code>CollectionElement</code></a> trait. These
types include <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/bool/Bool/"><code>Bool</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/string_literal/StringLiteral/"><code>StringLiteral</code></a>,
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>DynamicVector</code></a>, <code>Tensor</code>, <code>TensorShape</code>,
and <code>TensorSpec</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-changed">🦋 Changed<a href="https://mojolang.static.modular-staging.com/releases/v0.6.1/#-changed" class="hash-link" aria-label="Direct link to 🦋 Changed" title="Direct link to 🦋 Changed" translate="no">​</a></h2>
<ul>
<li class="">
<p><code>utils.vector</code> has been moved to a new <code>collections</code> package to make
space for new collections. This means that if you had previous code
that did <code>from utils.vector import DynamicVector</code>, it now needs to
be <code>from collections.vector import DynamicVector</code> due to the move.</p>
</li>
<li class="">
<p>The special destructor method <code>__del__()</code> has been changed to enforce
that it cannot raise an error. Raising destructors are not supported properly
at the moment.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.6.1/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1421" target="_blank" rel="noopener noreferrer" class="">#1421</a> - Fixed a crash when
using Tuples in the REPL.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/222" target="_blank" rel="noopener noreferrer" class="">#222</a> - Generate an error
for obviously self recursive functions.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1408" target="_blank" rel="noopener noreferrer" class="">#1408</a> - Fix overload
resolution when candidates can return generic types.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1413" target="_blank" rel="noopener noreferrer" class="">#1413</a> and
<a href="https://github.com/modular/modular/issues/1395" target="_blank" rel="noopener noreferrer" class="">#1395</a> - Do not crash when
re-declaring a builtin declaration.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1307" target="_blank" rel="noopener noreferrer" class="">#1307</a> - Fix compatibility of
function signatures that only differ in default argument values.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1380" target="_blank" rel="noopener noreferrer" class="">#1380</a> - Fix printing
of empty <code>String</code>.</p>
</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mojo v0.6.0]]></title>
        <id>https://mojolang.static.modular-staging.com/releases/v0.6.0/</id>
        <link href="https://mojolang.static.modular-staging.com/releases/v0.6.0/"/>
        <updated>2023-12-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[🔥 Legendary]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-legendary">🔥 Legendary<a href="https://mojolang.static.modular-staging.com/releases/v0.6.0/#-legendary" class="hash-link" aria-label="Direct link to 🔥 Legendary" title="Direct link to 🔥 Legendary" translate="no">​</a></h2>
<ul>
<li class="">
<p>Traits have arrived!</p>
<p>You can now define a <em>trait</em>, which consists of a required set of method
prototypes. A struct can <em>conform to</em> the trait by implementing these methods.
This lets you write generic functions that work on any structs that conform to
a given trait.</p>
<p>The following section gives a brief overview of traits—see the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/traits/">Mojo Manual</a> and this
<a href="https://modul.ar/traits-blog" target="_blank" rel="noopener noreferrer" class="">traits blog post</a> for more details!</p>
<p>Traits are declared with the <code>trait</code> keyword. The bodies of traits should
contain method signatures declared with <code>...</code> as their bodies. Default
method implementations are not supported yet.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> SomeTrait</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">required_method</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>The trait can be implemented on a struct by inheriting from it.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">SomeStruct</span><span class="token punctuation">(</span><span class="token plain">SomeTrait</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">required_method</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"hello traits"</span><span class="token punctuation">,</span><span class="token plain"> x</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>You can then write a generic functions that accepts any type that conforms to
the trait. You do this by creating a parameterized function with a
trait-typed parameter:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> fun_with_traits</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> SomeTrait</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    x</span><span class="token punctuation">.</span><span class="token plain">required_method</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Which can be invoked with instances of types that conform to the trait:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> thing </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SomeStruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># Infer the parameter `T`!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">fun_with_traits</span><span class="token punctuation">(</span><span class="token plain">thing</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Traits can also inherit from other traits, which simply requires that
implementers of the child trait also conform to all parent traits.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> Parent</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">parent_func</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">trait</span><span class="token plain"> Child</span><span class="token punctuation">(</span><span class="token plain">Parent</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">child_func</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
<p>Then, both child and parent trait methods can be invoked on instances of
the trait <code>Child</code>. As well, an instance of the child trait can be converted to
an instance of the parent trait.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> the_parents</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Parent</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    x</span><span class="token punctuation">.</span><span class="token plain">parent_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> the_children</span><span class="token punctuation">[</span><span class="token plain">T</span><span class="token punctuation">:</span><span class="token plain"> Child</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">:</span><span class="token plain"> T</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    x</span><span class="token punctuation">.</span><span class="token plain">child_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    x</span><span class="token punctuation">.</span><span class="token plain">parent_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token comment" style="color:#a89984"># Upcast `x` from instance of `Child` to `Parent`.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    the_parents</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>For more information, see the <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/traits/">Traits page</a>
in the Mojo Manual.</p>
</li>
<li class="">
<p>A fundamental <code>Destructable</code> trait has been added to the language. This is a
core trait that every trait automatically conforms to. This enables
destruction of generic types and generic collections.</p>
<p><strong>Note:</strong> We're aware that this trait might be better spelled <code>Destructible</code>.
We're planning on removing it in the future and moving its functionality to
<code>AnyType</code> so that any type that doesn't provide its own destructor will have
a default, no-op destructor.</p>
</li>
<li class="">
<p>We've added some traits to the standard library, you can implement these on
your own types:</p>
<ul>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/anytype/AnyType/"><code>Destructable</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Copyable/"><code>Copyable</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/Movable/"><code>Movable</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/str/Stringable/"><code>Stringable</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/int/Intable/"><code>Intable</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/len/Sized/"><code>Sized</code></a></li>
<li class=""><a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/value/CollectionElement/"><code>CollectionElement</code></a></li>
</ul>
</li>
<li class="">
<p>We added built-in <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/len/len/"><code>len()</code></a>, <code>str()</code>, and
<code>int()</code> functions, which work with types that implement the <code>Sized</code>,
<code>Stringable</code>, and <code>Intable</code> traits, respectively.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/list/List/"><code>DynamicVector</code></a> is now a
proper generic collection that can use any type that implements the <code>Movable</code>
and <code>Copyable</code> traits. This means you can now write, for example,
<code>DynamicVector[String]</code>. Also, <code>DynamicVector</code> now invokes its element
destructors upon destruction, so <code>_del_old</code> has been deleted.</p>
</li>
<li class="">
<p><code>print</code> now works on any types that implement <code>Stringable</code> by invoking their
<code>__str__</code> method:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">BoxedInt</span><span class="token punctuation">(</span><span class="token plain">Stringable</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">var</span><span class="token plain"> value</span><span class="token punctuation">:</span><span class="token plain"> Int</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">__str__</span><span class="token punctuation">(</span><span class="token special-vars">self</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">-</span><span class="token operator" style="color:#a89984">&gt;</span><span class="token plain"> String</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">return</span><span class="token plain"> </span><span class="token special-vars">self</span><span class="token punctuation">.</span><span class="token plain">value</span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">BoxedInt</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">11</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"hello traits!"</span><span class="token punctuation">,</span><span class="token plain"> BoxedInt</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">42</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-new">⭐️ New<a href="https://mojolang.static.modular-staging.com/releases/v0.6.0/#%EF%B8%8F-new" class="hash-link" aria-label="Direct link to ⭐️ New" title="Direct link to ⭐️ New" translate="no">​</a></h2>
<ul>
<li class="">
<p>The <a class="" href="https://mojolang.static.modular-staging.com/docs/manual/">Mojo Manual</a> is an all-new, complete Mojo user guide.
It doesn't include <em>everything</em> about Mojo yet, but it includes a lot,
and more than the original programming
manual (now deprecated).</p>
<p>Plus, the entire Mojo Manual and other Mojo docs are now <a href="https://github.com/modular/modular/tree/main/mojo/docs" target="_blank" rel="noopener noreferrer" class="">open-sourced on
GitHub</a>, and we'd love
to accept contributions to help us improve them!</p>
</li>
<li class="">
<p>Mojo now supports partial automatic parameterization: when a function is
declared with an argument of a partially bound type, the unbound parameters of
that type are implicitly added to the function's input parameters. For
example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token decorator annotation punctuation">@value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#b4730e">Fudge</span><span class="token punctuation">[</span><span class="token plain">a</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">7</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token comment" style="color:#a89984"># These function declarations are roughly equivalent:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">eat</span><span class="token punctuation">(</span><span class="token plain">f</span><span class="token punctuation">:</span><span class="token plain"> Fudge</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain">               </span><span class="token comment" style="color:#a89984"># implicitly parameterized</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> eat</span><span class="token punctuation">[</span><span class="token plain">_b</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">f</span><span class="token punctuation">:</span><span class="token plain"> Fudge</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> _b</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># explicitly parameterized</span><br></div></code></pre></div></div>
<p>In the first signature for <code>eat()</code>, the <code>b</code> parameter isn't bound, so it's
<em>implicitly</em> added as an input parameter on the function.</p>
<p>In the second signature for <code>eat()</code>, the author has explicitly defined an
input parameter (<code>_b</code>), which is bound to the second parameter on the argument
type (which happens to be <code>b</code>).</p>
<p>Both functions can be called like this:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">eat</span><span class="token punctuation">(</span><span class="token plain">Fudge</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Mojo infers the value of the <code>b</code> parameter from the argument (in this case,
8).</p>
<p>With the second signature, you can also pass the <code>_b</code> parameter value
explicitly:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">eat</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">Fudge</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">3</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Moreover, Mojo now allows you to explicitly mark parameters as unbound using
the <code>_</code> as syntax meaning "placeholder for an unbound parameter." For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># These function declarations are roughly equivalent:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">eat</span><span class="token punctuation">(</span><span class="token plain">f</span><span class="token punctuation">:</span><span class="token plain"> Fudge</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> _</span><span class="token punctuation">,</span><span class="token plain"> c</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">_</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain">                    </span><span class="token comment" style="color:#a89984"># implicitly parameterized</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">eat</span><span class="token punctuation">(</span><span class="token plain">f</span><span class="token punctuation">:</span><span class="token plain"> Fudge</span><span class="token punctuation">[</span><span class="token plain">c</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">_</span><span class="token punctuation">,</span><span class="token plain"> a</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">_</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain">                </span><span class="token comment" style="color:#a89984"># implicitly parameterized</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> eat</span><span class="token punctuation">[</span><span class="token plain">_b</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">,</span><span class="token plain"> _c</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token plain">f</span><span class="token punctuation">:</span><span class="token plain"> Fudge</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> _b</span><span class="token punctuation">,</span><span class="token plain"> _c</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token plain">  </span><span class="token comment" style="color:#a89984"># explicitly parameterized</span><br></div></code></pre></div></div>
<p>The first two signatures explicitly unbind the <code>b</code> and <code>c</code> parameters.</p>
<p>In the last signature, the <code>_b</code> and <code>_c</code> parameters are explicitly declared by
the author, and bound to the <code>b</code> and <code>c</code> parameters in the argument type.</p>
<p>Any of these signatures can be called like this:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token plain">eat</span><span class="token punctuation">(</span><span class="token plain">Fudge</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">eat</span><span class="token punctuation">(</span><span class="token plain">Fudge</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">5</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">8</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">9</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
<p>Note that the default parameter values of struct parameters are bound, unless
explicitly unbound by the user.</p>
<p>For more information, see the
<a class="" href="https://mojolang.static.modular-staging.com/docs/manual/parameters/#fully-bound-partially-bound-and-unbound-types">Mojo Manual</a>.</p>
</li>
<li class="">
<p>Parametric types can now be partially bound in certain contexts. For example,
a new <code>Scalar</code> type alias has been added defined as:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> Scalar </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SIMD</span><span class="token punctuation">[</span><span class="token plain">size</span><span class="token operator" style="color:#a89984">=</span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><br></div></code></pre></div></div>
<p>Which creates a parametric type alias <code>Scalar</code> with a single parameter of type
<code>DType</code>. Types can also be partially or fully bound in other contexts. For
instance, <code>alias</code> declarations of type values inside functions now work
properly:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">type_aliases</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> T </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> SIMD</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">T</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">float32</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#924f79">1</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">alias</span><span class="token plain"> Partial </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> T</span><span class="token punctuation">[</span><span class="token builtin" style="color:#b4730e">type</span><span class="token operator" style="color:#a89984">=</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">int32</span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">Partial</span><span class="token punctuation">[</span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>__mlir_op</code> feature now supports operations that return multiple results.
To use them, you write the <code>_type</code> field as a <code>Tuple</code> of types. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token comment" style="color:#a89984"># The `ret` variable has type `Tuple[Int, Int]`.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> ret </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">__mlir_op</span><span class="token punctuation">.</span><span class="token plain">`multi_result_op`</span><span class="token punctuation">[</span><span class="token plain">_type</span><span class="token operator" style="color:#a89984">=</span><span class="token punctuation">(</span><span class="token plain">Int</span><span class="token punctuation">,</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Mojo now has the ability to read raw bytes from a file using the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/file/FileHandle/#read_bytes"><code>read_bytes()</code></a> method.
For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">with</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">open</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"file.binary"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"r"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">as</span><span class="token plain"> f</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    data </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> f</span><span class="token punctuation">.</span><span class="token plain">read_bytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>A size argument was added to the
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/file/FileHandle/#read"><code>read()</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/file/FileHandle/#read_bytes"><code>read_bytes()</code></a> methods on
the builtin <code>file.FileHandle</code>. The size argument defaults to -1 and maintains
the previous "read to EOF" behavior when size is negative.</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">with</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">open</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"file.binary"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#477a5b">"r"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#af2528">as</span><span class="token plain"> f</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    data1 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> f</span><span class="token punctuation">.</span><span class="token plain">read_bytes</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">1024</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    data2 </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> f</span><span class="token punctuation">.</span><span class="token plain">read_bytes</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">256</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/"><code>Path</code></a> now has <code>read_bytes()</code> and
<code>read_text()</code> methods to read file contents from a path:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> text_path </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Path</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"file.txt"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> text </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> text_path</span><span class="token punctuation">.</span><span class="token plain">read_text</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> binary_path </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Path</span><span class="token punctuation">(</span><span class="token string" style="color:#477a5b">"file.binary"</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> data </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> binary_path</span><span class="token punctuation">.</span><span class="token plain">read_bytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>Tensor</code> has new <code>save()</code> and <code>load()</code> methods to save and load to file. These
methods preserve shape and datatype information. For example:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> tensor </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Tensor</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">float32</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">tensor</span><span class="token punctuation">.</span><span class="token plain">save</span><span class="token punctuation">(</span><span class="token plain">path</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> tensor_from_file </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> Tensor</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">float32</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">load</span><span class="token punctuation">(</span><span class="token plain">path</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Subscripting added to
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>DTypePointer</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/memory/unsafe_pointer/UnsafePointer/"><code>Pointer</code></a>:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> p </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> DTypePointer</span><span class="token punctuation">[</span><span class="token plain">DType</span><span class="token punctuation">.</span><span class="token plain">float16</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token plain">alloc</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain"></span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> </span><span class="token builtin" style="color:#b4730e">range</span><span class="token punctuation">(</span><span class="token number" style="color:#924f79">4</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    p</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> i</span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">p</span><span class="token punctuation">[</span><span class="token plain">i</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><code>file.FileHandle</code> now has a <code>seek()</code> method.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/"><code>String</code></a> now has an
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#rfind"><code>rfind()</code></a> method
analogous to Python's <code>str.rfind()</code>.</p>
</li>
<li class="">
<p><code>String</code> now has an
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/collections/string/string/String/#split"><code>split()</code></a> method
analogous to Python's <code>str.split()</code>.</p>
</li>
<li class="">
<p><a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/"><code>Path</code></a> now has a
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/pathlib/path/Path/#suffix"><code>suffix()</code></a> method analogous to
Python's <code>pathlib.Path.suffix</code>.</p>
</li>
<li class="">
<p>The Mojo REPL now supports indented expressions, making it a bit easier to
execute expressions copied from an indented block (such as a doc string).</p>
</li>
<li class="">
<p>The Mojo Language Server now implements the Document Symbols request. IDEs use
this to provide support for <strong>Outline View</strong> and <strong>Go to Symbol</strong>. This
addresses <a href="https://github.com/modular/modular/issues/960" target="_blank" rel="noopener noreferrer" class="">Issue #960</a>.</p>
</li>
<li class="">
<p>The Mojo Language Server now shows documentation when code completing modules
or packages in <code>import</code> statements.</p>
</li>
<li class="">
<p>The Mojo Language Server now supports processing code examples, defined as
markdown Mojo code blocks, inside of doc strings. This enables IDE features
while writing examples in API documentation.</p>
</li>
<li class="">
<p>The Mojo Language Server now provides semantic token information, providing
better highlighting for symbols whose semantics are not statically analyzable.</p>
</li>
<li class="">
<p>The Mojo Language Server now classifies doc strings as folding ranges,
making them easier to collapse, reducing vertical space while editing.</p>
</li>
<li class="">
<p>Command line options for the <code>mojo</code> driver that take arguments can now be
written in either of two ways: both <code>--foo FOO</code> and <code>--foo=FOO</code>. Previously,
only the former was valid.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-changed">🦋 Changed<a href="https://mojolang.static.modular-staging.com/releases/v0.6.0/#-changed" class="hash-link" aria-label="Direct link to 🦋 Changed" title="Direct link to 🦋 Changed" translate="no">​</a></h2>
<ul>
<li class="">
<p>Variadic list types
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicList/"><code>VariadicList</code></a> and
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/variadics/VariadicListMem/"><code>VariadicListMem</code></a>
are now iterable. Variadic arguments are automatically projected into one of
these types inside the function body, so var args can be iterated:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">print_ints</span><span class="token punctuation">(</span><span class="token operator" style="color:#a89984">*</span><span class="token plain">nums</span><span class="token punctuation">:</span><span class="token plain"> Int</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">for</span><span class="token plain"> num </span><span class="token keyword" style="color:#af2528">in</span><span class="token plain"> nums</span><span class="token punctuation">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">        </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">num</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">    </span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token builtin" style="color:#b4730e">len</span><span class="token punctuation">(</span><span class="token plain">nums</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The assert functions in the <a class="" href="https://mojolang.static.modular-staging.com/docs/std/testing/testing/"><code>testing</code></a>
package now raise an <code>Error</code> when the assertion fails instead of returning a
<code>Bool</code> for whether the assertion succeeded or not.</p>
</li>
<li class="">
<p>Parameters of <a class="" href="https://mojolang.static.modular-staging.com/docs/std/builtin/type_aliases/"><code>AnyType</code></a> type are no
longer (implicitly) assumed to be register-passable. A new <code>AnyRegType</code> type
is used to represent generic types that are register passable.</p>
</li>
<li class="">
<p>Changing the units in a <a class="" href="https://mojolang.static.modular-staging.com/docs/std/benchmark/benchmark/"><code>benchmark</code></a>
report is now an argument instead of a parameter:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">let</span><span class="token plain"> report </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> benchmark</span><span class="token punctuation">.</span><span class="token plain">run</span><span class="token punctuation">[</span><span class="token plain">timer</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#654735"><span class="token plain">report</span><span class="token punctuation">.</span><span class="token keyword" style="color:#af2528">print</span><span class="token punctuation">(</span><span class="token plain">Unit</span><span class="token punctuation">.</span><span class="token plain">ms</span><span class="token punctuation">)</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Default values on <code>inout</code> arguments are no longer permitted, i.e. the
following will now raise an error:</p>
<div class="language-mojo codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#654735;--prism-background-color:#f2f3f3"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mojo codeBlock_bY9V thin-scrollbar" style="color:#654735;background-color:#f2f3f3"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#654735"><span class="token keyword" style="color:#af2528">fn</span><span class="token plain"> </span><span class="token function" style="color:#72761e">inout_default</span><span class="token punctuation">(</span><span class="token keyword" style="color:#af2528">inout</span><span class="token plain"> x</span><span class="token punctuation">:</span><span class="token plain"> Int </span><span class="token operator" style="color:#a89984">=</span><span class="token plain"> </span><span class="token number" style="color:#924f79">2</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token plain"> </span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>The <code>to_string()</code> function has been removed from
<a class="" href="https://mojolang.static.modular-staging.com/docs/std/python/python_object/PythonObject/"><code>PythonObject</code></a> in favor of
the new <code>__str__()</code> function. This composes better with traits so it can be
used with the generic <code>str()</code> function.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-fixed">🛠️ Fixed<a href="https://mojolang.static.modular-staging.com/releases/v0.6.0/#%EF%B8%8F-fixed" class="hash-link" aria-label="Direct link to 🛠️ Fixed" title="Direct link to 🛠️ Fixed" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://github.com/modular/modular/issues/734" target="_blank" rel="noopener noreferrer" class="">#734</a> - Consumption of struct
works only for types with a <code>__del__</code> method.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/910" target="_blank" rel="noopener noreferrer" class="">#910</a> - Parser crash when
using memory-only generic type as return of function that <code>raise</code>s.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1060" target="_blank" rel="noopener noreferrer" class="">#1060</a> - Mojo happily parses
code that has messed up indentation</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1159" target="_blank" rel="noopener noreferrer" class="">#1159</a> - The language server
doesn't warn about bad return type.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1166" target="_blank" rel="noopener noreferrer" class="">#1166</a> - warning: unreachable
code after return statement with context manager</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1098" target="_blank" rel="noopener noreferrer" class="">#1098</a> - The language server
doesn't highlight properties of PythonObjects correctly.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1153" target="_blank" rel="noopener noreferrer" class="">#1153</a> - The language server
crashes when parsing an invalid multi-nested module import.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1236" target="_blank" rel="noopener noreferrer" class="">#1236</a> - The language server
doesn't show autocomplete in if statements.</p>
</li>
<li class="">
<p><a href="https://github.com/modular/modular/issues/1246" target="_blank" rel="noopener noreferrer" class="">#1246</a> - Warning diagnostics
are transient in the presence of caching.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="known-issue">Known Issue<a href="https://mojolang.static.modular-staging.com/releases/v0.6.0/#known-issue" class="hash-link" aria-label="Direct link to Known Issue" title="Direct link to Known Issue" translate="no">​</a></h2>
<ul>
<li class="">There is an issue affecting Jupyter notebooks that use autotuning and traits.
This issue only manifests on macOS, and the same code runs without issue
outside of the notebooks. This issue affects the <em>Matrix multiplication in
Mojo</em> notebook.</li>
</ul>]]></content>
    </entry>
</feed>