CINXE.COM

class Scalar | Raku Documentation

<!DOCTYPE html> <html lang="en" class="fontawesome-i2svg-active fontawesome-i2svg-complete" style="scroll-padding-top:60px"> <head> <title>class Scalar | Raku Documentation</title> <meta charset="UTF-8" /> <link href="/assets/images/Camelia.ico" rel="icon" type="image/x-icon"/> <link rel="stylesheet" href="/assets/css/Website.css"/> <link rel="stylesheet" href="/assets/css/typegraph-styling.css"/> <link rel="stylesheet" href="/assets/css/typegraph-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/typegraph-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/filtered-toc-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/filtered-toc-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/announce-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/announce-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/all.min.css"/> <link rel="stylesheet" href="/assets/css/listf-styling-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/listf-styling-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/options-search-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/options-search-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/page-styling-main.css"/> <link rel="stylesheet" href="/assets/css/css/page-styling-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/page-styling-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/chyronToggle-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/chyronToggle-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/centreToggle-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/centreToggle-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/tm-styling.css"/> <link rel="stylesheet" href="/assets/css/tm-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/tm-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/rainbow-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/rainbow-light.css" title="light"/> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@10.2.7/dist/css/autoComplete.min.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-light.min.css" title="light" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css" title="dark" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="/assets/scripts/all.min.js"></script><script src="/assets/scripts/filter-script.js"></script><script src="/assets/scripts/tableManager.js"></script><script src="https://cdn.jsdelivr.net/npm/fuzzysort@2.0.4/fuzzysort.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@10.2.7/dist/autoComplete.min.js"></script><script src="/assets/scripts/filtered-toc.js"></script><script src="/assets/scripts/options-search.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/haskell.min.js"></script><script src="/assets/scripts/page-styling.js"></script><script src="/assets/scripts/announcements.js"></script><script src="/assets/scripts/rainbow.js"></script> </head> <body class="has-navbar-fixed-top"> <div id="class_Scalar" class="top-of-page"></div> <nav class="navbar is-fixed-top is-flex-touch" role="navigation" aria-label="main navigation"> <div class="navbar-item" style="margin-left: auto;"> <div class="left-bar-toggle" title="Toggle Table of Contents & Index"> <label class="chyronToggle left"> <input id="navbar-left-toggle" type="checkbox"> <span class="text">Contents</span> </label> </div> </div> <div class="container is-justify-content-space-around"> <div class="navbar-brand"> <div class="navbar-logo"> <a class="navbar-item" href="/"> <img src="/assets/images/camelia-recoloured.png" alt="Raku" width="52.83" height="38"> </a> <span class="navbar-logo-tm">tm</span> </div> <a role="button" class="navbar-burger burger" aria-label="menu" aria-expanded="false" data-target="navMenu"> <span aria-hidden="true"></span> <span aria-hidden="true"></span> <span aria-hidden="true"></span> </a> </div> <div id="navMenu" class="navbar-menu"> <div class="navbar-start"> <a class="navbar-item" href="/introduction" title="Getting started, Tutorials, Migration guides"> Introduction </a> <a class="navbar-item" href="/reference" title="Fundamentals, General reference"> Reference </a> <a class="navbar-item" href="/miscellaneous" title="Programs, Experimental"> Miscellaneous </a> <a class="navbar-item" href="/types" title="The core types (classes) available"> Types </a> <a class="navbar-item" href="/routines" title="Searchable table of routines"> Routines </a> <a class="navbar-item" href="https://raku.org" title="Home page for community"> Raku<sup>®</sup> </a> <a class="navbar-item" href="https://web.libera.chat/#raku" title="IRC live chat"> Chat </a> <div class="navbar-item has-dropdown is-hoverable"> <a class="navbar-link"> More </a> <div class="navbar-dropdown is-right is-rounded"> <hr class="navbar-divider"> <a class="navbar-item js-modal-trigger" data-target="download-ebook"> Download E-Book (epub) </a> <hr class="navbar-divider"> <a class="navbar-item" href="/about"> About </a> <hr class="navbar-divider"> <a class="navbar-item has-text-red" href="https://github.com/raku/doc-website/issues"> Report an issue with this site </a> <hr class="navbar-divider"> <a class="navbar-item" href="https://github.com/raku/doc/issues"> Report an issue with the documentation content </a> <hr class="navbar-divider"> <label class="navbar-item centreToggle" title="Enable/Disable Announcements" style="--switch-width: 18"> <input id="cancelAnnouncements" type="checkbox"> <span class="text">Announcements</span> <span class="on">suppressed</span> <span class="off">allowed</span> </label> </div> </div> </div> <div class="navbar-end navbar-search-wrapper"> <div class="navbar-item"> <div class="field has-addons"> <div class="autoComplete_options"> <input class="control input" id="autoComplete" type="search" dir="ltr" spellcheck=false autocorrect="off" autocomplete="off" autocapitalize="off" placeholder="🔍 Type f to search for ..."> </div> <div class="control" title="Search options"> <a class="button is-primary js-modal-trigger" data-target="options-search-info"> <span class="icon"> <i class="fas fa-cogs"></i> </span> </a> </div> </div> </div> </div> <div id="options-search-info" class="modal"> <div class="modal-background"></div> <div class="modal-content"> <div class="box"> <p>The last search was: <span id="selected-candidate" class="ss-selected"></span></p> <div class="control is-grouped is-grouped-centered options-search-controls"> <label class="centreToggle" title="Include extra information (Alt-E)" style="--switch-width: 10.5"> <input id="options-search-extra" type="checkbox"> <span class="text">Extra info</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>The search response can be shortened by excluding the extra information line (Alt-E)</p> <label class="centreToggle" title="Search engine type Strict/Loose (Alt-L)" style="--switch-width: 10.5"> <input id="options-search-loose" type="checkbox"> <span class="text">Search type</span> <span class="on">loose</span> <span class="off">strict</span> </label> <p> The search engine can perform a strict search (only the characters in the search box) or a loose search (Alt-L)</p> <label class="centreToggle" title="Search in headings (Alt-H)" style="--switch-width: 10.5"> <input id="options-search-headings" type="checkbox"> <span class="text">Headings</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>Search through headings in all web-pages (Alt-H)</p> <label class="centreToggle" title="Search indexed items (Alt-I)" style="--switch-width: 10.5"> <input id="options-search-indexed" type="checkbox"> <span class="text">Indexed</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>Search through all indexed items (Alt-I)</p> <label class="centreToggle" title="Search composite pages (Alt-C)" style="--switch-width: 10.5"> <input id="options-search-composite" type="checkbox"> <span class="text">Composite</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>Search in the names of composite pages, which combine similar information from the main web pages (Alt-C)</p> <label class="centreToggle" title="Search primary sources (Alt-P)" style="--switch-width: 10.5"> <input id="options-search-primary" type="checkbox"> <span class="text">Primary</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>Search through the names of the main web pages (Alt-P)</p> <label class="centreToggle" title="Open in new tab (Alt-Q)" style="--switch-width: 10.5"> <input id="options-search-newtab" type="checkbox"> <span class="text">New tab</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>Once a search candidate has been chosen, it can be opened in a new tab or in the current tab (Alt-Q)</p> <p>If all else fails, an item is added to use the Google search engine on the whole site</p> <button class="button is-warning" id="options-search-reset-defaults">Clear options, reset to defaults</button> <p>Exit this page by pressing &lt;Escape&gt;, or clicking on X or on the background.</p> </div> </div> </div> <button class="modal-close is-large" aria-label="close"></button> </div> </div> <div id="download-ebook" class="modal"> <div class="modal-background"></div> <div class="modal-content"> <div class="box"> <p><a href="/RakuDocumentation.epub" download>RakuDocumentation.epub</a> is a work in progress e-book. It targets the <a href="https://www.w3.org/publishing/epub3/">EPUB v3 specification</a>. It needs testing on a variety of ereaders (some of which may still implicitly expect compliance with EPUB v2). The CSS definitely needs enhancing (especially for code snippets). The Ebook opens in a Calibre reader, which is available on all operating systems.</p> <p>Suggestions are welcome and should be addressed by opening an issue on the Raku/doc-website repository</p> <p>Exit this popup by pressing &lt;Escape&gt;, or clicking on X or on the background.</p> </div> </div> <button class="modal-close is-large" aria-label="close"></button> </div> <div id="announcement-modal" class="modal"> <div class="modal-background"></div> <div class="modal-content"> <div class="box"> <div id="raku-doc-announcement"></div> <p>For more see <a href="/announcements">Announcements page</a>.</p> <p>Exit this popup by pressing &lt;Escape&gt;, or clicking on X or on the background.</p> </div> </div> <button class="modal-close is-large" aria-label="close"></button> </div> </div> </nav> <div class="tile is-ancestor section"> <div class="page-edit"> <a class="button page-edit-button" href="https://github.com/Raku/doc/edit/main/doc/Type/Scalar.rakudoc" title="Edit this page.&#13;Commit: 99c751d5d 2024-05-28"> <span class="icon is-right"> <i class="fas fa-pen-alt is-medium"></i> </span> </a> </div> <div id="left-column" class="tile is-parent is-2 is-hidden"> <div id="left-col-inner"> <div class="tabs" id="tabs"> <ul> <li class="is-active" id="toc-tab"> <a>Table of Contents</a> </li> <li id="index-tab"> <a>Index</a> </li> </ul> </div> <div class="field"> <div class="control has-icons-right"> <input id="toc-filter" class="input" type="text" placeholder="Filter"> <span class="icon is-right has-text-grey"> <i class="fas fa-search is-medium"></i> </span> </div> </div> <div class="raku-sidebar"> <aside id="toc-menu" class="menu"> <ul class="menu-list"> <li><a href="#Atomic_operations_on_Scalar">Atomic operations on Scalar</a></li> <li><a href="#Introspection">Introspection</a></li> <ul> <li><a href="#method_of">method of</a></li> <li><a href="#method_default">method default</a></li> <li><a href="#method_name">method name</a></li> <li><a href="#method_dynamic">method dynamic</a></li> </ul> <li><a href="#Routines">Routines</a></li> <ul> <li><a href="#sub_atomic-assign">sub atomic-assign</a></li> <li><a href="#sub_atomic-fetch">sub atomic-fetch</a></li> <li><a href="#sub_cas">sub cas</a></li> </ul> <li><a href="#Operators">Operators</a></li> <ul> <li><a href="#infix_⚛=">infix ⚛=</a></li> <li><a href="#prefix_⚛">prefix ⚛</a></li> </ul> </aside> <aside id="index-menu" class="menu is-hidden"> <ul class="menu-list"> <li>Syntax<ul> <li><a href="#index-entry-\_(sigilless_scalar)">\ </a></li> </ul></li> </ul> </aside> </div> </div> </div> <div id="main-column" class="tile is-parent" style="overflow-x: hidden;"> <div id="main-col-inner"> <section class="raku page-header"> <div class="container px-4"> <div class="raku page-title has-text-centered"> class Scalar </div> <div class="raku page-subtitle has-text-centered"> <p>A mostly transparent container used for indirections</p> </div> </div> </section> <section class="raku page-content"><div class="container px-4"><div class="columns one-col"> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">class</span> <span class="highlite-TYPE">Scalar</span> {}</pre> </div> </div> <p>A <code>Scalar</code> is an internal indirection, that is, a way to refer indirectly to a value, which is, for most purposes, invisible during ordinary use of Raku. It is the default container type associated with the <code>$</code> sigil. A literal <code>Scalar</code> may be placed around any literal by enclosing the value in <code>$(…)</code>. This notation will appear in the output of a <code>.raku</code> method in certain places where it is important to note the presence of <code>Scalar</code>s.</p><p>When a value is assigned to a <code>$</code>-sigiled variable, the variable will actually bind to a <code>Scalar</code>, which in turn will bind to the value. When a <code>Scalar</code> is assigned to a <code>$</code>-sigiled variable, the value bound to by that <code>Scalar</code> will be bound to the <code>Scalar</code> which that variable was bound to (a new one will be created if necessary.)</p><p>In addition, <code>Scalar</code>s delegate all method calls to the value which they contain. As such, <code>Scalar</code>s are for the most part invisible. There is, however, one important place where <code>Scalar</code>s have a visible impact: a <code>Scalar</code> container will shield its content from <a href="/language/subscripts#index-entry-flattening_">flattening</a> by most Raku core list operations.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-OPERATOR">|</span>(1,2<span class="highlite-OPERATOR">,</span>$(3,4)); <span class="highlite-COMMENT"># OUTPUT: «12(3 4)␤» </span></pre> </div> </div> <p>These <code>Scalar</code> containers can also be created on the fly by assigning to an <a href="/language/variables#The_$_variable">anonymous scalar variable</a>:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-OPERATOR">|</span>(1,2<span class="highlite-OPERATOR">,</span> $ <span class="highlite-OPERATOR">=</span> (3,4)); <span class="highlite-COMMENT"># OUTPUT: «12(3 4)␤» </span></pre> </div> </div> <p>A <code>$</code>-sigiled variable may be bound directly to a value with no intermediate <code>Scalar</code> using the binding operator <code>:=</code>. You can tell if this has been done by examining the output of the introspective pseudo-method <code>.VAR</code>:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$a</span> <span class="highlite-OPERATOR">=</span> 1; <span class="highlite-NAME_SCALAR">$a</span>.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤» </span><span class="highlite-NAME_SCALAR">$a</span>.<span class="highlite-ROUTINE">VAR</span>.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Scalar␤» </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$b</span> <span class="highlite-OPERATOR">:=</span> 1; <span class="highlite-NAME_SCALAR">$b</span>.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤» </span><span class="highlite-NAME_SCALAR">$b</span>.<span class="highlite-ROUTINE">VAR</span>.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤»</span></pre> </div> </div> <p>This same thing happens when values are assigned to an element of an <a href="/type/Array"><code>Array</code></a>, however, <a href="/type/List"><code>List</code></a>s directly contain their values:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_ARRAY">@a</span> <span class="highlite-OPERATOR">=</span> 1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3; <span class="highlite-NAME_ARRAY">@a</span>[0].^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤» </span><span class="highlite-NAME_ARRAY">@a</span>[0].<span class="highlite-ROUTINE">VAR</span>.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Scalar␤» </span>[1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3][0].^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤» </span>[1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3][0].<span class="highlite-ROUTINE">VAR</span>.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Scalar␤» </span>(1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3)[0].^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤» </span>(1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3)[0].<span class="highlite-ROUTINE">VAR</span>.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤»</span></pre> </div> </div> <p>Array elements may be bound directly to values using <code>:=</code> as well; however, this is discouraged as it may lead to confusion. Doing so will break exact round-tripping of <code>.raku</code> output – since <a href="/type/Array"><code>Array</code></a>s are assumed to place <code>Scalar</code>s around each element, <code>Scalar</code>s are not denoted with <code>$</code> in the output of <code>Array.raku</code>.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights">[1<span class="highlite-OPERATOR">,</span> $(2<span class="highlite-OPERATOR">,</span> 3)].<span class="highlite-ROUTINE">raku</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «[1, (2, 3)]␤» </span>(1<span class="highlite-OPERATOR">,</span> $(2<span class="highlite-OPERATOR">,</span> 3)).<span class="highlite-ROUTINE">raku</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «(1, $(2, 3))␤»</span></pre> </div> </div> <p>Binding a <code>Scalar</code> to a <code>$</code>-sigiled variable replaces the existing <code>Scalar</code> in that variable, if any, with the given <code>Scalar</code>. That means more than one variable may refer to the same <code>Scalar</code>. Because the <code>Scalar</code> may be mutated, this makes it possible to alter the value of both variables by altering only one of them:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$a</span> <span class="highlite-OPERATOR">=</span> 1; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$b</span> <span class="highlite-OPERATOR">:=</span> <span class="highlite-NAME_SCALAR">$a</span>; <span class="highlite-NAME_SCALAR">$b</span> <span class="highlite-OPERATOR">=</span> 2; <span class="highlite-NAME_SCALAR">$a</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «2␤»</span></pre> </div> </div> <p><a name="index-entry-\_(sigilless_scalar)" class="index-entry"></a> Raku allows the use of constants with a <a href="https://en.wikipedia.org/wiki/Static_single_assignment_form">static single assignment (SSA)</a> style which bind directly to their value with no intervening <code>Scalar</code> container, even when assignment (<code>=</code>) is used. They may be forced to use a <code>Scalar</code> by assigning a <code>$</code>-sigiled variable to them, at which point, they behave entirely like <code>$</code>-sigiled variables.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> \c <span class="highlite-OPERATOR">=</span> 1; c.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤» </span>c.<span class="highlite-ROUTINE">VAR</span>.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤» </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$a</span> <span class="highlite-OPERATOR">=</span> 1; <span class="highlite-KEYWORD">my</span> \<span class="highlite-ROUTINE">d</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$a</span>; <span class="highlite-COMMENT"># just &quot;my \d = $ = 1&quot; works, too </span><span class="highlite-ROUTINE">d</span>.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤» </span><span class="highlite-ROUTINE">d</span>.<span class="highlite-ROUTINE">VAR</span>.^<span class="highlite-ROUTINE">name</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Scalar␤» </span><span class="highlite-ROUTINE">d</span> <span class="highlite-OPERATOR">=</span> 2; <span class="highlite-COMMENT"># ok </span>c <span class="highlite-OPERATOR">=</span> 2; <span class="highlite-COMMENT"># fails </span><span class="highlite-KEYWORD">CATCH</span> { <span class="highlite-KEYWORD">default</span> { <span class="highlite-ROUTINE">put</span> .^<span class="highlite-ROUTINE">name</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">: </span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> .<span class="highlite-TYPE">Str</span> } }; <span class="highlite-COMMENT"># OUTPUT: «X::Assignment::RO: Cannot modify an immutable Int␤»</span></pre> </div> </div> <h1 id="Atomic_operations_on_Scalar" class="raku-h1"><a href="#class_Scalar" title="go to top of document">Atomic operations on Scalar<a class="raku-anchor" title="direct link" href="#Atomic_operations_on_Scalar">§</a></a></h1> <p>A <code>Scalar</code> can have its value changed using a hardware-supported atomic compare and swap operation. This is useful when implementing lock free data structures and algorithms. It may also be fetched and assigned to in an &quot;atomic&quot; fashion, which ensures appropriate memory barriering and prevents unwanted optimizations of memory accesses.</p><p>A <code>Scalar</code> that will be used with an atomic operation should <strong>always</strong> be explicitly initialized with a value before any atomic operations are performed upon it. This is to avoid races with lazy allocation and auto-vivification. For example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">cas</span>(<span class="highlite-NAME_ARRAY">@a</span>[5]<span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$expected</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$value</span>) </pre> </div> </div> <p>Will work in principle since an <a href="/type/Array"><code>Array</code></a> consists of <code>Scalar</code> containers. However, the container is only bound into the array upon initial assignment. Therefore, there would be a race to do that binding. The <code>Scalar</code> atomic operations will never check for or do any such auto-vivification, so as to make such bugs much more evident (rather than only observed under stress).</p> <h1 id="Introspection" class="raku-h1"><a href="#class_Scalar" title="go to top of document">Introspection<a class="raku-anchor" title="direct link" href="#Introspection">§</a></a></h1> <h2 id="method_of" class="raku-h2"><a href="#class_Scalar" title="go to top of document">method of<a class="raku-anchor" title="direct link" href="#method_of">§</a></a></h2> <!-- defnmark method_of 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-KEYWORD">of</span>(Scalar:D: <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Mu</span>)</pre> </div> </div> <p>Returns the type constraint of the container.</p><p>Example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-TYPE">Cool</span> <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">=</span> 42; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$x</span>.<span class="highlite-ROUTINE">VAR</span>.<span class="highlite-KEYWORD">of</span>; <span class="highlite-COMMENT"># OUTPUT: «(Cool)␤»</span></pre> </div> </div> <h2 id="method_default" class="raku-h2"><a href="#class_Scalar" title="go to top of document">method default<a class="raku-anchor" title="direct link" href="#method_default">§</a></a></h2> <!-- defnmark method_default 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-KEYWORD">default</span>(Scalar:D: <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Str</span>)</pre> </div> </div> <p>Returns the default value associated with the container.</p><p>Example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">default</span>(666) <span class="highlite-OPERATOR">=</span> 42; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$x</span>.<span class="highlite-ROUTINE">VAR</span>.<span class="highlite-KEYWORD">default</span>; <span class="highlite-COMMENT"># OUTPUT: «666␤»</span></pre> </div> </div> <h2 id="method_name" class="raku-h2"><a href="#class_Scalar" title="go to top of document">method name<a class="raku-anchor" title="direct link" href="#method_name">§</a></a></h2> <!-- defnmark method_name 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">name</span>(Scalar:D: <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Str</span>)</pre> </div> </div> <p>Returns the name associated with the container.</p><p>Example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">=</span> 42; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$x</span>.<span class="highlite-ROUTINE">VAR</span>.<span class="highlite-ROUTINE">name</span>; <span class="highlite-COMMENT"># OUTPUT: «$x␤»</span></pre> </div> </div> <h2 id="method_dynamic" class="raku-h2"><a href="#class_Scalar" title="go to top of document">method dynamic<a class="raku-anchor" title="direct link" href="#method_dynamic">§</a></a></h2> <!-- defnmark method_dynamic 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-KEYWORD">dynamic</span>(Scalar:D: <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Bool</span>)</pre> </div> </div> <p>It will return <code>False</code> for scalars.</p><p>Example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$*FOO</span> <span class="highlite-OPERATOR">=</span> 42; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$*FOO</span>.<span class="highlite-ROUTINE">VAR</span>.<span class="highlite-KEYWORD">dynamic</span>; <span class="highlite-COMMENT"># OUTPUT: «True␤»</span></pre> </div> </div> <p>Note that you have to use the <code>VAR</code> method in order to get that information.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$s</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">dynamic</span> <span class="highlite-OPERATOR">=</span> [1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3]; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$s</span>.<span class="highlite-KEYWORD">dynamic</span>; <span class="highlite-COMMENT"># OUTPUT: «False␤» (wrong, don't do this) </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$s</span>.<span class="highlite-ROUTINE">VAR</span>.<span class="highlite-KEYWORD">dynamic</span>; <span class="highlite-COMMENT"># OUTPUT: «True␤» (correct approach)</span></pre> </div> </div> <h1 id="Routines" class="raku-h1"><a href="#class_Scalar" title="go to top of document">Routines<a class="raku-anchor" title="direct link" href="#Routines">§</a></a></h1> <h2 id="sub_atomic-assign" class="raku-h2"><a href="#class_Scalar" title="go to top of document">sub atomic-assign<a class="raku-anchor" title="direct link" href="#sub_atomic-assign">§</a></a></h2> <!-- defnmark sub_atomic-assign 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">atomic-assign</span>(<span class="highlite-NAME_SCALAR">$target</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">rw</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$value</span>)</pre> </div> </div> <p>Performs an atomic assignment of <code>$value</code> into the <code>Scalar</code> <code>$target</code>. The <code>atomic-assign</code> routine ensures that any required barriers are performed such that the changed value will be &quot;published&quot; to other threads.</p> <h2 id="sub_atomic-fetch" class="raku-h2"><a href="#class_Scalar" title="go to top of document">sub atomic-fetch<a class="raku-anchor" title="direct link" href="#sub_atomic-fetch">§</a></a></h2> <!-- defnmark sub_atomic-fetch 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">atomic-fetch</span>(<span class="highlite-NAME_SCALAR">$target</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">rw</span>)</pre> </div> </div> <p>Performs an atomic read of the value in the <code>Scalar</code> <code>$target</code> and returns the read value. Using this routine instead of simply using the variable ensures that the latest update to the variable from other threads will be seen, both by doing any required hardware barriers and also preventing the compiler from lifting reads. For example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$started</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">False</span>; <span class="highlite-KEYWORD">start</span> { <span class="highlite-ROUTINE">atomic-assign</span>(<span class="highlite-NAME_SCALAR">$started</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">True</span>) } <span class="highlite-KEYWORD">until</span> <span class="highlite-ROUTINE">atomic-fetch</span>(<span class="highlite-NAME_SCALAR">$started</span>) { }</pre> </div> </div> <p>Is certain to terminate, while in:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$started</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">False</span>; <span class="highlite-KEYWORD">start</span> { <span class="highlite-ROUTINE">atomic-assign</span>(<span class="highlite-NAME_SCALAR">$started</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">True</span>) } <span class="highlite-KEYWORD">until</span> <span class="highlite-NAME_SCALAR">$started</span> { }</pre> </div> </div> <p>It would be legal for a compiler to observe that <code>$started</code> is not updated in the loop, and so lift the read out of the loop, thus causing the program to never terminate.</p> <h2 id="sub_cas" class="raku-h2"><a href="#class_Scalar" title="go to top of document">sub cas<a class="raku-anchor" title="direct link" href="#sub_cas">§</a></a></h2> <!-- defnmark sub_cas 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">cas</span>(<span class="highlite-TYPE">Mu</span> <span class="highlite-NAME_SCALAR">$target</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">rw</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Mu</span> \<span class="highlite-ROUTINE">expected</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Mu</span> \<span class="highlite-ROUTINE">value</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">cas</span>(<span class="highlite-TYPE">Mu</span> <span class="highlite-NAME_SCALAR">$target</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">rw</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_CODE">&amp;operation</span>)</pre> </div> </div> <p>Performs an atomic compare and swap of the value in the <code>Scalar</code> <code>$target</code>. The first form has semantics like:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$seen</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$target</span>; <span class="highlite-KEYWORD">if</span> <span class="highlite-NAME_SCALAR">$seen</span>&lt;<span class="highlite-OPERATOR">&gt;</span> <span class="highlite-OPERATOR">=:=</span> <span class="highlite-NAME_SCALAR">$expected</span>&lt;<span class="highlite-OPERATOR">&gt;</span> { <span class="highlite-NAME_SCALAR">$target</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$value</span>; } <span class="highlite-KEYWORD">return</span> <span class="highlite-NAME_SCALAR">$seen</span>; </pre> </div> </div> <p>Except it is performed as a single hardware-supported atomic instruction, as if all memory access to <code>$target</code> were blocked while it took place. Therefore it is safe to attempt the operation from multiple threads without any other synchronization. Since it is a reference comparison, this operation is usually not sensible on value types.</p><p>For example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">constant</span> NOT_STARTED <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">Any</span>.<span class="highlite-ROUTINE">new</span>; <span class="highlite-KEYWORD">constant</span> STARTED <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">Any</span>.<span class="highlite-ROUTINE">new</span>; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$master</span> <span class="highlite-OPERATOR">=</span> NOT_STARTED; <span class="highlite-ROUTINE">await</span> <span class="highlite-KEYWORD">start</span> { <span class="highlite-KEYWORD">if</span> <span class="highlite-ROUTINE">cas</span>(<span class="highlite-NAME_SCALAR">$master</span><span class="highlite-OPERATOR">,</span> NOT_STARTED<span class="highlite-OPERATOR">,</span> STARTED) <span class="highlite-OPERATOR">===</span> NOT_STARTED { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">Master!</span><span class="highlite-STRING_DELIMITER">&quot;</span> } } <span class="highlite-OPERATOR">xx</span> 4</pre> </div> </div> <p>Will reliably only ever print <code>Master!</code> one time, as only one of the threads will be successful in changing the <code>Scalar</code> from <code>NOT_STARTED</code> to <code>STARTED</code>.</p><p>The second form, taking a code object, will first do an atomic fetch of the current value and invoke the code object with it. It will then try to do an atomic compare and swap of the target, using the value passed to the code object as <code>expected</code> and the result of the code object as <code>value</code>. If this fails, it will read the latest value, and retry, until a CAS operation succeeds.</p><p>Therefore, an item could be added to the head of a linked list in a lock free manner as follows:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">class</span> Node { <span class="highlite-KEYWORD">has</span> <span class="highlite-NAME_SCALAR">$.value</span>; <span class="highlite-KEYWORD">has</span> Node <span class="highlite-NAME_SCALAR">$.next</span>; } <span class="highlite-KEYWORD">my</span> Node <span class="highlite-NAME_SCALAR">$head</span> <span class="highlite-OPERATOR">=</span> Node; <span class="highlite-ROUTINE">await</span> <span class="highlite-KEYWORD">start</span> { <span class="highlite-KEYWORD">for</span> ^1000 <span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-NAME_SCALAR">$value</span> { <span class="highlite-ROUTINE">cas</span> <span class="highlite-NAME_SCALAR">$head</span><span class="highlite-OPERATOR">,</span> <span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-NAME_SCALAR">$next</span> { Node.<span class="highlite-ROUTINE">new</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$value</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$next</span>) } } } <span class="highlite-OPERATOR">xx</span> 4;</pre> </div> </div> <p>This will reliably build up a linked list of 4000 items, with 4 nodes with each value ranging from 0 up to 999.</p><p><strong>Note</strong>: Before Rakudo version 2020.12, <code>$target</code>, <code>expected</code> and <code>value</code> had an <a href="/type/Any"><code>Any</code></a> type constraint.</p> <h1 id="Operators" class="raku-h1"><a href="#class_Scalar" title="go to top of document">Operators<a class="raku-anchor" title="direct link" href="#Operators">§</a></a></h1> <h2 id="infix_⚛=" class="raku-h2"><a href="#class_Scalar" title="go to top of document">infix ⚛=<a class="raku-anchor" title="direct link" href="#infix_⚛=">§</a></a></h2> <!-- defnmark infix_⚛= 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> infix:<span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">⚛=</span><span class="highlite-STRING_DELIMITER">&gt;</span>(<span class="highlite-NAME_SCALAR">$target</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">rw</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$value</span>)</pre> </div> </div> <p>Performs an atomic assignment of <code>$value</code> into the <code>Scalar</code> <code>$target</code>. The <code>⚛=</code> operator ensures that any required barriers are performed such that the changed value will be &quot;published&quot; to other threads.</p> <h2 id="prefix_⚛" class="raku-h2"><a href="#class_Scalar" title="go to top of document">prefix ⚛<a class="raku-anchor" title="direct link" href="#prefix_⚛">§</a></a></h2> <!-- defnmark prefix_⚛ 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> prefix:<span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">⚛</span><span class="highlite-STRING_DELIMITER">&gt;</span>(<span class="highlite-NAME_SCALAR">$target</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">rw</span>)</pre> </div> </div> <p>Performs an atomic read of the value in the <code>Scalar</code> <code>$target</code> and returns the read value. Using this operator instead of simply using the variable ensures that the latest update to the variable from other threads will be seen, both by doing any required hardware barriers and also preventing the compiler from lifting reads. For example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$started</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">False</span>; <span class="highlite-KEYWORD">start</span> { <span class="highlite-NAME_SCALAR">$started</span> ⚛<span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">True</span> } <span class="highlite-KEYWORD">until</span> ⚛<span class="highlite-NAME_SCALAR">$started</span> { }</pre> </div> </div> <p>Is certain to terminate, while in:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$started</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">False</span>; <span class="highlite-KEYWORD">start</span> { <span class="highlite-NAME_SCALAR">$started</span> ⚛<span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">True</span> } <span class="highlite-KEYWORD">until</span> <span class="highlite-NAME_SCALAR">$started</span> { }</pre> </div> </div> <p>It would be legal for a compiler to observe that <code>$started</code> is not updated in the loop, and so lift the read out of the loop, thus causing the program to never terminate.</p> <h1 id="typegraphrelations" class="raku-h1"><a href="#" title="go to top of document">Typegraph<a class="raku-anchor" title="direct link" href="#typegraphrelations">§</a></a></h1> <figure class="typegraph" > <figcaption>Type relations for <code>Scalar</code></figcaption> <svg width="85pt" height="188pt" viewBox="0.00 0.00 84.69 188.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 184)"> <title>raku&#45;type&#45;graph</title> <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-184 80.69,-184 80.69,4 -4,4"/> <!-- Scalar --> <g id="node1" class="node"> <title>Scalar</title> <g id="a_node1"><a xlink:href="/type/Scalar" xlink:title="Scalar"> <ellipse fill="none" stroke="#000000" cx="38.35" cy="-18" rx="38.19" ry="18"/> <text text-anchor="middle" x="38.35" y="-14.3" font-family="FreeSans" font-size="14.00" fill="#000000">Scalar</text> </a> </g> </g> <!-- Any --> <g id="node3" class="node"> <title>Any</title> <g id="a_node3"><a xlink:href="/type/Any" xlink:title="Any"> <ellipse fill="none" stroke="#000000" cx="38.35" cy="-90" rx="28.7" ry="18"/> <text text-anchor="middle" x="38.35" y="-86.3" font-family="FreeSans" font-size="14.00" fill="#000000">Any</text> </a> </g> </g> <!-- Scalar&#45;&gt;Any --> <g id="edge1" class="edge"> <title>Scalar&#45;&gt;Any</title> <path fill="none" stroke="#000000" d="M38.35,-36.3C38.35,-44.02 38.35,-53.29 38.35,-61.89"/> <polygon fill="#000000" stroke="#000000" points="34.85,-61.9 38.35,-71.9 41.85,-61.9 34.85,-61.9"/> </g> <!-- Mu --> <g id="node2" class="node"> <title>Mu</title> <g id="a_node2"><a xlink:href="/type/Mu" xlink:title="Mu"> <ellipse fill="none" stroke="#000000" cx="38.35" cy="-162" rx="27" ry="18"/> <text text-anchor="middle" x="38.35" y="-158.3" font-family="FreeSans" font-size="14.00" fill="#000000">Mu</text> </a> </g> </g> <!-- Any&#45;&gt;Mu --> <g id="edge2" class="edge"> <title>Any&#45;&gt;Mu</title> <path fill="none" stroke="#000000" d="M38.35,-108.3C38.35,-116.02 38.35,-125.29 38.35,-133.89"/> <polygon fill="#000000" stroke="#000000" points="34.85,-133.9 38.35,-143.9 41.85,-133.9 34.85,-133.9"/> </g> </g> </svg> <p class="fallback"> <a rel="alternate" href="/assets/typegraphs/Scalar.svg"> Expand chart above </a></p> </figure> </div></div></section> </div> </div> </div> <footer class="footer main-footer"> <div class="container px-4"> <nav class="level"> <div class="level-left"> <div class="level-item"> <a href="/about">About</a> </div> <div class="level-item"> <a id="toggle-theme">Toggle theme</a> </div> <div class="level-item" title="99c751d5d 2024-05-28"> <a>Commit</a> </div> </div> <div class="level-right"> <div class="level-item"> <a href="/license">License</a> </div> </div> </nav> </div> </footer> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10