CINXE.COM

Signature literals | Raku Documentation

<!DOCTYPE html> <html lang="en" class="fontawesome-i2svg-active fontawesome-i2svg-complete" style="scroll-padding-top:60px"> <head> <title>Signature literals | 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="Signature_literals" 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/Language/signatures.rakudoc" title="Edit this page.&#13;Commit: ae16c6aab 2024-07-24"> <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="#Parameter_separators">Parameter separators</a></li> <li><a href="#Type_constraints">Type constraints</a></li> <ul> <li><a href="#Constraining_optional_arguments">Constraining optional arguments</a></li> <li><a href="#Constraining_slurpy_arguments">Constraining slurpy arguments</a></li> <li><a href="#Constraining_named_arguments">Constraining named arguments</a></li> <li><a href="#Constraining_argument_definiteness">Constraining argument definiteness</a></li> <li><a href="#Constraining_signatures_of_Callables">Constraining signatures of Callables</a></li> <li><a href="#Constraining_return_types">Constraining return types</a></li> <ul> <li><a href="#Return_type_arrow:_--&gt;">Return type arrow: --></a></li> <li><a href="#returns">returns</a></li> <li><a href="#of">of</a></li> <li><a href="#prefix(C-like)_form">prefix(C-like) form</a></li> </ul> <li><a href="#Coercion_type">Coercion type</a></li> </ul> <li><a href="#Slurpy_parameters">Slurpy parameters</a></li> <li><a href="#Types_of_slurpy_array_parameters">Types of slurpy array parameters</a></li> <ul> <li><a href="#Flattened_slurpy">Flattened slurpy</a></li> <li><a href="#Unflattened_slurpy">Unflattened slurpy</a></li> <li><a href="#Single_argument_rule_slurpy">Single argument rule slurpy</a></li> </ul> <li><a href="#Type_captures">Type captures</a></li> <li><a href="#Positional_vs._named_arguments">Positional vs. named arguments</a></li> <li><a href="#Argument_aliases">Argument aliases</a></li> <li><a href="#Optional_and_mandatory_arguments">Optional and mandatory arguments</a></li> <ul> <li><a href="#Was_an_argument_passed_for_a_parameter?">Was an argument passed for a parameter?</a></li> </ul> <li><a href="#Dynamic_variables">Dynamic variables</a></li> <li><a href="#Destructuring_arguments">Destructuring arguments</a></li> <li><a href="#Sub-signatures">Sub-signatures</a></li> <li><a href="#Long_names">Long names</a></li> <li><a href="#Capture_parameters">Capture parameters</a></li> <li><a href="#Parameter_traits_and_modifiers">Parameter traits and modifiers</a></li> </ul> </aside> <aside id="index-menu" class="menu is-hidden"> <ul class="menu-list"> <li>Language<ul> <li><a href="#index-entry-Constraint">Constraint</a></li> <li><a href="#index-entry-Type_capture">Type capture</a></li> <li><a href="#index-entry-anonymous_arguments">anonymous arguments</a></li> <li><a href="#index-entry-argument_aliases">argument aliases</a></li> <li><a href="#index-entry-destructuring_arguments">destructuring arguments</a></li> <li><a href="#index-entry-mandatory_named_argument">mandatory named argument</a></li> <li><a href="#index-entry-named_argument">named argument</a></li> <li><a href="#index-entry-optional_argument">optional argument</a></li> <li><a href="#index-entry-positional_argument">positional argument</a></li> <li><a href="#index-entry-slurpy_argument">slurpy argument</a></li> <li><a href="#index-entry-sub-signature">sub-signature</a></li> <li><a href="#index-entry-type_constraint">type constraint</a></li> <li><a href="#index-entry-where_clause">where clause</a></li> </ul></li> <li>Reference<ul> <li><a href="#index-entry-variadic-variadic">variadic</a></li> </ul></li> <li>Syntax<ul> <li><a href="#index-entry-*%">*%</a></li> <li><a href="#index-entry-*@">*@</a></li> <li><a href="#index-entry-+_(Single_argument_rule_slurpy)">+ </a></li> <li><a href="#index-entry---&gt;">--></a></li> <li><a href="#index-entry-:()">:()</a></li> <li><a href="#index-entry-:D">:D</a></li> <li><a href="#index-entry-:U">:U</a></li> <li><a href="#index-entry-:__">:_</a></li> <li><a href="#index-entry-Return_type_arrow">Return type arrow</a></li> <li><a href="#index-entry-signature_literal">signature literal</a></li> </ul></li> <li>Traits<ul> <li><a href="#index-entry-is_copy">is copy</a></li> <li><a href="#index-entry-is_raw">is raw</a></li> <li><a href="#index-entry-is_readonly">is readonly</a></li> <li><a href="#index-entry-is_rw">is rw</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"> Signature literals </div> <div class="raku page-subtitle has-text-centered"> <p>A guide to signatures in Raku</p> </div> </div> </section> <section class="raku page-content"><div class="container px-4"><div class="columns one-col"><p><a name="index-entry-signature_literal" class="index-entry"></a> <a name="index-entry-:()" class="index-entry"></a></p><p><a href="/type/Signature"><code>Signatures</code></a> appear inside parentheses after <a href="/type/Sub">subroutine</a> and <a href="/type/Method">method</a> names, on blocks after a <code>-&gt;</code> or <code>&lt;-&gt;</code> arrow, as the input to <a href="/language/variables#Variable_declarators_and_scope">variable declarators</a> like <a href="/syntax/my"><code>my</code></a>, or as a separate term starting with a colon.</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> <span class="highlite-ROUTINE">f</span>(<span class="highlite-NAME_SCALAR">$x</span>) { } <span class="highlite-COMMENT"># ^^^^ Signature of sub f </span><span class="highlite-KEYWORD">my</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-OPERATOR">x</span>() { } <span class="highlite-COMMENT"># ^^ Signature of a method </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$s</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-KEYWORD">sub</span> (<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@a</span>) { } <span class="highlite-COMMENT"># ^^^^^ Signature of an anonymous function </span> <span class="highlite-KEYWORD">for</span> &lt;a b c&gt; <span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-NAME_SCALAR">$x</span> { } <span class="highlite-COMMENT"># ^^ Signature of a Block </span> <span class="highlite-KEYWORD">my</span> (<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_ARRAY">@b</span>) <span class="highlite-OPERATOR">=</span> 5<span class="highlite-OPERATOR">,</span> (6<span class="highlite-OPERATOR">,</span> 7<span class="highlite-OPERATOR">,</span> 8); <span class="highlite-COMMENT"># ^^^^^^^^ Signature of a variable declarator </span> <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$sig</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$b</span>); <span class="highlite-COMMENT"># ^^^^^^^^ Standalone Signature object</span></pre> </div> </div> <p>Signature literals can be used to define the signature of a callback or a closure.</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> <span class="highlite-ROUTINE">f</span>(<span class="highlite-NAME_CODE">&amp;c:</span>(<span class="highlite-TYPE">Int</span>)) { } <span class="highlite-KEYWORD">sub</span> will-work(<span class="highlite-TYPE">Int</span>) { } <span class="highlite-KEYWORD">sub</span> won<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">t-work(Str) { } f(&amp;will-work); f(&amp;won</span><span class="highlite-STRING_DELIMITER">'</span>t-work); <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::Binding::Parameter: Constraint type check failed in binding to parameter '&amp;c'␤» </span> <span class="highlite-ROUTINE">f</span>(<span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-TYPE">Int</span> { <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">this works too</span><span class="highlite-STRING_DELIMITER">'</span> } );</pre> </div> </div> <p>You can use any kind of literal, including numeric ones, as part of a signature; this is generally used in conjunction with multis</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">proto</span> stuff(<span class="highlite-OPERATOR">|</span>) {<span class="highlite-OPERATOR">*</span>} <span class="highlite-KEYWORD">multi</span> stuff(33) { 58 } <span class="highlite-KEYWORD">multi</span> stuff(⅓) { 43 } <span class="highlite-KEYWORD">multi</span> stuff(<span class="highlite-TYPE">Int</span>) { 3 } <span class="highlite-KEYWORD">multi</span> stuff(<span class="highlite-TYPE">Complex</span>) { 66 } <span class="highlite-ROUTINE">say</span> stuff(<span class="highlite-NAME_SCALAR">$_</span>) <span class="highlite-KEYWORD">for</span> (33<span class="highlite-OPERATOR">,</span> ⅓<span class="highlite-OPERATOR">,</span> i<span class="highlite-OPERATOR">,</span> 48); <span class="highlite-COMMENT"># OUTPUT: «58␤43␤66␤3␤» </span></pre> </div> </div> <p>However, you can't use <code>True</code> or <code>False</code> as literals in signatures since they will always succeed (or fail). A warning will be issued if you do so:</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> foo(<span class="highlite-TYPE">True</span>) {}; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$sig</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>( <span class="highlite-TYPE">True</span> ); </pre> </div> </div> <p>They will both warn &quot;Literal values in signatures are smartmatched against and smartmatch with <code>True</code> will always succeed. Use the <code>where</code> clause instead.&quot;. Use of <code>False</code> will produce a similar warning.</p><p>Smartmatching signatures against a <a href="/type/List"><code>List</code></a> is supported.</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">$sig</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$i</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$s</span>); <span class="highlite-ROUTINE">say</span> (10<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">answer</span><span class="highlite-STRING_DELIMITER">'</span>) <span class="highlite-OPERATOR">~~</span> <span class="highlite-NAME_SCALAR">$sig</span>; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$sub</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-KEYWORD">sub</span> ( <span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$s</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$i</span> ) { <span class="highlite-KEYWORD">return</span> <span class="highlite-NAME_SCALAR">$s</span> <span class="highlite-OPERATOR">xx</span> <span class="highlite-NAME_SCALAR">$i</span> }; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$sub</span>.<span class="highlite-ROUTINE">signature</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-OPERATOR">:</span>( <span class="highlite-TYPE">Str</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span> ); <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-KEYWORD">given</span> <span class="highlite-NAME_SCALAR">$sig</span> { <span class="highlite-KEYWORD">when</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-TYPE">Str</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">mismatch</span><span class="highlite-STRING_DELIMITER">'</span> } <span class="highlite-KEYWORD">when</span> <span class="highlite-OPERATOR">:</span>($<span class="highlite-OPERATOR">,</span> $) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">match</span><span class="highlite-STRING_DELIMITER">'</span> } <span class="highlite-KEYWORD">default</span> { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">no match</span><span class="highlite-STRING_DELIMITER">'</span> } } <span class="highlite-COMMENT"># OUTPUT: «match␤»</span></pre> </div> </div> <p>It matches the second <code>when</code> clause since <code>:($, $)</code> represents a <a href="/type/Signature"><code>Signature</code></a> with two scalar, anonymous, arguments, which is a more general version of <code>$sig</code>.</p><p>When smartmatching against a <a href="/type/Hash"><code>Hash</code></a>, the signature is assumed to consist of the keys of the <a href="/type/Hash"><code>Hash</code></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-KEYWORD">my</span> <span class="highlite-NAME_HASH">%h</span> <span class="highlite-OPERATOR">=</span> left <span class="highlite-OPERATOR">=&gt;</span> 1<span class="highlite-OPERATOR">,</span> <span class="highlite-ROUTINE">right</span> <span class="highlite-OPERATOR">=&gt;</span> 2; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_HASH">%h</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$left</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$right</span>); <span class="highlite-COMMENT"># OUTPUT: «True␤»</span></pre> </div> </div> <p><a href="/type/Signature"><code>Signature</code></a> literals can contain string/numeric literals</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">$sig</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">Þor</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span>); <span class="highlite-ROUTINE">say</span> &lt;Þor Hammer 1&gt; <span class="highlite-OPERATOR">~~</span> <span class="highlite-NAME_SCALAR">$sig</span>; <span class="highlite-COMMENT"># OUTPUT: «True␤»</span></pre> </div> </div> <p>And they can also contain the invocant marker</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> Foo { <span class="highlite-KEYWORD">method</span> bar( <span class="highlite-NAME_SCALAR">$self:</span> ){ <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">baz</span><span class="highlite-STRING_DELIMITER">&quot;</span> } }; <span class="highlite-ROUTINE">say</span> Foo.^<span class="highlite-ROUTINE">methods</span>.<span class="highlite-ROUTINE">first</span>(<span class="highlite-OPERATOR">*</span>.<span class="highlite-ROUTINE">name</span> <span class="highlite-OPERATOR">eq</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">bar</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">signature</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-NAME_SCALAR">$:</span> <span class="highlite-OPERATOR">*</span><span class="highlite-OPERATOR">%</span>) ; <span class="highlite-COMMENT"># OUTPUT: «True␤»</span></pre> </div> </div> <h1 id="Parameter_separators" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Parameter separators<a class="raku-anchor" title="direct link" href="#Parameter_separators">§</a></a></h1> <p>A signature consists of zero or more <a href="/type/Parameter"><code>Parameter</code></a>s, separated by commas.</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">$sig</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_ARRAY">@b</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_HASH">%c</span>); <span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">add</span>(<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$b</span>) { <span class="highlite-NAME_SCALAR">$a</span> <span class="highlite-OPERATOR">+</span> <span class="highlite-NAME_SCALAR">$b</span> };</pre> </div> </div> <p>As an exception the first parameter may be followed by a colon instead of a comma to mark the invocant of a method. This is done in order to distinguish it from what would then be a regular positional parameter. The invocant is the object that was used to call the method, which is usually bound to <a href="/routine/self"><code>self</code></a>. By specifying it in the signature, you can change the variable name it is bound to.</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">method</span> (<span class="highlite-NAME_SCALAR">$a:</span> <span class="highlite-NAME_ARRAY">@b</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_HASH">%c</span>) {}; <span class="highlite-COMMENT"># first argument is the invocant </span> <span class="highlite-KEYWORD">class</span> Foo { <span class="highlite-KEYWORD">method</span> whoami(<span class="highlite-NAME_SCALAR">$me:</span>) { <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">Well I'm class </span><span class="highlite-NAME_SCALAR">$me</span><span class="highlite-STRING">.^name(), of course!</span><span class="highlite-STRING_DELIMITER">&quot;</span> } } <span class="highlite-ROUTINE">say</span> Foo.whoami; <span class="highlite-COMMENT"># OUTPUT: «Well I'm class Foo, of course!␤»</span></pre> </div> </div> <p><a name="index-entry-type_constraint" class="index-entry"></a> <a name="index-entry-Constraint" class="index-entry"></a></p> <h1 id="Type_constraints" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Type constraints<a class="raku-anchor" title="direct link" href="#Type_constraints">§</a></a></h1> <p>Parameters can optionally have a type constraint (the default is <a href="/type/Any"><code>Any</code></a>). These can be used to restrict the allowed input to a function.</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">$sig</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$b</span>); </pre> </div> </div> <p>Type constraints can have any compile-time defined value</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">subset</span> Positive-integer <span class="highlite-KEYWORD">of</span> <span class="highlite-TYPE">Int</span> <span class="highlite-KEYWORD">where</span> <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">&gt;</span> 0; <span class="highlite-KEYWORD">sub</span> divisors(Positive-integer <span class="highlite-NAME_SCALAR">$n</span>) { <span class="highlite-NAME_SCALAR">$_</span> <span class="highlite-KEYWORD">if</span> <span class="highlite-NAME_SCALAR">$n</span> <span class="highlite-OPERATOR">%%</span> <span class="highlite-NAME_SCALAR">$_</span> <span class="highlite-KEYWORD">for</span> 1.<span class="highlite-OPERATOR">.</span><span class="highlite-NAME_SCALAR">$n</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-ROUTINE">resume</span> } }; divisors 2.5; <span class="highlite-COMMENT"># OUTPUT: «X::TypeCheck::Binding::Parameter: Type check failed in binding to parameter '$n'; expected Positive-integer but got Rat (2.5)␤» </span> divisors -3; <span class="highlite-COMMENT"># OUTPUT: «X::TypeCheck::Binding::Parameter: Constraint type check failed in binding to parameter '$n'; expected Positive-integer but got Int (-3)␤» </span></pre> </div> </div> <p>Please note that in the code above type constraints are enforced at two different levels: the first level checks if it belongs to the type in which the subset is based, in this case <a href="/type/Int"><code>Int</code></a>. If it fails, a <code>Type check</code> error is produced. Once that filter is cleared, the constraint that defined the subset is checked, producing a <code>Constraint type check</code> error if it fails.</p><p>Type constraints can define multiple allowable types</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> abbrev(<span class="highlite-NAME_SCALAR">$arg</span> <span class="highlite-KEYWORD">where</span> <span class="highlite-TYPE">Str</span>|<span class="highlite-TYPE">List</span>|<span class="highlite-TYPE">Hash</span>) {<span class="highlite-OPERATOR">...</span>} <span class="highlite-COMMENT"># throws if $arg is not one of those types </span></pre> </div> </div> <p><a name="index-entry-anonymous_arguments" class="index-entry"></a> Anonymous arguments are fine too, if you don't actually need to refer to a parameter by name, for instance to distinguish between different signatures in a <a href="/language/functions#Multi-dispatch">multi</a> or to check the signature of a <a href="/type/Callable"><code>Callable</code></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-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$sig</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>($<span class="highlite-OPERATOR">,</span> @<span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_HASH">%a</span>); <span class="highlite-COMMENT"># two anonymous and a &quot;normal&quot; parameter </span><span class="highlite-NAME_SCALAR">$sig</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-TYPE">Int</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Positional</span>); <span class="highlite-COMMENT"># just a type is also fine (two parameters) </span><span class="highlite-KEYWORD">sub</span> baz(<span class="highlite-TYPE">Str</span>) { <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">Got passed a Str</span><span class="highlite-STRING_DELIMITER">&quot;</span> } </pre> </div> </div> <p>Type constraints may also be <a href="/language/signatures#Type_captures">type captures</a>.</p><p><a name="index-entry-where_clause" class="index-entry"></a> In addition to those <em>nominal</em> types, additional constraints can be placed on parameters in the form of code blocks which must return a true value to pass the type check</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> <span class="highlite-ROUTINE">f</span>(<span class="highlite-TYPE">Real</span> <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-KEYWORD">where</span> { <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">&gt;</span> 0 }<span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Real</span> <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-KEYWORD">where</span> { <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-OPERATOR">&gt;=</span> <span class="highlite-NAME_SCALAR">$x</span> }) { }</pre> </div> </div> <p>The code in <code>where</code> clauses has some limitations: anything that produces side-effects (e.g., printing output, pulling from an iterator, or increasing a state variable) is not supported and may produce surprising results if used. Also, the code of the <code>where</code> clause may run more than once for a single typecheck in some implementations.</p><p>The <code>where</code> clause doesn't need to be a code block, anything on the right of the <code>where</code>-clause will be used to <a href="/language/operators#infix_~~">smartmatch</a> the argument against it. So you can also write:</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">multi</span> factorial(<span class="highlite-TYPE">Int</span> $ <span class="highlite-KEYWORD">where</span> 0) { 1 } <span class="highlite-KEYWORD">multi</span> factorial(<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$x</span>) { <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">*</span> factorial(<span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">-</span> 1) }</pre> </div> </div> <p>The first of those can be shortened to</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">multi</span> factorial(0) { 1 }</pre> </div> </div> <p>i.e., you can use a literal directly as a type and value constraint on an anonymous parameter.</p><p><strong>Tip:</strong> pay attention to not accidentally leave off a block when you, say, have several conditions:</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">-&gt;</span> <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-KEYWORD">where</span> .<span class="highlite-OPERATOR">so</span> <span class="highlite-OPERATOR">&amp;&amp;</span> .<span class="highlite-ROUTINE">name</span> {}( <span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">one</span> {} ); <span class="highlite-COMMENT"># WRONG!! </span><span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-KEYWORD">where</span> { .<span class="highlite-OPERATOR">so</span> <span class="highlite-OPERATOR">&amp;&amp;</span> .<span class="highlite-ROUTINE">name</span> } {}( <span class="highlite-KEYWORD">sub</span> two {} ); <span class="highlite-COMMENT"># OK! </span><span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-KEYWORD">where</span> .<span class="highlite-OPERATOR">so</span> <span class="highlite-OPERATOR">&amp;</span> .<span class="highlite-ROUTINE">name</span>.<span class="highlite-OPERATOR">so</span> {}( <span class="highlite-KEYWORD">sub</span> three {} ); <span class="highlite-COMMENT"># Also good</span></pre> </div> </div> <p>The first version is wrong and will issue a warning about a sub object coerced to string. The reason is the expression is equivalent to <code>($y ~~ ($y.so &amp;&amp; $y.name))</code>; that is &quot;call <code>.so</code>, and if that is <code>True</code>, call <code>.name</code>; if that is also <code>True</code> use its value for smartmatching…&quot;. It's the <strong>result</strong> of <code>(.so &amp;&amp; .name)</code> it will be smartmatched against, but we want to check that both <code>.so</code> and <code>.name</code> are truthy values. That is why an explicit Block or a <a href="/type/Junction"><code>Junction</code></a> is the right version.</p><p>All previous arguments that are not part of a sub-signature in a <a href="/type/Signature"><code>Signature</code></a> are accessible in a <code>where</code>-clause that follows an argument. Therefore, the <code>where</code>-clause of the last argument has access to all arguments of a signature that are not part of a sub-signature. For a sub-signature place the <code>where</code>-clause inside the sub-signature.</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> foo(<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$b</span> <span class="highlite-KEYWORD">where</span> <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">==</span> <span class="highlite-NAME_SCALAR">$a</span> <span class="highlite-OPERATOR">**</span> 2) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-NAME_SCALAR">$b</span><span class="highlite-STRING"> is a square of </span><span class="highlite-NAME_SCALAR">$a</span><span class="highlite-STRING_DELIMITER">&quot;</span> } foo 2<span class="highlite-OPERATOR">,</span> 4; <span class="highlite-COMMENT"># OUTPUT: «4 is a square of 2␤»» </span><span class="highlite-COMMENT"># foo 2, 3; </span><span class="highlite-COMMENT"># OUTPUT: «Constraint type check failed in binding to parameter '$b'…»</span></pre> </div> </div> <h2 id="Constraining_optional_arguments" class="raku-h2"><a href="#Signature_literals" title="go to top of document">Constraining optional arguments<a class="raku-anchor" title="direct link" href="#Constraining_optional_arguments">§</a></a></h2> <p><a href="#Optional_and_mandatory_arguments">Optional arguments</a> can have constraints, too. Any <code>where</code> clause on any parameter will be executed, even if it's optional and not provided by the caller. In that case you may have to guard against undefined values within the <code>where</code> clause.</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> <span class="highlite-ROUTINE">f</span>(<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">UInt</span> <span class="highlite-NAME_SCALAR">$i</span>? <span class="highlite-KEYWORD">where</span> { <span class="highlite-OPERATOR">!</span><span class="highlite-NAME_SCALAR">$i</span>.<span class="highlite-ROUTINE">defined</span> <span class="highlite-OPERATOR">or</span> <span class="highlite-NAME_SCALAR">$i</span> <span class="highlite-OPERATOR">&gt;</span> 5 }) { <span class="highlite-OPERATOR">...</span> }</pre> </div> </div> <h2 id="Constraining_slurpy_arguments" class="raku-h2"><a href="#Signature_literals" title="go to top of document">Constraining slurpy arguments<a class="raku-anchor" title="direct link" href="#Constraining_slurpy_arguments">§</a></a></h2> <p><a href="#Slurpy_parameters">Slurpy arguments</a> can not have type constraints. A <code>where</code>-clause in conjunction with a <a href="/type/Junction"><code>Junction</code></a> can be used to that effect.</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> <span class="highlite-ROUTINE">f</span>(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@a</span> <span class="highlite-KEYWORD">where</span> {<span class="highlite-NAME_SCALAR">$_</span>.<span class="highlite-ROUTINE">all</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-TYPE">Int</span>}) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@a</span> }; <span class="highlite-ROUTINE">f</span>(42); <span class="highlite-ROUTINE">f</span>(<span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">&gt;</span>); <span class="highlite-KEYWORD">CATCH</span> { <span class="highlite-KEYWORD">default</span> { <span class="highlite-ROUTINE">say</span> .^<span class="highlite-ROUTINE">name</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING"> ==&gt; </span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> .<span class="highlite-TYPE">Str</span> } } <span class="highlite-COMMENT"># OUTPUT: «[42]␤Constraint type check failed in binding to parameter '@a' ...» </span></pre> </div> </div> <h2 id="Constraining_named_arguments" class="raku-h2"><a href="#Signature_literals" title="go to top of document">Constraining named arguments<a class="raku-anchor" title="direct link" href="#Constraining_named_arguments">§</a></a></h2> <p>Constraints against <a href="#Positional_vs._named_arguments">named arguments</a> apply to the value part of the <a href="/type/Pair">colon-pair</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-KEYWORD">sub</span> <span class="highlite-ROUTINE">f</span>(<span class="highlite-TYPE">Int</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$i</span>){}; <span class="highlite-ROUTINE">f</span> :i&lt;forty-two&gt;; <span class="highlite-KEYWORD">CATCH</span> { <span class="highlite-KEYWORD">default</span> { <span class="highlite-ROUTINE">say</span> .^<span class="highlite-ROUTINE">name</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING"> ==&gt; </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::Binding::Parameter ==&gt; Type check failed in </span><span class="highlite-COMMENT"># binding to parameter '$i'; expected Int but got Str (&quot;forty-two&quot;)␤»</span></pre> </div> </div> <p><a name="index-entry-:D" class="index-entry"></a> <a name="index-entry-:U" class="index-entry"></a> <a name="index-entry-:__" class="index-entry"></a></p> <h2 id="Constraining_argument_definiteness" class="raku-h2"><a href="#Signature_literals" title="go to top of document">Constraining argument definiteness<a class="raku-anchor" title="direct link" href="#Constraining_argument_definiteness">§</a></a></h2> <p>Normally, a type constraint only checks whether the value of the parameter is of the correct type. Crucially, both <em>object instances</em> and <em>type objects</em> will satisfy such a constraint as illustrated below:</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> 42.^<span class="highlite-ROUTINE">name</span>; <span class="highlite-COMMENT"># OUTPUT: «Int␤» </span><span class="highlite-ROUTINE">say</span> 42 <span class="highlite-OPERATOR">~~</span> <span class="highlite-TYPE">Int</span>; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-TYPE">Int</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-TYPE">Int</span>; <span class="highlite-COMMENT"># OUTPUT: «True␤»</span></pre> </div> </div> <p>Note how both <code>42</code> and <a href="/type/Int"><code>Int</code></a> satisfy the match.</p><p>Sometimes we need to distinguish between these object instances (<code>42</code>) and type objects (<a href="/type/Int"><code>Int</code></a>). Consider the following 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">sub</span> limit-lines(<span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$s</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$limit</span>) { <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_ARRAY">@lines</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$s</span>.<span class="highlite-ROUTINE">lines</span>; <span class="highlite-NAME_ARRAY">@lines</span>[0 <span class="highlite-OPERATOR">..</span> <span class="highlite-OPERATOR">min</span> <span class="highlite-NAME_ARRAY">@lines</span>.<span class="highlite-ROUTINE">elems</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$limit</span>].<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-ESCAPE">\n</span><span class="highlite-STRING_DELIMITER">&quot;</span>) } <span class="highlite-ROUTINE">say</span> (limit-lines <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">a </span><span class="highlite-ESCAPE">\n</span><span class="highlite-STRING"> b </span><span class="highlite-ESCAPE">\n</span><span class="highlite-STRING"> c </span><span class="highlite-ESCAPE">\n</span><span class="highlite-STRING"> d </span><span class="highlite-ESCAPE">\n</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> 3).<span class="highlite-ROUTINE">raku</span>; <span class="highlite-COMMENT"># &quot;a \n b \n c \n d &quot; </span><span class="highlite-ROUTINE">say</span> limit-lines <span class="highlite-TYPE">Str</span><span class="highlite-OPERATOR">,</span> 3; <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::Multi::NoMatch: Cannot resolve caller lines(Str: ); </span><span class="highlite-COMMENT"># none of these signatures match: </span><span class="highlite-COMMENT"># (Str:D $: :$count!, *%_) </span><span class="highlite-COMMENT"># (Str:D $: $limit, *%_) </span><span class="highlite-COMMENT"># (Str:D $: *%_)» </span><span class="highlite-ROUTINE">say</span> limit-lines <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">a </span><span class="highlite-ESCAPE">\n</span><span class="highlite-STRING"> b</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span>; <span class="highlite-COMMENT"># Always returns the max number of lines</span></pre> </div> </div> <p>Here we really only want to deal with string instances, not type objects. To do this, we can use the <code>:D</code> type constraint. This constraint checks that the value passed is an <em>object instance</em>, in a similar fashion to calling its <a href="/language/mop#DEFINITE">DEFINITE</a> (meta)method.</p><p>To warm up, let's apply <code>:D</code> to the right-hand side of our humble <a href="/type/Int"><code>Int</code></a> 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">say</span> 42 <span class="highlite-OPERATOR">~~</span> Int:D; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-TYPE">Int</span> <span class="highlite-OPERATOR">~~</span> Int:D; <span class="highlite-COMMENT"># OUTPUT: «False␤»</span></pre> </div> </div> <p>Note how only <code>42</code> matches <code>Int:D</code> in the above.</p><p>Returning to <code>limit-lines</code>, we can now amend its signature to catch the error early:</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> limit-lines(Str:D <span class="highlite-NAME_SCALAR">$s</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$limit</span>) { }; <span class="highlite-ROUTINE">say</span> limit-lines <span class="highlite-TYPE">Str</span><span class="highlite-OPERATOR">,</span> 3; <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: «Parameter '$s' of routine 'limit-lines' must be an object instance of type 'Str', </span><span class="highlite-COMMENT"># not a type object of type 'Str'. Did you forget a '.new'?»</span></pre> </div> </div> <p>This is much better than the way the program failed before, since here the reason for failure is clearer.</p><p>It's also possible that <em>type objects</em> are the only ones that make sense for a routine to accept. This can be done with the <code>:U</code> type constraint, which checks whether the value passed is a type object rather than an object instance. Here's our <a href="/type/Int"><code>Int</code></a> example again, this time with <code>:U</code> applied:</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> 42 <span class="highlite-OPERATOR">~~</span> Int:U; <span class="highlite-COMMENT"># OUTPUT: «False␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-TYPE">Int</span> <span class="highlite-OPERATOR">~~</span> Int:U; <span class="highlite-COMMENT"># OUTPUT: «True␤»</span></pre> </div> </div> <p>Now <code>42</code> fails to match <code>Int:U</code> while <a href="/type/Int"><code>Int</code></a> succeeds.</p><p>Here's a more practical 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">sub</span> can-turn-into(<span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$string</span><span class="highlite-OPERATOR">,</span> Any:U <span class="highlite-NAME_SCALAR">$type</span>) { <span class="highlite-KEYWORD">return</span> <span class="highlite-OPERATOR">so</span> <span class="highlite-NAME_SCALAR">$string</span>.<span class="highlite-NAME_SCALAR">$type</span>; } <span class="highlite-ROUTINE">say</span> can-turn-into(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">3</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span>); <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> can-turn-into(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">6.5</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span>); <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> can-turn-into(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">6.5</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Num</span>); <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> can-turn-into(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">a string</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Num</span>); <span class="highlite-COMMENT"># OUTPUT: «False␤»</span></pre> </div> </div> <p>Calling <code>can-turn-into</code> with an object instance as its second parameter will yield a constraint violation as intended:</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> can-turn-into(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">a string</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> 123); <span class="highlite-COMMENT"># OUTPUT: «Parameter '$type' of routine 'can-turn-into' must be a type object </span><span class="highlite-COMMENT"># of type 'Any', not an object instance of type 'Int'...» </span></pre> </div> </div> <p>For explicitly indicating the normal behavior, that is, not constraining whether the argument will be an instance or a type object, <code>:_</code> can be used but this is unnecessary since this is the default constraint (of this kind) on arguments. Thus, <code>:(Num:_ $)</code> is the same as <code>:(Num $)</code>.</p><p>To recap, here is a quick illustration of these type constraints, also known collectively as <em>type smileys</em>:</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-COMMENT"># Checking a type object </span><span class="highlite-ROUTINE">say</span> <span class="highlite-TYPE">Int</span> <span class="highlite-OPERATOR">~~</span> Any:D; <span class="highlite-COMMENT"># OUTPUT: «False␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-TYPE">Int</span> <span class="highlite-OPERATOR">~~</span> Any:U; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-TYPE">Int</span> <span class="highlite-OPERATOR">~~</span> Any:_; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span> <span class="highlite-COMMENT"># Checking a subset </span><span class="highlite-KEYWORD">subset</span> Even <span class="highlite-KEYWORD">of</span> <span class="highlite-TYPE">Int</span> <span class="highlite-KEYWORD">where</span> <span class="highlite-OPERATOR">*</span> <span class="highlite-REGEX_DELIMITER">/</span><span class="highlite-REGEX_DELIMITER">/</span> 2; <span class="highlite-ROUTINE">say</span> 3 <span class="highlite-OPERATOR">~~</span> Even:D; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> 3 <span class="highlite-OPERATOR">~~</span> Even:U; <span class="highlite-COMMENT"># OUTPUT: «False␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-TYPE">Int</span> <span class="highlite-OPERATOR">~~</span> Even:U; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span> <span class="highlite-COMMENT"># Checking an object instance </span><span class="highlite-ROUTINE">say</span> 42 <span class="highlite-OPERATOR">~~</span> Any:D; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> 42 <span class="highlite-OPERATOR">~~</span> Any:U; <span class="highlite-COMMENT"># OUTPUT: «False␤» </span><span class="highlite-ROUTINE">say</span> 42 <span class="highlite-OPERATOR">~~</span> Any:_; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span> <span class="highlite-COMMENT"># Checking a user-supplied class </span><span class="highlite-KEYWORD">class</span> Foo {}; <span class="highlite-ROUTINE">say</span> Foo <span class="highlite-OPERATOR">~~</span> Any:D; <span class="highlite-COMMENT"># OUTPUT: «False␤» </span><span class="highlite-ROUTINE">say</span> Foo <span class="highlite-OPERATOR">~~</span> Any:U; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> Foo <span class="highlite-OPERATOR">~~</span> Any:_; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span> <span class="highlite-COMMENT"># Checking an instance of a class </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$f</span> <span class="highlite-OPERATOR">=</span> Foo.<span class="highlite-ROUTINE">new</span>; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$f</span> <span class="highlite-OPERATOR">~~</span> Any:D; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$f</span> <span class="highlite-OPERATOR">~~</span> Any:U; <span class="highlite-COMMENT"># OUTPUT: «False␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$f</span> <span class="highlite-OPERATOR">~~</span> Any:_; <span class="highlite-COMMENT"># OUTPUT: «True␤»</span></pre> </div> </div> <p>The <a href="/language/classtut">Classes and Objects</a> document further elaborates on the concepts of instances and type objects and discovering them with the <code>.DEFINITE</code> method.</p><p>Keep in mind all parameters have values; even optional ones have default values that are the type object of the constrained type for explicit type constraints. If no explicit type constraint exists, the default value is an <a href="/type/Any"><code>Any</code></a> type object for methods, submethods, and subroutines, and a <a href="/type/Mu"><code>Mu</code></a> type object for blocks. This means that if you use the <code>:D</code> type smiley, you'd need to provide a default value or make the parameter required. Otherwise, the default value would be a type object, which would fail the definiteness constraint.</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> divide (Int:D <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$a</span> <span class="highlite-OPERATOR">=</span> 2<span class="highlite-OPERATOR">,</span> Int:D <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$b</span>!) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$a</span>/<span class="highlite-NAME_SCALAR">$b</span> } divide :1a<span class="highlite-OPERATOR">,</span> :2b; <span class="highlite-COMMENT"># OUTPUT: «0.5␤»</span></pre> </div> </div> <p>The default value will kick in when that particular parameter, either positional or named, gets no value <em>at all</em>.</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> <span class="highlite-ROUTINE">f</span>(<span class="highlite-NAME_SCALAR">$a</span> <span class="highlite-OPERATOR">=</span> 42){ <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$b</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">default</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">answer</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$a</span>; <span class="highlite-NAME_SCALAR">$b</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$a</span>; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$b</span> }; <span class="highlite-ROUTINE">f</span>; <span class="highlite-COMMENT"># OUTPUT: «42␤42␤» </span><span class="highlite-ROUTINE">f</span> <span class="highlite-TYPE">Nil</span>; <span class="highlite-COMMENT"># OUTPUT: «Nil␤answer␤»</span></pre> </div> </div> <p><code>$a</code> has 42 as its default value. With no value, <code>$a</code> will be assigned the default value declared in the <a href="/type/Signature"><code>Signature</code></a>. However, in the second case, it <em>does</em> receive a value, which happens to be <a href="/type/Nil"><code>Nil</code></a>. Assigning <a href="/type/Nil"><code>Nil</code></a> to any variable resets it to its default value, which has been declared as <code>'answer'</code> by use of the <em>default</em> trait. That explains what happens the second time we call <code>f</code>. Routine parameters and variables deal differently with default value, which is in part clarified by the different way default values are declared in each case (using <code>=</code> for parameters, using the <code>default</code> trait for variables).</p><p>Note: in 6.c language, the default value of <code>:U</code>/<code>:D</code> constrained variables was a type object with such a constraint, which is not initializable, thus you cannot use the <code>.=</code> operator, 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">use</span> v6.c; <span class="highlite-KEYWORD">my</span> Int:D <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">.=</span> new: 42; <span class="highlite-COMMENT"># OUTPUT: You cannot create an instance of this type (Int:D) </span><span class="highlite-COMMENT"># in block &lt;unit&gt; at -e line 1 </span></pre> </div> </div> <p>In the 6.d language, the default <em>default</em> is the type object without the smiley constraint:</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">use</span> v6.<span class="highlite-ROUTINE">d</span>; <span class="highlite-KEYWORD">my</span> Int:D <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">.=</span> new: 42; <span class="highlite-COMMENT"># OUTPUT: «42␤» </span></pre> </div> </div> <p>A closing remark on terminology: this section is about the use of the type smileys <code>:D</code> and <code>:U</code> to constrain the definiteness of arguments. Occasionally <em>definedness</em> is used as a synonym for <em>definiteness</em>; this may be confusing, since the terms have subtly different meanings.</p><p>As explained above, <em>definiteness</em> is concerned with the distinction between type objects and object instances. A type object is always indefinite, while an object instance is always definite. Whether an object is a type object/indefinite or an object instance/definite can be verified using the <a href="/language/mop#DEFINITE">DEFINITE</a> (meta)method.</p><p><em>Definiteness</em> should be distinguished from <em>definedness</em>, which is concerned with the difference between defined and undefined objects. Whether an object is defined or undefined can be verified using the <code>defined</code>-method, which is implemented in class <a href="/type/Mu"><code>Mu</code></a>. By default a type object is considered undefined, while an object instance is considered defined; that is: <code>.defined</code> returns <code>False</code> on a type object, and <code>True</code> otherwise. But this default behavior may be overridden by subclasses. An example of a subclass that overrides the default <code>.defined</code> behavior is <a href="/type/Failure"><code>Failure</code></a>, so that even an instantiated <a href="/type/Failure"><code>Failure</code></a> acts as an undefined value:</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> <span class="highlite-TYPE">Failure</span>; <span class="highlite-COMMENT"># Initialize with type object </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$b</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">Failure</span>.<span class="highlite-ROUTINE">new</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">foo</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-COMMENT"># Initialize with object instance </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$a</span>.<span class="highlite-ROUTINE">DEFINITE</span>; <span class="highlite-COMMENT"># OUTPUT: «False␤» : indefinite type object </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$b</span>.<span class="highlite-ROUTINE">DEFINITE</span>; <span class="highlite-COMMENT"># OUTPUT: «True␤» : definite object instance </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$a</span>.<span class="highlite-ROUTINE">defined</span>; <span class="highlite-COMMENT"># OUTPUT: «False␤» : default response </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$b</span>.<span class="highlite-ROUTINE">defined</span>; <span class="highlite-COMMENT"># OUTPUT: «False␤» : .defined override</span></pre> </div> </div> <h2 id="Constraining_signatures_of_Callables" class="raku-h2"><a href="#Signature_literals" title="go to top of document">Constraining signatures of <a href="/type/Callable"><code>Callable</code></a>s<a class="raku-anchor" title="direct link" href="#Constraining_signatures_of_Callables">§</a></a></h2> <p>:u</p><p>whitespace allowed):</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> apply(<span class="highlite-NAME_CODE">&amp;l:</span>(Int:D <span class="highlite-KEYWORD">--&gt;</span> Int:D)<span class="highlite-OPERATOR">,</span> Int:D \n) { <span class="highlite-ROUTINE">l</span>(n) } <span class="highlite-KEYWORD">sub</span> identity(Int:D \i <span class="highlite-KEYWORD">--&gt;</span> Int:D) { i } <span class="highlite-KEYWORD">sub</span> double(Int:D \<span class="highlite-OPERATOR">x</span> <span class="highlite-KEYWORD">--&gt;</span> Int:D) { 2 <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">x</span> } <span class="highlite-ROUTINE">say</span> apply <span class="highlite-NAME_CODE">&amp;identity</span><span class="highlite-OPERATOR">,</span> 10; <span class="highlite-COMMENT"># OUTPUT: «10␤» </span><span class="highlite-ROUTINE">say</span> apply <span class="highlite-NAME_CODE">&amp;double</span><span class="highlite-OPERATOR">,</span> 10; <span class="highlite-COMMENT"># OUTPUT: «20␤»</span></pre> </div> </div> <p>Typed <a href="/language/functions#Blocks_and_lambdas">lambdas</a> also work with constrained callable parameters.</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> apply <span class="highlite-KEYWORD">-&gt;</span> Int:D \<span class="highlite-OPERATOR">x</span> <span class="highlite-KEYWORD">--&gt;</span> Int:D { 2 <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">x</span> }<span class="highlite-OPERATOR">,</span> 3; <span class="highlite-COMMENT"># OUTPUT: «6␤» </span><span class="highlite-ROUTINE">say</span> apply <span class="highlite-KEYWORD">-&gt;</span> Int:D \<span class="highlite-OPERATOR">x</span> <span class="highlite-KEYWORD">--&gt;</span> Int:D { <span class="highlite-OPERATOR">x</span> <span class="highlite-OPERATOR">**</span> 3 }<span class="highlite-OPERATOR">,</span> 3; <span class="highlite-COMMENT"># OUTPUT: «27␤» </span></pre> </div> </div> <p>Note that this shorthand syntax is available only for parameters with the <code>&amp;</code> sigil. For others, you need to use the long version:</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> play-with-tens(<span class="highlite-NAME_SCALAR">$c</span> <span class="highlite-KEYWORD">where</span> .<span class="highlite-ROUTINE">signature</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-TYPE">Int</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span>)) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$c</span>(10<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">ten</span><span class="highlite-STRING_DELIMITER">'</span>) } <span class="highlite-KEYWORD">sub</span> by-joining-them(<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$i</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$s</span>) { <span class="highlite-NAME_SCALAR">$s</span> <span class="highlite-OPERATOR">~</span> <span class="highlite-NAME_SCALAR">$i</span> } play-with-tens <span class="highlite-NAME_CODE">&amp;by-joining-them</span>; <span class="highlite-COMMENT"># OUTPUT: «ten10␤» </span>play-with-tens <span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-TYPE">Int</span> \i<span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span> \<span class="highlite-REGEX_DELIMITER">s {</span><span class="highlite-REGEX_SPECIAL"> </span><span class="highlite-REGEX_LITERAL">s</span><span class="highlite-REGEX_SPECIAL"> </span><span class="highlite-REGEX_LITERAL">x</span><span class="highlite-REGEX_SPECIAL"> (</span><span class="highlite-REGEX_LITERAL">1</span><span class="highlite-REGEX_SPECIAL">..</span><span class="highlite-REGEX_LITERAL">10</span><span class="highlite-REGEX_SPECIAL">).</span><span class="highlite-REGEX_LITERAL">roll</span><span class="highlite-REGEX_SPECIAL"> </span><span class="highlite-REGEX_LITERAL">mod</span><span class="highlite-REGEX_SPECIAL"> </span><span class="highlite-REGEX_LITERAL">i</span><span class="highlite-REGEX_SPECIAL"> </span><span class="highlite-REGEX_DELIMITER">}</span>; <span class="highlite-COMMENT"># OUTPUT: «tenten␤» </span> <span class="highlite-KEYWORD">sub</span> g(<span class="highlite-TYPE">Num</span> <span class="highlite-NAME_SCALAR">$i</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$s</span>) { <span class="highlite-NAME_SCALAR">$s</span> <span class="highlite-OPERATOR">~</span> <span class="highlite-NAME_SCALAR">$i</span> } <span class="highlite-COMMENT"># play-with-tens(&amp;g); # Constraint type check failed</span></pre> </div> </div> <h2 id="Constraining_return_types" class="raku-h2"><a href="#Signature_literals" title="go to top of document">Constraining return types<a class="raku-anchor" title="direct link" href="#Constraining_return_types">§</a></a></h2> <p>There are multiple ways to constrain return types on a <a href="/type/Routine"><code>Routine</code></a>. All versions below are currently valid and will force a type check on successful execution of a routine.</p><p><a href="/type/Nil"><code>Nil</code></a> and <a href="/type/Failure"><code>Failure</code></a> are always allowed as return types, regardless of any type constraint. This allows <a href="/type/Failure"><code>Failure</code></a> to be returned and passed on down the call chain.</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> foo(<span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Int</span>) { <span class="highlite-TYPE">Nil</span> }; <span class="highlite-ROUTINE">say</span> foo.<span class="highlite-ROUTINE">raku</span>; <span class="highlite-COMMENT"># OUTPUT: «Nil␤»</span></pre> </div> </div> <p>Type captures are not supported.</p><p><a name="index-entry--->" class="index-entry"></a> <a name="index-entry-Return_type_arrow" class="index-entry"></a></p> <h3 id="Return_type_arrow:_--&gt;" class="raku-h3"><a href="#Signature_literals" title="go to top of document">Return type arrow: <code>--</code>&gt;<a class="raku-anchor" title="direct link" href="#Return_type_arrow:_--&gt;">§</a></a></h3> <p>This form of indicating return types (or constants) in the signature is preferred, since it can handle constant values while the others can't. For consistency, it is the only form accepted on this site.</p><p>The return type arrow has to be placed at the end of the parameter list, with or without a <code>,</code> before it.</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> greeting1(<span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$name</span> <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Str</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">Hello, </span><span class="highlite-NAME_SCALAR">$name</span><span class="highlite-STRING_DELIMITER">&quot;</span> } <span class="highlite-COMMENT"># Valid </span><span class="highlite-KEYWORD">sub</span> greeting2(<span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$name</span><span class="highlite-OPERATOR">,</span> <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Str</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">Hello, </span><span class="highlite-NAME_SCALAR">$name</span><span class="highlite-STRING_DELIMITER">&quot;</span> } <span class="highlite-COMMENT"># Valid </span> <span class="highlite-KEYWORD">sub</span> favorite-number1(<span class="highlite-KEYWORD">--&gt;</span> 42) { } <span class="highlite-COMMENT"># OUTPUT: 42 </span><span class="highlite-KEYWORD">sub</span> favorite-number2(<span class="highlite-KEYWORD">--&gt;</span> 42) { <span class="highlite-KEYWORD">return</span> } <span class="highlite-COMMENT"># OUTPUT: 42 </span></pre> </div> </div> <p>If the type constraint is a constant expression, it is used as the return value of the routine. Any return statement in that routine has to be argumentless.</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> foo(<span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$word</span> <span class="highlite-KEYWORD">--&gt;</span> 123) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$word</span>; <span class="highlite-KEYWORD">return</span>; } <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$value</span> <span class="highlite-OPERATOR">=</span> foo(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-COMMENT"># OUTPUT: hello </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$value</span>; <span class="highlite-COMMENT"># OUTPUT: 123 </span></pre> </div> </div> <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-COMMENT"># The code below will not compile </span><span class="highlite-KEYWORD">sub</span> foo(<span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$word</span> <span class="highlite-KEYWORD">--&gt;</span> 123) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$word</span>; <span class="highlite-KEYWORD">return</span> <span class="highlite-NAME_SCALAR">$word</span>; } <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$value</span> <span class="highlite-OPERATOR">=</span> foo(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$value</span>; </pre> </div> </div> <h3 id="returns" class="raku-h3"><a href="#Signature_literals" title="go to top of document"><code>returns</code><a class="raku-anchor" title="direct link" href="#returns">§</a></a></h3> <p>The keyword <code>returns</code> following a signature declaration has the same function as <code>--&gt;</code> with the caveat that this form does not work with constant values. You cannot use it in a block either. That is why the pointy arrow form is always preferred.</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> greeting(<span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$name</span>) <span class="highlite-KEYWORD">returns</span> <span class="highlite-TYPE">Str</span> { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">Hello, </span><span class="highlite-NAME_SCALAR">$name</span><span class="highlite-STRING_DELIMITER">&quot;</span> } <span class="highlite-COMMENT"># Valid </span></pre> </div> </div> <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> favorite-number <span class="highlite-KEYWORD">returns</span> 42 { } <span class="highlite-COMMENT"># This will fail. </span></pre> </div> </div> <h3 id="of" class="raku-h3"><a href="#Signature_literals" title="go to top of document"><code>of</code><a class="raku-anchor" title="direct link" href="#of">§</a></a></h3> <p><code>of</code> is just the real name of the <code>returns</code> keyword.</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> foo() <span class="highlite-KEYWORD">of</span> <span class="highlite-TYPE">Int</span> { 42 }; <span class="highlite-COMMENT"># Valid </span></pre> </div> </div> <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> foo() <span class="highlite-KEYWORD">of</span> 42 { }; <span class="highlite-COMMENT"># This will fail. </span></pre> </div> </div> <h3 id="prefix(C-like)_form" class="raku-h3"><a href="#Signature_literals" title="go to top of document">prefix(C-like) form<a class="raku-anchor" title="direct link" href="#prefix(C-like)_form">§</a></a></h3> <!-- defnmark prefix(C-like)_form 3 --> <p>This is similar to placing type constraints on variables like <code>my Type $var = 20;</code>, except the <code>$var</code> is a definition for a routine.</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-KEYWORD">sub</span> bar { 1 }; <span class="highlite-COMMENT"># Valid </span></pre> </div> </div> <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> 42 <span class="highlite-KEYWORD">sub</span> bad-answer {}; <span class="highlite-COMMENT"># This will fail. </span></pre> </div> </div> <h2 id="Coercion_type" class="raku-h2"><a name="index-entry-Coercion_type-Coercion_type" data-indexedheader="Language;Coercion type"></a><a href="#Signature_literals" title="go to top of document">Coercion type<a class="raku-anchor" title="direct link" href="#Coercion_type">§</a></a></h2> <!-- defnmark Coercion_type 2 --> <p>To accept one type but coerce it automatically to another, use the accepted type as an argument to the target type. If the accepted type is <a href="/type/Any"><code>Any</code></a> it can be omitted.</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> <span class="highlite-ROUTINE">f</span>(<span class="highlite-TYPE">Int</span>(<span class="highlite-TYPE">Str</span>) <span class="highlite-NAME_SCALAR">$want-int</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span>() <span class="highlite-NAME_SCALAR">$want-str</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$want-int</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-NAME_SCALAR">$want-str</span>.^<span class="highlite-ROUTINE">name</span> } <span class="highlite-ROUTINE">f</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">10</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 10; <span class="highlite-COMMENT"># OUTPUT: «Int Str␤» </span> <span class="highlite-KEYWORD">sub</span> foo(<span class="highlite-TYPE">Date</span>(<span class="highlite-TYPE">Str</span>) <span class="highlite-NAME_SCALAR">$d</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$d</span>.^<span class="highlite-ROUTINE">name</span>; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$d</span> }; foo <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">2016-12-01</span><span class="highlite-STRING_DELIMITER">&quot;</span>; <span class="highlite-COMMENT"># OUTPUT: «Date␤2016-12-01␤»</span></pre> </div> </div> <p>The coercion is performed by calling the method with the name of the type to coerce to, if it exists. In this example, we're calling the builtin method <a href="/type/Date"><code>Date</code></a> on the <a href="/type/Str"><code>Str</code></a> class. The method is assumed to return the correct type—no additional checks on the result are currently performed.</p><p>Coercion can also be performed on return types:</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> square-str (<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Str</span>(<span class="highlite-TYPE">Int</span>)) { <span class="highlite-NAME_SCALAR">$x</span>² } <span class="highlite-KEYWORD">for</span> 2,4<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span>² <span class="highlite-OPERATOR">…</span> 256 <span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-NAME_SCALAR">$a</span> { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">² is </span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> square-str( <span class="highlite-NAME_SCALAR">$a</span> ).<span class="highlite-ROUTINE">chars</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING"> figures long</span><span class="highlite-STRING_DELIMITER">&quot;</span>; } <span class="highlite-COMMENT"># OUTPUT: «2² is 1 figures long␤ </span><span class="highlite-COMMENT"># 4² is 2 figures long␤ </span><span class="highlite-COMMENT"># 16² is 3 figures long␤ </span><span class="highlite-COMMENT"># 256² is 5 figures long␤» </span></pre> </div> </div> <p>In this example, coercing the return type to <a href="/type/Str"><code>Str</code></a> allows us to directly apply string methods, such as the number of characters.</p><p><strong>Note</strong>: The appropriate method must be available on the argument, so be careful when trying to coerce custom types.</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> Foo { } <span class="highlite-KEYWORD">sub</span> bar(Foo(<span class="highlite-TYPE">Int</span>) <span class="highlite-NAME_SCALAR">$x</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$x</span> } bar(3); <span class="highlite-COMMENT"># OUTPUT: «Impossible coercion from 'Int' into 'Foo': no acceptable coercion method found␤» </span></pre> </div> </div> <p><a name="index-entry-*@" class="index-entry"></a> <a name="index-entry-*%" class="index-entry"></a> <a name="index-entry-slurpy_argument" class="index-entry"></a></p> <h1 id="Slurpy_parameters" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Slurpy parameters<a class="raku-anchor" title="direct link" href="#Slurpy_parameters">§</a></a></h1> <p>A function is <a name="index-entry-variadic-variadic" class="index-entry"><span class="glossary-entry" data-index-text="⦃〚Reference〛 〚variadic〛⦄">variadic</span></a> if it can take a varying number of arguments; that is, its arity is not fixed. Therefore, <a href="/language/signatures#Optional_and_mandatory_arguments">optional</a>, named, and slurpy parameters make routines that use them <em>variadic</em>, and by extension are called variadic arguments. Here we will focus on slurpy parameters, or simply <em>slurpies</em>.</p><p>An array or hash parameter can be marked as <em>slurpy</em> by leading single (*) or double asterisk (**) or a leading plus (+). A slurpy parameter can bind to an arbitrary number of arguments (zero or more), and it will result in a type that is compatible with the sigil.</p><p>These are called &quot;slurpy&quot; because they slurp up any remaining arguments to a function, like someone slurping up noodles.</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">$sig1</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_ARRAY">@b</span>); <span class="highlite-COMMENT"># exactly two arguments, second must be Positional </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$sig2</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@b</span>); <span class="highlite-COMMENT"># at least one argument, @b slurps up any beyond that </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$sig3</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_HASH">%h</span>); <span class="highlite-COMMENT"># no positional arguments, but any number </span> <span class="highlite-COMMENT"># of named arguments </span> <span class="highlite-KEYWORD">sub</span> one-arg (@) { } <span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">slurpy</span> (<span class="highlite-OPERATOR">*</span>@) { } one-arg (5<span class="highlite-OPERATOR">,</span> 6<span class="highlite-OPERATOR">,</span> 7); <span class="highlite-COMMENT"># ok, same as one-arg((5, 6, 7)) </span><span class="highlite-ROUTINE">slurpy</span> (5<span class="highlite-OPERATOR">,</span> 6<span class="highlite-OPERATOR">,</span> 7); <span class="highlite-COMMENT"># ok </span><span class="highlite-ROUTINE">slurpy</span> 5<span class="highlite-OPERATOR">,</span> 6<span class="highlite-OPERATOR">,</span> 7 ; <span class="highlite-COMMENT"># ok </span><span class="highlite-COMMENT"># one-arg(5, 6, 7) ; # X::TypeCheck::Argument </span><span class="highlite-COMMENT"># one-arg 5, 6, 7 ; # X::TypeCheck::Argument </span> <span class="highlite-KEYWORD">sub</span> named-names (<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_HASH">%named-args</span>) { <span class="highlite-NAME_HASH">%named-args</span>.<span class="highlite-ROUTINE">keys</span> }; <span class="highlite-ROUTINE">say</span> named-names :foo(42) :bar&lt;baz&gt;; <span class="highlite-COMMENT"># OUTPUT: «foo bar␤» </span></pre> </div> </div> <p>Positional and named slurpies can be combined; named arguments (i.e., <a href="/type/Pair"><code>Pair</code></a>s) are collected in the specified hash, positional arguments in the array:</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> combined-slurpy (<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_HASH">%h</span>) { { array <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-NAME_ARRAY">@a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-ROUTINE">hash</span> <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-NAME_HASH">%h</span> } } <span class="highlite-COMMENT"># or: sub combined-slurpy (*%h, *@a) { ... } </span> <span class="highlite-ROUTINE">say</span> combined-slurpy(<span class="highlite-ROUTINE">one</span> <span class="highlite-OPERATOR">=&gt;</span> 1<span class="highlite-OPERATOR">,</span> two <span class="highlite-OPERATOR">=&gt;</span> 2); <span class="highlite-COMMENT"># OUTPUT: «{array =&gt; [], hash =&gt; {one =&gt; 1, two =&gt; 2}}␤» </span><span class="highlite-ROUTINE">say</span> combined-slurpy(<span class="highlite-ROUTINE">one</span> <span class="highlite-OPERATOR">=&gt;</span> 1<span class="highlite-OPERATOR">,</span> two <span class="highlite-OPERATOR">=&gt;</span> 2<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 4); <span class="highlite-COMMENT"># OUTPUT: «{array =&gt; [3 4], hash =&gt; {one =&gt; 1, two =&gt; 2}}␤» </span><span class="highlite-ROUTINE">say</span> combined-slurpy(<span class="highlite-ROUTINE">one</span> <span class="highlite-OPERATOR">=&gt;</span> 1<span class="highlite-OPERATOR">,</span> two <span class="highlite-OPERATOR">=&gt;</span> 2<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 4<span class="highlite-OPERATOR">,</span> five <span class="highlite-OPERATOR">=&gt;</span> 5); <span class="highlite-COMMENT"># OUTPUT: «{array =&gt; [3 4], hash =&gt; {five =&gt; 5, one =&gt; 1, two =&gt; 2}}␤» </span><span class="highlite-ROUTINE">say</span> combined-slurpy(<span class="highlite-ROUTINE">one</span> <span class="highlite-OPERATOR">=&gt;</span> 1<span class="highlite-OPERATOR">,</span> two <span class="highlite-OPERATOR">=&gt;</span> 2<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 4<span class="highlite-OPERATOR">,</span> five <span class="highlite-OPERATOR">=&gt;</span> 5<span class="highlite-OPERATOR">,</span> 6); <span class="highlite-COMMENT"># OUTPUT: «{array =&gt; [3 4 6], hash =&gt; {five =&gt; 5, one =&gt; 1, two =&gt; 2}}␤» </span></pre> </div> </div> <p>Note that positional parameters aren't allowed after slurpy (or, in fact, after any type of variadic) parameters:</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-OPERATOR">:</span>(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@args</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$last</span>); <span class="highlite-COMMENT"># ===SORRY!=== Error while compiling: </span><span class="highlite-COMMENT"># Cannot put required parameter $last after variadic parameters </span></pre> </div> </div> <p>Normally a slurpy parameter will create an <a href="/type/Array"><code>Array</code></a> (or compatible type), create a new <a href="/type/Scalar"><code>Scalar</code></a> container for each argument, and assign the value from each argument to those <a href="/type/Scalar"><code>Scalar</code></a>s. If the original argument also had an intermediary <a href="/type/Scalar"><code>Scalar</code></a> it is bypassed during this process, and is not available inside the called function.</p><p>Sigiled parameters will always impose a context on the collected arguments. Sigilless parameters can also be used slurpily, preceded by a + sign, to work with whatever initial type they started with:</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> zipi( +zape ) { zape.^<span class="highlite-ROUTINE">name</span> <span class="highlite-OPERATOR">=&gt;</span> zape }; <span class="highlite-ROUTINE">say</span> zipi( <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">Hey </span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-COMMENT"># OUTPUT: «List =&gt; (Hey )␤» </span><span class="highlite-ROUTINE">say</span> zipi( 1.<span class="highlite-OPERATOR">..</span><span class="highlite-OPERATOR">*</span> ); <span class="highlite-COMMENT"># OUTPUT: «Seq =&gt; (...)␤» </span></pre> </div> </div> <p>Slurpy parameters have special behaviors when combined with some <a href="#Parameter_traits_and_modifiers">traits and modifiers</a>, as described in <a href="/language/signatures#Types_of_slurpy_array_parameters">the section on slurpy array parameters</a>.</p><p>Methods automatically get a <code>*%_</code> slurpy named parameter added if they don't have another slurpy named parameter declared.</p> <h1 id="Types_of_slurpy_array_parameters" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Types of slurpy array parameters<a class="raku-anchor" title="direct link" href="#Types_of_slurpy_array_parameters">§</a></a></h1> <p>There are three variations to slurpy array parameters.</p> <ul class="rakudoc-item"> <li><p>The single asterisk form flattens passed arguments.</p></li> <li><p>The double asterisk form does not flatten arguments.</p></li> <li><p>The plus form flattens according to the single argument rule.</p></li> </ul> <p>Each will be described in detail in the next few sections. As the difference between each is a bit nuanced, examples are provided for each to demonstrate how each slurpy convention varies from the others.</p> <h2 id="Flattened_slurpy" class="raku-h2"><a href="#Signature_literals" title="go to top of document">Flattened slurpy<a class="raku-anchor" title="direct link" href="#Flattened_slurpy">§</a></a></h2> <p>Slurpy parameters declared with one asterisk will flatten arguments by dissolving one or more layers of bare <a href="/type/Iterable"><code>Iterable</code></a>s.</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">@array</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a b c</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$list</span> <span class="highlite-OPERATOR">:=</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">d e f</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-KEYWORD">sub</span> a(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@a</span>) { <span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-ROUTINE">raku</span>.<span class="highlite-ROUTINE">say</span> }; a(<span class="highlite-NAME_ARRAY">@array</span>); <span class="highlite-COMMENT"># OUTPUT: «[&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]␤» </span>a(1<span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$list</span><span class="highlite-OPERATOR">,</span> [2<span class="highlite-OPERATOR">,</span> 3]); <span class="highlite-COMMENT"># OUTPUT: «[1, &quot;d&quot;, &quot;e&quot;, &quot;f&quot;, 2, 3]␤» </span>a([1<span class="highlite-OPERATOR">,</span> 2]); <span class="highlite-COMMENT"># OUTPUT: «[1, 2]␤» </span>a(1<span class="highlite-OPERATOR">,</span> [1<span class="highlite-OPERATOR">,</span> 2]<span class="highlite-OPERATOR">,</span> ([3<span class="highlite-OPERATOR">,</span> 4]<span class="highlite-OPERATOR">,</span> 5)); <span class="highlite-COMMENT"># OUTPUT: «[1, 1, 2, 3, 4, 5]␤» </span>a((<span class="highlite-NAME_SCALAR">$_</span> <span class="highlite-KEYWORD">for</span> 1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3)); <span class="highlite-COMMENT"># OUTPUT: «[1, 2, 3]␤» </span></pre> </div> </div> <p>A single asterisk slurpy flattens all given iterables, effectively hoisting any object created with commas up to the top level.</p> <h2 id="Unflattened_slurpy" class="raku-h2"><a name="index-entry-**@-Unflattened_slurpy" data-indexedheader="Syntax;**@"></a><a href="#Signature_literals" title="go to top of document">Unflattened slurpy<a class="raku-anchor" title="direct link" href="#Unflattened_slurpy">§</a></a></h2> <!-- defnmark Unflattened_slurpy 2 --> <p>Slurpy parameters declared with two stars do not flatten any <a href="/type/Iterable"><code>Iterable</code></a> arguments within the list, but keep the arguments more or less as-is:</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">@array</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a b c</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$list</span> <span class="highlite-OPERATOR">:=</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">d e f</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-KEYWORD">sub</span> b(<span class="highlite-OPERATOR">**</span><span class="highlite-NAME_ARRAY">@b</span>) { <span class="highlite-NAME_ARRAY">@b</span>.<span class="highlite-ROUTINE">raku</span>.<span class="highlite-ROUTINE">say</span> }; b(<span class="highlite-NAME_ARRAY">@array</span>); <span class="highlite-COMMENT"># OUTPUT: «[[&quot;a&quot;, &quot;b&quot;, &quot;c&quot;],]␤» </span>b(1<span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$list</span><span class="highlite-OPERATOR">,</span> [2<span class="highlite-OPERATOR">,</span> 3]); <span class="highlite-COMMENT"># OUTPUT: «[1, (&quot;d&quot;, &quot;e&quot;, &quot;f&quot;), [2, 3]]␤» </span>b([1<span class="highlite-OPERATOR">,</span> 2]); <span class="highlite-COMMENT"># OUTPUT: «[[1, 2],]␤» </span>b(1<span class="highlite-OPERATOR">,</span> [1<span class="highlite-OPERATOR">,</span> 2]<span class="highlite-OPERATOR">,</span> ([3<span class="highlite-OPERATOR">,</span> 4]<span class="highlite-OPERATOR">,</span> 5)); <span class="highlite-COMMENT"># OUTPUT: «[1, [1, 2], ([3, 4], 5)]␤» </span>b((<span class="highlite-NAME_SCALAR">$_</span> <span class="highlite-KEYWORD">for</span> 1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3)); <span class="highlite-COMMENT"># OUTPUT: «[(1, 2, 3),]␤» </span></pre> </div> </div> <p>The double asterisk slurpy hides the nested comma objects and leaves them as-is in the slurpy array.</p><p><a name="index-entry-+_(Single_argument_rule_slurpy)" class="index-entry"></a></p> <h2 id="Single_argument_rule_slurpy" class="raku-h2"><a href="#Signature_literals" title="go to top of document">Single argument rule slurpy<a class="raku-anchor" title="direct link" href="#Single_argument_rule_slurpy">§</a></a></h2> <p>A slurpy parameter created using a plus engages the <em>&quot;single argument rule&quot;</em>, which decides how to handle the slurpy argument based upon context. Basically, if only a single argument is passed and that argument is <a href="/type/Iterable"><code>Iterable</code></a>, that argument is used to fill the slurpy parameter array. In any other case, <code>+@</code> works like <code>**@</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_ARRAY">@array</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a b c</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$list</span> <span class="highlite-OPERATOR">:=</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">d e f</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-KEYWORD">sub</span> c(<span class="highlite-OPERATOR">+</span><span class="highlite-NAME_ARRAY">@b</span>) { <span class="highlite-NAME_ARRAY">@b</span>.<span class="highlite-ROUTINE">raku</span>.<span class="highlite-ROUTINE">say</span> }; c(<span class="highlite-NAME_ARRAY">@array</span>); <span class="highlite-COMMENT"># OUTPUT: «[&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]␤» </span>c(1<span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$list</span><span class="highlite-OPERATOR">,</span> [2<span class="highlite-OPERATOR">,</span> 3]); <span class="highlite-COMMENT"># OUTPUT: «[1, (&quot;d&quot;, &quot;e&quot;, &quot;f&quot;), [2, 3]]␤» </span>c([1<span class="highlite-OPERATOR">,</span> 2]); <span class="highlite-COMMENT"># OUTPUT: «[1, 2]␤» </span>c(1<span class="highlite-OPERATOR">,</span> [1<span class="highlite-OPERATOR">,</span> 2]<span class="highlite-OPERATOR">,</span> ([3<span class="highlite-OPERATOR">,</span> 4]<span class="highlite-OPERATOR">,</span> 5)); <span class="highlite-COMMENT"># OUTPUT: «[1, [1, 2], ([3, 4], 5)]␤» </span>c((<span class="highlite-NAME_SCALAR">$_</span> <span class="highlite-KEYWORD">for</span> 1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3)); <span class="highlite-COMMENT"># OUTPUT: «[1, 2, 3]␤» </span></pre> </div> </div> <p>For additional discussion and examples, see <a href="/language/functions#Slurpy_conventions">Slurpy Conventions for Functions</a>.</p><p><a name="index-entry-Type_capture" class="index-entry"></a></p> <h1 id="Type_captures" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Type captures<a class="raku-anchor" title="direct link" href="#Type_captures">§</a></a></h1> <p>Type captures allow deferring the specification of a type constraint to the time the function is called. They allow referring to a type both in the signature and the function body.</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> <span class="highlite-ROUTINE">f</span>(::T <span class="highlite-NAME_SCALAR">$p1</span><span class="highlite-OPERATOR">,</span> <span class="highlite-ROUTINE">T</span> <span class="highlite-NAME_SCALAR">$p2</span><span class="highlite-OPERATOR">,</span> ::C){ <span class="highlite-COMMENT"># $p1 and $p2 are of the same type T, that we don't know yet </span> <span class="highlite-COMMENT"># C will hold a type we derive from a type object or value </span> <span class="highlite-KEYWORD">my</span> C <span class="highlite-NAME_SCALAR">$division</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$p1</span> <span class="highlite-OPERATOR">/</span> <span class="highlite-NAME_SCALAR">$p2</span>; <span class="highlite-KEYWORD">return</span> <span class="highlite-KEYWORD">sub</span> (<span class="highlite-ROUTINE">T</span> <span class="highlite-NAME_SCALAR">$p1</span>) { <span class="highlite-NAME_SCALAR">$division</span> <span class="highlite-OPERATOR">*</span> <span class="highlite-NAME_SCALAR">$p1</span>; } } <span class="highlite-COMMENT"># The first parameter is Int and so must be the 2nd. </span><span class="highlite-COMMENT"># We derive the 3rd type from calling the operator that is used in &amp;f. </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_CODE">&amp;s</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-ROUTINE">f</span>(10<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span>.<span class="highlite-ROUTINE">new</span> <span class="highlite-OPERATOR">/</span> <span class="highlite-TYPE">Int</span>.<span class="highlite-ROUTINE">new</span>); <span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">s</span>(2); <span class="highlite-COMMENT"># 10 / 2 * 2 == 10</span></pre> </div> </div> <p><a name="index-entry-positional_argument" class="index-entry"></a> <a name="index-entry-named_argument" class="index-entry"></a></p> <h1 id="Positional_vs._named_arguments" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Positional vs. named arguments<a class="raku-anchor" title="direct link" href="#Positional_vs._named_arguments">§</a></a></h1> <p>An argument can be <em>positional</em> or <em>named</em>. By default, arguments are positional, except slurpy hash and arguments marked with a leading colon <code>:</code>. The latter is called a <a href="/type/Pair">colon-pair</a>. Check the following signatures and what they denote:</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-NAME_SCALAR">$sig1</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-NAME_SCALAR">$a</span>); <span class="highlite-COMMENT"># a positional argument </span><span class="highlite-NAME_SCALAR">$sig2</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$a</span>); <span class="highlite-COMMENT"># a named argument of name 'a' </span><span class="highlite-NAME_SCALAR">$sig3</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@a</span>); <span class="highlite-COMMENT"># a slurpy positional argument </span><span class="highlite-NAME_SCALAR">$sig4</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_HASH">%h</span>); <span class="highlite-COMMENT"># a slurpy named argument </span></pre> </div> </div> <p>On the caller side, positional arguments are passed in the same order as the arguments are declared.</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> <span class="highlite-ROUTINE">pos</span>(<span class="highlite-NAME_SCALAR">$x</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$y</span>) { <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">x=</span><span class="highlite-NAME_SCALAR">$x</span><span class="highlite-STRING"> y=</span><span class="highlite-NAME_SCALAR">$y</span><span class="highlite-STRING_DELIMITER">&quot;</span> } <span class="highlite-ROUTINE">pos</span>(4<span class="highlite-OPERATOR">,</span> 5); <span class="highlite-COMMENT"># OUTPUT: «x=4 y=5»</span></pre> </div> </div> <p>In the case of named arguments and parameters, only the name is used for mapping arguments to parameters. If a fat arrow is used to construct a <a href="/type/Pair"><code>Pair</code></a> only those with valid identifiers as keys are recognized as named arguments.</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> <span class="highlite-ROUTINE">named</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$x</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$y</span>) { <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">x=</span><span class="highlite-NAME_SCALAR">$x</span><span class="highlite-STRING"> y=</span><span class="highlite-NAME_SCALAR">$y</span><span class="highlite-STRING_DELIMITER">&quot;</span> } <span class="highlite-ROUTINE">named</span>( y <span class="highlite-OPERATOR">=&gt;</span> 5<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">x</span> <span class="highlite-OPERATOR">=&gt;</span> 4); <span class="highlite-COMMENT"># OUTPUT: «x=4 y=5» </span></pre> </div> </div> <p>You can invoke the routine using a variable with the same name as the named argument; in that case <code>:</code> will be used for the invocation so that the name of the variable is understood as the key of the argument.</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> named-shortcut( <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$shortcut</span> ) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">Looks like </span><span class="highlite-NAME_SCALAR">$shortcut</span><span class="highlite-STRING_DELIMITER">&quot;</span> } named-shortcut( shortcut <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">to here</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-COMMENT"># OUTPUT: «Looks like to here␤» </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$shortcut</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">Þor is mighty</span><span class="highlite-STRING_DELIMITER">&quot;</span>; named-shortcut( <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$shortcut</span> ); <span class="highlite-COMMENT"># OUTPUT: «Looks like Þor is mighty␤»</span></pre> </div> </div> <p>It is possible to have a different name for a named argument than the variable name:</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> <span class="highlite-ROUTINE">named</span>(:official(<span class="highlite-NAME_SCALAR">$private</span>)) { <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">Official business!</span><span class="highlite-STRING_DELIMITER">&quot;</span> <span class="highlite-KEYWORD">if</span> <span class="highlite-NAME_SCALAR">$private</span> } <span class="highlite-ROUTINE">named</span> :official;</pre> </div> </div> <p><a name="index-entry-argument_aliases" class="index-entry"></a></p> <h1 id="Argument_aliases" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Argument aliases<a class="raku-anchor" title="direct link" href="#Argument_aliases">§</a></a></h1> <p>The <a href="/type/Pair">colon-pair</a> syntax can be used to provide aliases for arguments:</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> alias-named(:color(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$colour</span>)<span class="highlite-OPERATOR">,</span> :type(:class(<span class="highlite-NAME_SCALAR">$kind</span>))) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$colour</span> <span class="highlite-OPERATOR">~</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING"> </span><span class="highlite-STRING_DELIMITER">&quot;</span> <span class="highlite-OPERATOR">~</span> <span class="highlite-NAME_SCALAR">$kind</span> } alias-named(color <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">red</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-ROUTINE">type</span> <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">A</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-COMMENT"># both names can be used </span>alias-named(colour <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">green</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-ROUTINE">type</span> <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">B</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-COMMENT"># more than two names are ok </span>alias-named(color <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">white</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-KEYWORD">class</span> <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">C</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-COMMENT"># every alias is independent</span></pre> </div> </div> <p>The presence of the colon <code>:</code> will decide whether we are creating a new named argument or not. <code>:$colour</code> will not only be the name of the aliased variable, but also a new named argument (used in the second invocation). However, <code>$kind</code> will just be the name of the aliased variable, that does not create a new named argument. More uses of aliases can be found in <a href="/language/create-cli#sub_MAIN">sub MAIN</a>.</p><p>A function with named arguments can be called dynamically, dereferencing a <a href="/type/Pair"><code>Pair</code></a> with <code>|</code> to turn it into a named argument.</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">multi</span> <span class="highlite-ROUTINE">f</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$named</span>) { <span class="highlite-ROUTINE">note</span> <span class="highlite-NAME_CODE">&amp;?ROUTINE</span>.<span class="highlite-ROUTINE">signature</span> }; <span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">f</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$also-named</span>) { <span class="highlite-ROUTINE">note</span> <span class="highlite-NAME_CODE">&amp;?ROUTINE</span>.<span class="highlite-ROUTINE">signature</span> }; <span class="highlite-KEYWORD">for</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">named</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">also-named</span><span class="highlite-STRING_DELIMITER">'</span> <span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-NAME_SCALAR">$n</span> { <span class="highlite-ROUTINE">f</span>(<span class="highlite-OPERATOR">|</span>(<span class="highlite-NAME_SCALAR">$n</span> <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-ROUTINE">rand</span>)) <span class="highlite-COMMENT"># OUTPUT: «(:$named)␤(:$also-named)␤» </span>} <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$pair</span> <span class="highlite-OPERATOR">=</span> :named(1); <span class="highlite-ROUTINE">f</span> <span class="highlite-OPERATOR">|</span><span class="highlite-NAME_SCALAR">$pair</span>; <span class="highlite-COMMENT"># OUTPUT: «(:$named)␤»</span></pre> </div> </div> <p>The same can be used to convert a <a href="/type/Hash"><code>Hash</code></a> into named arguments.</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> <span class="highlite-ROUTINE">f</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$also-named</span>) { <span class="highlite-ROUTINE">note</span> <span class="highlite-NAME_CODE">&amp;?ROUTINE</span>.<span class="highlite-ROUTINE">signature</span> }; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_HASH">%pairs</span> <span class="highlite-OPERATOR">=</span> also-named <span class="highlite-OPERATOR">=&gt;</span> 4; <span class="highlite-ROUTINE">f</span> <span class="highlite-OPERATOR">|</span><span class="highlite-NAME_HASH">%pairs</span>; <span class="highlite-COMMENT"># OUTPUT: «(:$also-named)␤»</span></pre> </div> </div> <p>A <a href="/type/Hash"><code>Hash</code></a> that contains a list may prove problematic when slipped into named arguments. To avoid the extra layer of containers coerce to <a href="/type/Map"><code>Map</code></a> before slipping.</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> C { <span class="highlite-KEYWORD">has</span> <span class="highlite-NAME_SCALAR">$.x</span>; <span class="highlite-KEYWORD">has</span> <span class="highlite-NAME_SCALAR">$.y</span>; <span class="highlite-KEYWORD">has</span> <span class="highlite-NAME_ARRAY">@.z</span> }; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_HASH">%h</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">x y z</span><span class="highlite-STRING_DELIMITER">&gt;</span> <span class="highlite-OPERATOR">Z</span>=<span class="highlite-OPERATOR">&gt;</span> (5<span class="highlite-OPERATOR">,</span> 20<span class="highlite-OPERATOR">,</span> [1,2]); <span class="highlite-ROUTINE">say</span> C.<span class="highlite-ROUTINE">new</span>(<span class="highlite-OPERATOR">|</span><span class="highlite-NAME_HASH">%h</span>.<span class="highlite-TYPE">Map</span>); <span class="highlite-COMMENT"># OUTPUT: «C.new(x =&gt; 5, y =&gt; 20, z =&gt; [1, 2])␤»</span></pre> </div> </div> <p>You can create as many aliases to a named argument as you want:</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> alias-named(:color(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$colour</span>)<span class="highlite-OPERATOR">,</span> :variety(:style(:sort(:type(:class(<span class="highlite-NAME_SCALAR">$kind</span>)))))) { <span class="highlite-KEYWORD">return</span> <span class="highlite-NAME_SCALAR">$colour</span> <span class="highlite-OPERATOR">~</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING"> </span><span class="highlite-STRING_DELIMITER">&quot;</span> <span class="highlite-OPERATOR">~</span> <span class="highlite-NAME_SCALAR">$kind</span> } <span class="highlite-ROUTINE">say</span> alias-named(color <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">red</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> style <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">A</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-ROUTINE">say</span> alias-named(colour <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">green</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> variety <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">B</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-ROUTINE">say</span> alias-named(color <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">white</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-KEYWORD">class</span> <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">C</span><span class="highlite-STRING_DELIMITER">&quot;</span>); </pre> </div> </div> <p>You can create named arguments that do not create any variables by making the argument an alias for an <a href="#index-entry-anonymous_arguments">anonymous argument</a>. This can be useful when using named arguments solely as a means of selecting a <code>multi</code> candidate, which is often the case with traits, for instance:</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-COMMENT"># Timestamps calls to a routine. </span><span class="highlite-KEYWORD">multi</span> trait_mod:<span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">is</span><span class="highlite-STRING_DELIMITER">&gt;</span>(Routine:D <span class="highlite-NAME_SCALAR">$r</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">raw</span><span class="highlite-OPERATOR">,</span> :timestamped($)<span class="highlite-OPERATOR">!</span>) { <span class="highlite-NAME_SCALAR">$r</span> <span class="highlite-KEYWORD">does</span> <span class="highlite-KEYWORD">my</span> <span class="highlite-KEYWORD">role</span> timestamped { <span class="highlite-KEYWORD">has</span> Instant:D <span class="highlite-NAME_ARRAY">@.timestamps</span> }; <span class="highlite-NAME_SCALAR">$r</span>.wrap: <span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-OPERATOR">|</span> { <span class="highlite-KEYWORD">ENTER</span> <span class="highlite-NAME_SCALAR">$r</span>.timestamps.push: <span class="highlite-ROUTINE">now</span>; <span class="highlite-ROUTINE">callsame</span> }; } <span class="highlite-KEYWORD">sub</span> foo <span class="highlite-KEYWORD">is</span> timestamped { } foo; <span class="highlite-ROUTINE">say</span> +<span class="highlite-NAME_CODE">&amp;foo</span>.?timestamps; <span class="highlite-COMMENT"># OUTPUT: «1␤» </span></pre> </div> </div> <p><a name="index-entry-optional_argument" class="index-entry"></a></p> <h1 id="Optional_and_mandatory_arguments" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Optional and mandatory arguments<a class="raku-anchor" title="direct link" href="#Optional_and_mandatory_arguments">§</a></a></h1> <p>Positional parameters are mandatory by default, and can be made optional with a default value or a trailing question mark:</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-NAME_SCALAR">$sig1</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$id</span>); <span class="highlite-COMMENT"># required parameter </span><span class="highlite-NAME_SCALAR">$sig2</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-NAME_SCALAR">$base</span> <span class="highlite-OPERATOR">=</span> 10); <span class="highlite-COMMENT"># optional parameter, default value 10 </span><span class="highlite-NAME_SCALAR">$sig3</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$x</span>?); <span class="highlite-COMMENT"># optional parameter, default is the Int type object </span></pre> </div> </div> <p><a name="index-entry-mandatory_named_argument" class="index-entry"></a> Named parameters are optional by default, and can be made mandatory with a trailing exclamation mark:</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-NAME_SCALAR">$sig1</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_HASH">%config</span>); <span class="highlite-COMMENT"># optional parameter </span><span class="highlite-NAME_SCALAR">$sig2</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$debug</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">False</span>); <span class="highlite-COMMENT"># optional parameter, defaults to False </span><span class="highlite-NAME_SCALAR">$sig3</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$name</span>!); <span class="highlite-COMMENT"># mandatory 'name' named parameter </span></pre> </div> </div> <p>Default values can depend on previous parameters, and are (at least notionally) computed anew for each call</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-NAME_SCALAR">$sig1</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-NAME_SCALAR">$goal</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$accuracy</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$goal</span> <span class="highlite-OPERATOR">/</span> 100); <span class="highlite-NAME_SCALAR">$sig2</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-OPERATOR">:</span>(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$excludes</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-STRING_DELIMITER">'</span><span class="highlite-STRING">..</span><span class="highlite-STRING_DELIMITER">'</span>]); <span class="highlite-COMMENT"># a new Array for every call </span></pre> </div> </div> <h2 id="Was_an_argument_passed_for_a_parameter?" class="raku-h2"><a href="#Signature_literals" title="go to top of document">Was an argument passed for a parameter?<a class="raku-anchor" title="direct link" href="#Was_an_argument_passed_for_a_parameter?">§</a></a></h2> <p>Table showing checks of whether an argument was passed for a given parameter:</p><table class="table is-bordered centered pod-table"> <thead> <tr><th>Parameter kind</th><th>Example</th><th>Comment</th><th>Check for no arg passed</th></tr> </thead> <tbody> <tr><td>Slurpy</td><td>*@array</td><td>Don't check using .defined</td><td>if not @array</td></tr> <tr><td>Required</td><td>$foo</td><td>Can't be omitted</td><td>(not applicable)</td></tr> <tr><td>Optional</td><td>@bar = default</td><td>Pick a suitable default¹</td><td>if @bar =:= default</td></tr> </tbody> </table> <p>¹ A suitable default is an Object that has a distinct identity, as may be checked by the <a href="https://docs.raku.org/type/Mu#method_WHICH"><code>WHICH</code></a> method.</p><p>A parameter with a default is always <em>optional</em>, so there is no need to mark it with a <code>?</code> or the <code>is optional</code> trait.</p><p>Then you can use the <code>=:=</code> <a href="https://docs.raku.org/language/operators#infix_=:=">container identity operator</a> in the body of the routine to check whether this exact default was bound to the parameter.</p><p>Example with a positional parameter:</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-KEYWORD">constant</span> PositionalAt <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">Positional</span>.<span class="highlite-ROUTINE">new</span>; <span class="highlite-KEYWORD">sub</span> a (<span class="highlite-NAME_ARRAY">@list</span> <span class="highlite-OPERATOR">=</span> PositionalAt) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@list</span> <span class="highlite-OPERATOR">=:=</span> PositionalAt } a; <span class="highlite-COMMENT"># OUTPUT: «True␤» </span>a [1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3]; <span class="highlite-COMMENT"># OUTPUT: «False␤» </span></pre> </div> </div> <p>Example with some scalar parameters:</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-KEYWORD">constant</span> AnyAt <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">Any</span>.<span class="highlite-ROUTINE">new</span>; <span class="highlite-KEYWORD">sub</span> b (<span class="highlite-NAME_SCALAR">$x</span>=AnyAt<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$y</span>=AnyAt) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">=:=</span> AnyAt; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-OPERATOR">=:=</span> AnyAt } b 1; <span class="highlite-COMMENT"># OUTPUT: «False␤True␤» </span>b 1<span class="highlite-OPERATOR">,</span> :2y; <span class="highlite-COMMENT"># OUTPUT: «False␤False␤» </span></pre> </div> </div> <p>If your parameters are typed, then the <a href="https://docs.raku.org/language/glossary#Type_smiley">type smileys</a> can be used with <a href="https://docs.raku.org/language/functions#Multi-dispatch"><code>multi</code></a>s like this:</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">multi</span> c (Int:U <span class="highlite-NAME_SCALAR">$z</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">Undefined</span><span class="highlite-STRING_DELIMITER">'</span> } <span class="highlite-KEYWORD">multi</span> c (Int:D <span class="highlite-NAME_SCALAR">$z</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">Defined</span><span class="highlite-STRING_DELIMITER">'</span> } <span class="highlite-KEYWORD">multi</span> c (<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$z</span>?) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">Omitted</span><span class="highlite-STRING_DELIMITER">'</span> } c; <span class="highlite-COMMENT">#Omitted </span>c (<span class="highlite-TYPE">Int</span>); <span class="highlite-COMMENT">#Undefined </span>c 42; <span class="highlite-COMMENT">#Defined </span></pre> </div> </div> <p>The examples use names like <code>PositionalAt</code> to reflect that the <code>.WHICH</code> test returns an object of type <a href="/type/ObjAt"><code>ObjAt</code></a>, you are free to make up you own names.</p> <h1 id="Dynamic_variables" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Dynamic variables<a class="raku-anchor" title="direct link" href="#Dynamic_variables">§</a></a></h1> <p><a href="/language/variables#The_*_twigil">Dynamic variables</a> are allowed in signatures although they don't provide special behavior because argument binding does connect two scopes anyway.</p><p><a name="index-entry-destructuring_arguments" class="index-entry"></a></p> <h1 id="Destructuring_arguments" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Destructuring arguments<a class="raku-anchor" title="direct link" href="#Destructuring_arguments">§</a></a></h1> <p>Non-scalar parameters can be followed or substituted by a sub-signature in parentheses, which will destructure the argument given. The destructuring of a list is just its elements:</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> <span class="highlite-ROUTINE">first</span>(<span class="highlite-NAME_ARRAY">@array</span> (<span class="highlite-NAME_SCALAR">$first</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@rest</span>)) { <span class="highlite-NAME_SCALAR">$first</span> }</pre> </div> </div> <p>or</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> <span class="highlite-ROUTINE">first</span>([<span class="highlite-NAME_SCALAR">$f</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span>@]) { <span class="highlite-NAME_SCALAR">$f</span> }</pre> </div> </div> <p>While the destructuring of a hash is its pairs:</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> all-dimensions(<span class="highlite-OPERATOR">%</span> (:length(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$x</span>)<span class="highlite-OPERATOR">,</span> :width(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$y</span>)<span class="highlite-OPERATOR">,</span> :depth(<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$z</span>))) { <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">andthen</span> <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-OPERATOR">andthen</span> <span class="highlite-NAME_SCALAR">$z</span> <span class="highlite-OPERATOR">andthen</span> <span class="highlite-TYPE">True</span> }</pre> </div> </div> <p>Pointy loops can also destructure hashes, allowing assignment to 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> <span class="highlite-NAME_HASH">%hhgttu</span> <span class="highlite-OPERATOR">=</span> (:40life<span class="highlite-OPERATOR">,</span> :41universe<span class="highlite-OPERATOR">,</span> :42everything); <span class="highlite-KEYWORD">for</span> <span class="highlite-NAME_HASH">%hhgttu</span> <span class="highlite-KEYWORD">-&gt;</span> (<span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$key</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$value</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-NAME_SCALAR">$key</span><span class="highlite-STRING"> → </span><span class="highlite-NAME_SCALAR">$value</span><span class="highlite-STRING_DELIMITER">&quot;</span>; } <span class="highlite-COMMENT"># OUTPUT: «universe → 41␤life → 40␤everything → 42␤»</span></pre> </div> </div> <p>In general, an object is destructured based on its attributes. A common idiom is to unpack a <a href="/type/Pair"><code>Pair</code></a>'s key and value in a for loop:</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">for</span> &lt;Peter Paul Merry&gt;.<span class="highlite-ROUTINE">pairs</span> <span class="highlite-KEYWORD">-&gt;</span> (:key(<span class="highlite-NAME_SCALAR">$index</span>)<span class="highlite-OPERATOR">,</span> :value(<span class="highlite-NAME_SCALAR">$guest</span>)) { }</pre> </div> </div> <p>However, this unpacking of objects as their attributes is only the default behavior. To make an object get destructured differently, change its <a href="/routine/Capture"><code>Capture</code></a> method.</p><p><a name="index-entry-sub-signature" class="index-entry"></a></p> <h1 id="Sub-signatures" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Sub-signatures<a class="raku-anchor" title="direct link" href="#Sub-signatures">§</a></a></h1> <p>To match against a compound parameter use a sub-signature following the argument name in parentheses.</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> foo(|c(<span class="highlite-TYPE">Int</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span>)){ <span class="highlite-ROUTINE">put</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">called with </span><span class="highlite-ESCAPE">{</span>c.<span class="highlite-ROUTINE">raku</span><span class="highlite-ESCAPE">}</span><span class="highlite-STRING_DELIMITER">&quot;</span> }; foo(42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">answer</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-COMMENT"># OUTPUT: «called with \(42, &quot;answer&quot;)␤»</span></pre> </div> </div> <h1 id="Long_names" class="raku-h1"><a name="index-entry-Long_names-Long_names" data-indexedheader="Language;Long names"></a><a href="#Signature_literals" title="go to top of document">Long names<a class="raku-anchor" title="direct link" href="#Long_names">§</a></a></h1> <!-- defnmark Long_names 1 --> <p>To exclude certain parameters from being considered in multiple dispatch, separate them with a double semicolon.</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">multi</span> <span class="highlite-ROUTINE">f</span>(<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$i</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$s</span>;; <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$b</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-NAME_SCALAR">$i</span><span class="highlite-STRING">, </span><span class="highlite-NAME_SCALAR">$s</span><span class="highlite-STRING">, </span><span class="highlite-ESCAPE">{</span><span class="highlite-NAME_SCALAR">$b</span>.<span class="highlite-ROUTINE">raku</span><span class="highlite-ESCAPE">}</span><span class="highlite-STRING_DELIMITER">&quot;</span> }; <span class="highlite-ROUTINE">f</span>(10<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">answer</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «10, answer, Any␤»</span></pre> </div> </div> <h1 id="Capture_parameters" class="raku-h1"><a name="index-entry-|-Capture_parameters" data-indexedheader="Syntax;|"></a><a href="#Signature_literals" title="go to top of document">Capture parameters<a class="raku-anchor" title="direct link" href="#Capture_parameters">§</a></a></h1> <!-- defnmark Capture_parameters 1 --> <p>Prefixing a parameter with a vertical bar <code>|</code> makes the parameter a <a href="/type/Capture"><code>Capture</code></a>, using up all the remaining positional and named arguments.</p><p>This is often used in <code>proto</code> definitions (like <code>proto foo (|) {*}</code>) to indicate that the routine's <a href="/syntax/multi"><code>multi</code> definitions</a> can have any <a href="#Type_constraints">type constraints</a>. See <a href="/language/functions#proto">proto</a> for an example.</p><p>If bound to a variable, arguments can be forwarded as a whole using the slip operator <code>|</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">sub</span> a(<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$i</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Str</span> <span class="highlite-NAME_SCALAR">$s</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$i</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-NAME_SCALAR">$s</span>.^<span class="highlite-ROUTINE">name</span> } <span class="highlite-KEYWORD">sub</span> b(|c) { <span class="highlite-ROUTINE">say</span> c.^<span class="highlite-ROUTINE">name</span>; a(|c) } b(42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">answer</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-COMMENT"># OUTPUT: «Capture␤Int Str␤»</span></pre> </div> </div> <h1 id="Parameter_traits_and_modifiers" class="raku-h1"><a href="#Signature_literals" title="go to top of document">Parameter traits and modifiers<a class="raku-anchor" title="direct link" href="#Parameter_traits_and_modifiers">§</a></a></h1> <p>By default, parameters are bound to their argument and marked as read-only. One can change that with traits on the parameter.</p><p><a name="index-entry-is_copy" class="index-entry"></a> The <code>is copy</code> trait causes the argument to be copied, and allows it to be modified inside the routine</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> count-up(<span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-ROUTINE">copy</span>) { <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">=</span> ∞ <span class="highlite-KEYWORD">if</span> <span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-TYPE">Whatever</span>; .<span class="highlite-ROUTINE">say</span> <span class="highlite-KEYWORD">for</span> 1.<span class="highlite-OPERATOR">.</span><span class="highlite-NAME_SCALAR">$x</span>; }</pre> </div> </div> <p><a name="index-entry-is_rw" class="index-entry"></a> The <code>is rw</code> trait, which stands for <em>is read-write</em>, makes the parameter bind to a variable (or other writable container). Assigning to the parameter changes the value of the variable at the caller side.</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> swap(<span class="highlite-NAME_SCALAR">$x</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">rw</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$y</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">rw</span>) { (<span class="highlite-NAME_SCALAR">$x</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$y</span>) <span class="highlite-OPERATOR">=</span> (<span class="highlite-NAME_SCALAR">$y</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$x</span>); }</pre> </div> </div> <p>On slurpy parameters, <code>is rw</code> is reserved for future use by language designers.</p><p><a name="index-entry-is_raw" class="index-entry"></a> The <a href="/type/Parameter#method_raw"><code>is raw</code> trait</a> is automatically applied to parameters declared with a <a href="/language/variables#Sigilless_variables">backslash</a> or a <a href="#Single_argument_rule_slurpy">plus sign</a> as a &quot;sigil&quot;, and may also be used to make normally sigiled parameters behave like these do. In the special case of slurpies, which normally produce an <a href="/type/Array"><code>Array</code></a> full of <a href="/type/Scalar"><code>Scalar</code></a>s as described above, <code>is raw</code> will instead cause the parameter to produce a <a href="/type/List"><code>List</code></a>. Each element of that list will be bound directly as raw parameter.</p><p><a name="index-entry-is_readonly" class="index-entry"></a> To explicitly ask for a read-only parameter use the <code>is readonly</code> trait. Please note that this applies only to the container. The object inside can very well have mutator methods and Raku will not enforce immutability on the attributes of the object.</p><p>Traits can be followed by the where clause:</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> ip-expand-ipv6(<span class="highlite-NAME_SCALAR">$ip</span> <span class="highlite-KEYWORD">is</span> <span class="highlite-ROUTINE">copy</span> <span class="highlite-KEYWORD">where</span> <span class="highlite-REGEX_DELIMITER">m:i/</span><span class="highlite-REGEX_SPECIAL">^&lt;[a..f\d\:]&gt;**3..39$/) {</span> <span class="highlite-REGEX_SPECIAL">}</span><span class="highlite-REGEX_DELIMITER"></span></pre> </div> </div> </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="ae16c6aab 2024-07-24"> <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