CINXE.COM
class Nil | Raku Documentation
<!DOCTYPE html> <html lang="en" class="fontawesome-i2svg-active fontawesome-i2svg-complete" style="scroll-padding-top:60px"> <head> <title>class Nil | 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_Nil" 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 <Escape>, 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 <Escape>, 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 <Escape>, 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/Nil.rakudoc" title="Edit this page. Commit: fc2dc4a42 2024-05-19"> <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="#Methods">Methods</a></li> <ul> <li><a href="#method_append">method append</a></li> <li><a href="#method_gist">method gist</a></li> <li><a href="#method_Str">method Str</a></li> <li><a href="#method_new">method new</a></li> <li><a href="#method_prepend">method prepend</a></li> <li><a href="#method_push">method push</a></li> <li><a href="#method_unshift">method unshift</a></li> <li><a href="#method_ords">method ords</a></li> <li><a href="#method_chrs">method chrs</a></li> <li><a href="#method_FALLBACK">method FALLBACK</a></li> <li><a href="#method_Numeric">method Numeric</a></li> </ul> </aside> <aside id="index-menu" class="menu is-hidden"> <ul class="menu-list"> <li>Language<ul> <li><a href="#index-entry-Nil_assignment">Nil assignment</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 Nil </div> <div class="raku page-subtitle has-text-centered"> <p>Absence of a value or a benign failure</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">Nil</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-TYPE">Cool</span> { }</pre> </div> </div> <p>The value <code>Nil</code> may be used to fill a spot where a value would normally go, and in so doing, explicitly indicate that no value is present. It may also be used as a cheaper and less explosive alternative to a <a href="/type/Failure"><code>Failure</code></a>. (In fact, class <a href="/type/Failure"><code>Failure</code></a> is derived from <code>Nil</code>, so smartmatching <code>Nil</code> will also match <a href="/type/Failure"><code>Failure</code></a>.)</p><p>The class <code>Nil</code> is the same exact thing as its only possible value, <code>Nil</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-ROUTINE">say</span> <span class="highlite-TYPE">Nil</span> <span class="highlite-OPERATOR">===</span> <span class="highlite-TYPE">Nil</span>.<span class="highlite-ROUTINE">new</span>; <span class="highlite-COMMENT"># OUTPUT: «True»</span></pre> </div> </div> <p>Along with <a href="/type/Failure"><code>Failure</code></a>, <code>Nil</code> and its subclasses may always be returned from a routine even when the routine specifies a particular return type. It may also be returned regardless of the definedness of the return type, however, <code>Nil</code> is considered undefined for all other purposes.</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">sub</span> a( <span class="highlite-KEYWORD">--></span> Int:D ) { <span class="highlite-KEYWORD">return</span> <span class="highlite-TYPE">Nil</span> } a().<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Nil»</span></pre> </div> </div> <p><code>Nil</code> is what is returned from empty routines or closure, or routines that use a bare <code>return</code> statement.</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">sub</span> a { }; a().<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Nil» </span><span class="highlite-KEYWORD">sub</span> b { <span class="highlite-KEYWORD">return</span> }; b().<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Nil» </span><span class="highlite-ROUTINE">say</span> (<span class="highlite-KEYWORD">if</span> 1 { }); <span class="highlite-COMMENT"># OUTPUT: «Nil» </span>{ ; }().<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «Nil» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">EVAL</span> <span class="highlite-STRING_DELIMITER">"</span><span class="highlite-STRING_DELIMITER">"</span>; <span class="highlite-COMMENT"># OUTPUT: «Nil»</span></pre> </div> </div> <p>In a list, <code>Nil</code> takes the space of one value. Iterating <code>Nil</code> behaves like iteration of any non-iterable value, producing a sequence of one <code>Nil</code>. (When you need the other meaning, the special value <a href="/type/Slip#constant_Empty">Empty</a> is available to take no spaces when inserted into list, and to return no values when iterated.)</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> <span class="highlite-TYPE">Nil</span><span class="highlite-OPERATOR">,</span> 3).<span class="highlite-ROUTINE">elems</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «3» </span>(<span class="highlite-KEYWORD">for</span> <span class="highlite-TYPE">Nil</span> { <span class="highlite-NAME_SCALAR">$_</span> }).<span class="highlite-ROUTINE">raku</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «(Nil,)»</span></pre> </div> </div> <p>Any method call on <code>Nil</code> of a method that does not exist, and consequently, any subscripting operation, will succeed and return <code>Nil</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-ROUTINE">say</span> <span class="highlite-TYPE">Nil</span>.ITotallyJustMadeThisUp; <span class="highlite-COMMENT"># OUTPUT: «Nil» </span><span class="highlite-ROUTINE">say</span> (<span class="highlite-TYPE">Nil</span>)[100]; <span class="highlite-COMMENT"># OUTPUT: «Nil» </span><span class="highlite-ROUTINE">say</span> (<span class="highlite-TYPE">Nil</span>){100}; <span class="highlite-COMMENT"># OUTPUT: «Nil»</span></pre> </div> </div> <p><a name="index-entry-Nil_assignment" class="index-entry"></a> When assigned to a <a href="/language/containers">container</a>, the <code>Nil</code> value (but not any subclass of <code>Nil</code>) will attempt to revert the container to its default value; if no such default is declared, Raku assumes <a href="/type/Any"><code>Any</code></a>.</p><p>Since a hash assignment expects two elements, use <code>Empty</code> not <code>Nil</code>, e.g.</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_HASH">%h</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">b</span><span class="highlite-STRING_DELIMITER">'</span> <span class="highlite-OPERATOR">Z</span>=<span class="highlite-OPERATOR">></span> 1.<span class="highlite-OPERATOR">.*</span>; <span class="highlite-COMMENT"># stuff happens </span><span class="highlite-NAME_HASH">%h</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">Empty</span>; <span class="highlite-COMMENT"># %h = Nil will generate an error</span></pre> </div> </div> <p>However, if the container type is constrained with <code>:D</code>, assigning <code>Nil</code> to it will immediately throw an exception. (In contrast, an instantiated <a href="/type/Failure"><code>Failure</code></a> matches <code>:D</code> because it's a definite value, but will fail to match the actual nominal type unless it happens to be a parent class of <a href="/type/Failure"><code>Failure</code></a>.) Native types can not have default values nor hold a type object. Assigning <code>Nil</code> to a native type container will fail with a runtime error.</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">Int</span> <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">=</span> 42; <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">Nil</span>; <span class="highlite-NAME_SCALAR">$x</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «(Int)» </span> <span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">f</span>( <span class="highlite-KEYWORD">--></span> Int:D ){ <span class="highlite-TYPE">Nil</span> }; <span class="highlite-COMMENT"># this definedness constraint is ignored </span><span class="highlite-KEYWORD">my</span> Int:D <span class="highlite-NAME_SCALAR">$i</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-ROUTINE">f</span>; <span class="highlite-COMMENT"># this definedness constraint is not ignored, so throws </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::TypeCheck::Assignment: Type check failed in assignment to $y; expected Int but got Any (Any)» </span> <span class="highlite-KEYWORD">sub</span> g( <span class="highlite-KEYWORD">--></span> Int:D ){ <span class="highlite-ROUTINE">fail</span> <span class="highlite-STRING_DELIMITER">"</span><span class="highlite-STRING">oops</span><span class="highlite-STRING_DELIMITER">"</span> }; <span class="highlite-COMMENT"># this definedness constraint is ignored </span><span class="highlite-KEYWORD">my</span> Any:D <span class="highlite-NAME_SCALAR">$h</span> <span class="highlite-OPERATOR">=</span> g; <span class="highlite-COMMENT"># failure object matches Any:D, so is assigned</span></pre> </div> </div> <p>but</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> Int:D <span class="highlite-NAME_SCALAR">$j</span> <span class="highlite-OPERATOR">=</span> g; <span class="highlite-COMMENT"># It will throw both exceptions: </span><span class="highlite-COMMENT"># Earlier failure: </span><span class="highlite-COMMENT"># oops </span><span class="highlite-COMMENT"># in sub g at <unknown file> line 1 </span><span class="highlite-COMMENT"># in block <unit> at <unknown file> line 1 </span><span class="highlite-COMMENT"># </span><span class="highlite-COMMENT"># Final error: </span><span class="highlite-COMMENT"># Type check failed in assignment to $j; expected Int:D but got Failure (Failure.new(exception...) </span><span class="highlite-COMMENT"># in block <unit> at <unknown file> line 1 </span></pre> </div> </div> <p>Because an untyped variable is type <a href="/type/Any"><code>Any</code></a>, assigning a <code>Nil</code> to one will result in an <a href="/type/Any">(Any)</a> type object.</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> <span class="highlite-TYPE">Nil</span>; <span class="highlite-NAME_SCALAR">$x</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «(Any)» </span><span class="highlite-KEYWORD">my</span> <span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$x</span>; <span class="highlite-COMMENT"># will throw an exception </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::TypeCheck::Assignment: Type check failed in assignment to $y; expected Int but got Any (Any)»</span></pre> </div> </div> <p>If you are looking for a variable which transforms objects into type objects when said variable appears on the right-hand side, you can type the container as <code>Nil</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-TYPE">Nil</span> <span class="highlite-NAME_SCALAR">$x</span>; <span class="highlite-KEYWORD">my</span> <span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$s</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$x</span>; <span class="highlite-NAME_SCALAR">$s</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «(Str)»</span></pre> </div> </div> <p>There is an important exception to this transforms-into-type-object rule: assigning <code>Nil</code> to a variable which has a default will restore that default.</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">Int</span> <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">default</span>(42) <span class="highlite-OPERATOR">=</span> -1; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-OPERATOR">=</span> 1; <span class="highlite-KEYWORD">for</span> <span class="highlite-NAME_SCALAR">$x</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-KEYWORD">-></span> <span class="highlite-NAME_SCALAR">$val</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">rw</span> { <span class="highlite-NAME_SCALAR">$val</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">Nil</span> <span class="highlite-KEYWORD">unless</span> <span class="highlite-NAME_SCALAR">$val</span> <span class="highlite-OPERATOR">></span> 0 } <span class="highlite-NAME_SCALAR">$x</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «42»</span></pre> </div> </div> <p>Methods such as <code>BIND-POS</code>, <code>ASSIGN-KEY</code>, <code>ASSIGN-POS</code> will die; <code>BIND-KEY</code> will produce a failure with an <a href="/type/X/Bind"><code>X::Bind</code></a> exception in it, and <code>STORE</code> will produce an <a href="/type/X/Assignment/RO"><code>X::Assignment::RO</code></a> exception.</p> <h1 id="Methods" class="raku-h1"><a href="#class_Nil" title="go to top of document">Methods<a class="raku-anchor" title="direct link" href="#Methods">§</a></a></h1> <h2 id="method_append" class="raku-h2"><a href="#class_Nil" title="go to top of document">method append<a class="raku-anchor" title="direct link" href="#method_append">§</a></a></h2> <!-- defnmark method_append 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">append</span>(<span class="highlite-OPERATOR">*</span>@)</pre> </div> </div> <p>Warns the user that they tried to append onto a <code>Nil</code> (or derived type object).</p> <h2 id="method_gist" class="raku-h2"><a href="#class_Nil" title="go to top of document">method gist<a class="raku-anchor" title="direct link" href="#method_gist">§</a></a></h2> <!-- defnmark method_gist 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">gist</span>(<span class="highlite-KEYWORD">--></span> Str:D)</pre> </div> </div> <p>Returns <code>"Nil"</code>.</p> <h2 id="method_Str" class="raku-h2"><a href="#class_Nil" title="go to top of document">method Str<a class="raku-anchor" title="direct link" href="#method_Str">§</a></a></h2> <!-- defnmark method_Str 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-TYPE">Str</span>()</pre> </div> </div> <p>Warns the user that they tried to stringify a <code>Nil</code>.</p> <h2 id="method_new" class="raku-h2"><a href="#class_Nil" title="go to top of document">method new<a class="raku-anchor" title="direct link" href="#method_new">§</a></a></h2> <!-- defnmark method_new 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">new</span>(<span class="highlite-OPERATOR">*</span>@)</pre> </div> </div> <p>Returns <code>Nil</code></p> <h2 id="method_prepend" class="raku-h2"><a href="#class_Nil" title="go to top of document">method prepend<a class="raku-anchor" title="direct link" href="#method_prepend">§</a></a></h2> <!-- defnmark method_prepend 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">prepend</span>(<span class="highlite-OPERATOR">*</span>@)</pre> </div> </div> <p>Warns the user that they tried to prepend onto a <code>Nil</code> or derived type object.</p> <h2 id="method_push" class="raku-h2"><a href="#class_Nil" title="go to top of document">method push<a class="raku-anchor" title="direct link" href="#method_push">§</a></a></h2> <!-- defnmark method_push 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">push</span>(<span class="highlite-OPERATOR">*</span>@)</pre> </div> </div> <p>Warns the user that they tried to push onto a <code>Nil</code> or derived type object.</p> <h2 id="method_unshift" class="raku-h2"><a href="#class_Nil" title="go to top of document">method unshift<a class="raku-anchor" title="direct link" href="#method_unshift">§</a></a></h2> <!-- defnmark method_unshift 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">unshift</span>(<span class="highlite-OPERATOR">*</span>@)</pre> </div> </div> <p>Warns the user that they tried to unshift onto a <code>Nil</code> or derived type object.</p> <h2 id="method_ords" class="raku-h2"><a href="#class_Nil" title="go to top of document">method ords<a class="raku-anchor" title="direct link" href="#method_ords">§</a></a></h2> <!-- defnmark method_ords 2 --> <p>Returns an empty <a href="/type/Seq"><code>Seq</code></a>, but will also issue a warning depending on the context it's used (for instance, a warning about using it in string context if used with <code>say</code>).</p> <h2 id="method_chrs" class="raku-h2"><a href="#class_Nil" title="go to top of document">method chrs<a class="raku-anchor" title="direct link" href="#method_chrs">§</a></a></h2> <!-- defnmark method_chrs 2 --> <p>Will return <code>\0</code>, and also throw a warning.</p> <h2 id="method_FALLBACK" class="raku-h2"><a href="#class_Nil" title="go to top of document">method FALLBACK<a class="raku-anchor" title="direct link" href="#method_FALLBACK">§</a></a></h2> <!-- defnmark method_FALLBACK 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">FALLBACK</span>(<span class="highlite-OPERATOR">|</span> <span class="highlite-KEYWORD">--></span> <span class="highlite-TYPE">Nil</span>) {}</pre> </div> </div> <p>The <a href="/language/typesystem#index-entry-FALLBACK_(method)">fallback method</a> takes any arguments and always returns a <code>Nil</code>.</p> <h2 id="method_Numeric" class="raku-h2"><a href="#class_Nil" title="go to top of document">method Numeric<a class="raku-anchor" title="direct link" href="#method_Numeric">§</a></a></h2> <!-- defnmark method_Numeric 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-TYPE">Numeric</span>()</pre> </div> </div> <p>Warns the user that they tried to numify a <code>Nil</code>.</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>Nil</code></figcaption> <svg width="89pt" height="332pt" viewBox="0.00 0.00 88.59 332.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 328)"> <title>raku-type-graph</title> <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-328 84.59,-328 84.59,4 -4,4"/> <!-- Nil --> <g id="node1" class="node"> <title>Nil</title> <g id="a_node1"><a xlink:href="/type/Nil" xlink:title="Nil"> <ellipse fill="none" stroke="#000000" cx="40.3" cy="-90" rx="27" ry="18"/> <text text-anchor="middle" x="40.3" y="-86.3" font-family="FreeSans" font-size="14.00" fill="#000000">Nil</text> </a> </g> </g> <!-- Cool --> <g id="node4" class="node"> <title>Cool</title> <g id="a_node4"><a xlink:href="/type/Cool" xlink:title="Cool"> <ellipse fill="none" stroke="#000000" cx="40.3" cy="-162" rx="30.59" ry="18"/> <text text-anchor="middle" x="40.3" y="-158.3" font-family="FreeSans" font-size="14.00" fill="#000000">Cool</text> </a> </g> </g> <!-- Nil->Cool --> <g id="edge1" class="edge"> <title>Nil->Cool</title> <path fill="none" stroke="#000000" d="M40.3,-108.3C40.3,-116.02 40.3,-125.29 40.3,-133.89"/> <polygon fill="#000000" stroke="#000000" points="36.8,-133.9 40.3,-143.9 43.8,-133.9 36.8,-133.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="40.3" cy="-306" rx="27" ry="18"/> <text text-anchor="middle" x="40.3" y="-302.3" font-family="FreeSans" font-size="14.00" fill="#000000">Mu</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="40.3" cy="-234" rx="28.7" ry="18"/> <text text-anchor="middle" x="40.3" y="-230.3" font-family="FreeSans" font-size="14.00" fill="#000000">Any</text> </a> </g> </g> <!-- Any->Mu --> <g id="edge2" class="edge"> <title>Any->Mu</title> <path fill="none" stroke="#000000" d="M40.3,-252.3C40.3,-260.02 40.3,-269.29 40.3,-277.89"/> <polygon fill="#000000" stroke="#000000" points="36.8,-277.9 40.3,-287.9 43.8,-277.9 36.8,-277.9"/> </g> <!-- Cool->Any --> <g id="edge3" class="edge"> <title>Cool->Any</title> <path fill="none" stroke="#000000" d="M40.3,-180.3C40.3,-188.02 40.3,-197.29 40.3,-205.89"/> <polygon fill="#000000" stroke="#000000" points="36.8,-205.9 40.3,-215.9 43.8,-205.9 36.8,-205.9"/> </g> <!-- Failure --> <g id="node5" class="node"> <title>Failure</title> <g id="a_node5"><a xlink:href="/type/Failure" xlink:title="Failure"> <ellipse fill="none" stroke="#000000" cx="40.3" cy="-18" rx="40.09" ry="18"/> <text text-anchor="middle" x="40.3" y="-14.3" font-family="FreeSans" font-size="14.00" fill="#000000">Failure</text> </a> </g> </g> <!-- Failure->Nil --> <g id="edge4" class="edge"> <title>Failure->Nil</title> <path fill="none" stroke="#000000" d="M40.3,-36.3C40.3,-44.02 40.3,-53.29 40.3,-61.89"/> <polygon fill="#000000" stroke="#000000" points="36.8,-61.9 40.3,-71.9 43.8,-61.9 36.8,-61.9"/> </g> </g> </svg> <p class="fallback"> <a rel="alternate" href="/assets/typegraphs/Nil.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="fc2dc4a42 2024-05-19"> <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>