CINXE.COM

class List | Raku Documentation

<!DOCTYPE html> <html lang="en" class="fontawesome-i2svg-active fontawesome-i2svg-complete" style="scroll-padding-top:60px"> <head> <title>class List | Raku Documentation</title> <meta charset="UTF-8" /> <link href="/assets/images/Camelia.ico" rel="icon" type="image/x-icon"/> <link rel="stylesheet" href="/assets/css/Website.css"/> <link rel="stylesheet" href="/assets/css/typegraph-styling.css"/> <link rel="stylesheet" href="/assets/css/typegraph-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/typegraph-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/filtered-toc-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/filtered-toc-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/announce-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/announce-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/all.min.css"/> <link rel="stylesheet" href="/assets/css/listf-styling-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/listf-styling-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/options-search-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/options-search-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/page-styling-main.css"/> <link rel="stylesheet" href="/assets/css/css/page-styling-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/page-styling-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/chyronToggle-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/chyronToggle-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/css/centreToggle-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/centreToggle-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/tm-styling.css"/> <link rel="stylesheet" href="/assets/css/tm-light.css" title="light"/> <link rel="stylesheet" href="/assets/css/tm-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/rainbow-dark.css" title="dark"/> <link rel="stylesheet" href="/assets/css/css/rainbow-light.css" title="light"/> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@10.2.7/dist/css/autoComplete.min.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-light.min.css" title="light" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css" title="dark" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="/assets/scripts/all.min.js"></script><script src="/assets/scripts/filter-script.js"></script><script src="/assets/scripts/tableManager.js"></script><script src="https://cdn.jsdelivr.net/npm/fuzzysort@2.0.4/fuzzysort.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@10.2.7/dist/autoComplete.min.js"></script><script src="/assets/scripts/filtered-toc.js"></script><script src="/assets/scripts/options-search.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/haskell.min.js"></script><script src="/assets/scripts/page-styling.js"></script><script src="/assets/scripts/announcements.js"></script><script src="/assets/scripts/rainbow.js"></script> </head> <body class="has-navbar-fixed-top"> <div id="class_List" class="top-of-page"></div> <nav class="navbar is-fixed-top is-flex-touch" role="navigation" aria-label="main navigation"> <div class="navbar-item" style="margin-left: auto;"> <div class="left-bar-toggle" title="Toggle Table of Contents & Index"> <label class="chyronToggle left"> <input id="navbar-left-toggle" type="checkbox"> <span class="text">Contents</span> </label> </div> </div> <div class="container is-justify-content-space-around"> <div class="navbar-brand"> <div class="navbar-logo"> <a class="navbar-item" href="/"> <img src="/assets/images/camelia-recoloured.png" alt="Raku" width="52.83" height="38"> </a> <span class="navbar-logo-tm">tm</span> </div> <a role="button" class="navbar-burger burger" aria-label="menu" aria-expanded="false" data-target="navMenu"> <span aria-hidden="true"></span> <span aria-hidden="true"></span> <span aria-hidden="true"></span> </a> </div> <div id="navMenu" class="navbar-menu"> <div class="navbar-start"> <a class="navbar-item" href="/introduction" title="Getting started, Tutorials, Migration guides"> Introduction </a> <a class="navbar-item" href="/reference" title="Fundamentals, General reference"> Reference </a> <a class="navbar-item" href="/miscellaneous" title="Programs, Experimental"> Miscellaneous </a> <a class="navbar-item" href="/types" title="The core types (classes) available"> Types </a> <a class="navbar-item" href="/routines" title="Searchable table of routines"> Routines </a> <a class="navbar-item" href="https://raku.org" title="Home page for community"> Raku<sup>®</sup> </a> <a class="navbar-item" href="https://web.libera.chat/#raku" title="IRC live chat"> Chat </a> <div class="navbar-item has-dropdown is-hoverable"> <a class="navbar-link"> More </a> <div class="navbar-dropdown is-right is-rounded"> <hr class="navbar-divider"> <a class="navbar-item js-modal-trigger" data-target="download-ebook"> Download E-Book (epub) </a> <hr class="navbar-divider"> <a class="navbar-item" href="/about"> About </a> <hr class="navbar-divider"> <a class="navbar-item has-text-red" href="https://github.com/raku/doc-website/issues"> Report an issue with this site </a> <hr class="navbar-divider"> <a class="navbar-item" href="https://github.com/raku/doc/issues"> Report an issue with the documentation content </a> <hr class="navbar-divider"> <label class="navbar-item centreToggle" title="Enable/Disable Announcements" style="--switch-width: 18"> <input id="cancelAnnouncements" type="checkbox"> <span class="text">Announcements</span> <span class="on">suppressed</span> <span class="off">allowed</span> </label> </div> </div> </div> <div class="navbar-end navbar-search-wrapper"> <div class="navbar-item"> <div class="field has-addons"> <div class="autoComplete_options"> <input class="control input" id="autoComplete" type="search" dir="ltr" spellcheck=false autocorrect="off" autocomplete="off" autocapitalize="off" placeholder="🔍 Type f to search for ..."> </div> <div class="control" title="Search options"> <a class="button is-primary js-modal-trigger" data-target="options-search-info"> <span class="icon"> <i class="fas fa-cogs"></i> </span> </a> </div> </div> </div> </div> <div id="options-search-info" class="modal"> <div class="modal-background"></div> <div class="modal-content"> <div class="box"> <p>The last search was: <span id="selected-candidate" class="ss-selected"></span></p> <div class="control is-grouped is-grouped-centered options-search-controls"> <label class="centreToggle" title="Include extra information (Alt-E)" style="--switch-width: 10.5"> <input id="options-search-extra" type="checkbox"> <span class="text">Extra info</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>The search response can be shortened by excluding the extra information line (Alt-E)</p> <label class="centreToggle" title="Search engine type Strict/Loose (Alt-L)" style="--switch-width: 10.5"> <input id="options-search-loose" type="checkbox"> <span class="text">Search type</span> <span class="on">loose</span> <span class="off">strict</span> </label> <p> The search engine can perform a strict search (only the characters in the search box) or a loose search (Alt-L)</p> <label class="centreToggle" title="Search in headings (Alt-H)" style="--switch-width: 10.5"> <input id="options-search-headings" type="checkbox"> <span class="text">Headings</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>Search through headings in all web-pages (Alt-H)</p> <label class="centreToggle" title="Search indexed items (Alt-I)" style="--switch-width: 10.5"> <input id="options-search-indexed" type="checkbox"> <span class="text">Indexed</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>Search through all indexed items (Alt-I)</p> <label class="centreToggle" title="Search composite pages (Alt-C)" style="--switch-width: 10.5"> <input id="options-search-composite" type="checkbox"> <span class="text">Composite</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>Search in the names of composite pages, which combine similar information from the main web pages (Alt-C)</p> <label class="centreToggle" title="Search primary sources (Alt-P)" style="--switch-width: 10.5"> <input id="options-search-primary" type="checkbox"> <span class="text">Primary</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>Search through the names of the main web pages (Alt-P)</p> <label class="centreToggle" title="Open in new tab (Alt-Q)" style="--switch-width: 10.5"> <input id="options-search-newtab" type="checkbox"> <span class="text">New tab</span> <span class="on">yes</span> <span class="off">no</span> </label> <p>Once a search candidate has been chosen, it can be opened in a new tab or in the current tab (Alt-Q)</p> <p>If all else fails, an item is added to use the Google search engine on the whole site</p> <button class="button is-warning" id="options-search-reset-defaults">Clear options, reset to defaults</button> <p>Exit this page by pressing &lt;Escape&gt;, or clicking on X or on the background.</p> </div> </div> </div> <button class="modal-close is-large" aria-label="close"></button> </div> </div> <div id="download-ebook" class="modal"> <div class="modal-background"></div> <div class="modal-content"> <div class="box"> <p><a href="/RakuDocumentation.epub" download>RakuDocumentation.epub</a> is a work in progress e-book. It targets the <a href="https://www.w3.org/publishing/epub3/">EPUB v3 specification</a>. It needs testing on a variety of ereaders (some of which may still implicitly expect compliance with EPUB v2). The CSS definitely needs enhancing (especially for code snippets). The Ebook opens in a Calibre reader, which is available on all operating systems.</p> <p>Suggestions are welcome and should be addressed by opening an issue on the Raku/doc-website repository</p> <p>Exit this popup by pressing &lt;Escape&gt;, or clicking on X or on the background.</p> </div> </div> <button class="modal-close is-large" aria-label="close"></button> </div> <div id="announcement-modal" class="modal"> <div class="modal-background"></div> <div class="modal-content"> <div class="box"> <div id="raku-doc-announcement"></div> <p>For more see <a href="/announcements">Announcements page</a>.</p> <p>Exit this popup by pressing &lt;Escape&gt;, or clicking on X or on the background.</p> </div> </div> <button class="modal-close is-large" aria-label="close"></button> </div> </div> </nav> <div class="tile is-ancestor section"> <div class="page-edit"> <a class="button page-edit-button" href="https://github.com/Raku/doc/edit/main/doc/Type/List.rakudoc" title="Edit this page.&#13;Commit: 104c70a0d 2024-08-20"> <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="#Immutability">Immutability</a></li> <li><a href="#Items,_flattening_and_sigils">Items, flattening and sigils</a></li> <li><a href="#Methods">Methods</a></li> <ul> <li><a href="#method_ACCEPTS">method ACCEPTS</a></li> <li><a href="#routine_list">routine list</a></li> <li><a href="#routine_elems">routine elems</a></li> <li><a href="#routine_end">routine end</a></li> <li><a href="#routine_keys">routine keys</a></li> <li><a href="#routine_values">routine values</a></li> <li><a href="#routine_kv">routine kv</a></li> <li><a href="#routine_pairs">routine pairs</a></li> <li><a href="#routine_antipairs">routine antipairs</a></li> <li><a href="#routine_invert">routine invert</a></li> <li><a href="#routine_join">routine join</a></li> <li><a href="#routine_map">routine map</a></li> <li><a href="#method_flatmap">method flatmap</a></li> <li><a href="#method_gist">method gist</a></li> <li><a href="#routine_grep">routine grep</a></li> <li><a href="#routine_first">routine first</a></li> <li><a href="#method_head">method head</a></li> <li><a href="#method_tail">method tail</a></li> <li><a href="#routine_categorize">routine categorize</a></li> <li><a href="#routine_classify">routine classify</a></li> <li><a href="#method_Bool">method Bool</a></li> <li><a href="#method_Str">method Str</a></li> <li><a href="#method_Int">method Int</a></li> <li><a href="#method_Numeric">method Numeric</a></li> <li><a href="#method_Capture">method Capture</a></li> <li><a href="#routine_pick">routine pick</a></li> <li><a href="#routine_roll">routine roll</a></li> <li><a href="#routine_eager">routine eager</a></li> <li><a href="#routine_reverse">routine reverse</a></li> <li><a href="#routine_rotate">routine rotate</a></li> <li><a href="#routine_sort">routine sort</a></li> <li><a href="#routine_reduce">routine reduce</a></li> <li><a href="#routine_produce">routine produce</a></li> <li><a href="#routine_combinations">routine combinations</a></li> <li><a href="#routine_permutations">routine permutations</a></li> <li><a href="#routine_rotor">routine rotor</a></li> <li><a href="#method_batch">method batch</a></li> <li><a href="#routine_cross">routine cross</a></li> <li><a href="#routine_zip">routine zip</a></li> <li><a href="#routine_roundrobin">routine roundrobin</a></li> <li><a href="#routine_sum">routine sum</a></li> <li><a href="#method_fmt">method fmt</a></li> <li><a href="#method_from">method from</a></li> <li><a href="#method_to">method to</a></li> <li><a href="#method_sink">method sink</a></li> <li><a href="#method_Set">method Set</a></li> </ul> <li><a href="#Operators">Operators</a></li> <ul> <li><a href="#infix_cmp">infix cmp</a></li> </ul> </aside> <aside id="index-menu" class="menu is-hidden"> <ul class="menu-list"> <li>Syntax<ul> <li><a href="#index-entry-()_(empty_list)"></a></li> </ul></li> </ul> </aside> </div> </div> </div> <div id="main-column" class="tile is-parent" style="overflow-x: hidden;"> <div id="main-col-inner"> <section class="raku page-header"> <div class="container px-4"> <div class="raku page-title has-text-centered"> class List </div> <div class="raku page-subtitle has-text-centered"> <p>Sequence of values</p> </div> </div> </section> <section class="raku page-content"><div class="container px-4"><div class="columns one-col"> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-KEYWORD">class</span> <span class="highlite-TYPE">List</span> <span class="highlite-KEYWORD">does</span> <span class="highlite-TYPE">Iterable</span> <span class="highlite-KEYWORD">does</span> <span class="highlite-TYPE">Positional</span> { } </pre> </div> </div> <p><code>List</code> stores items sequentially and potentially lazily.</p><p>Indexes into lists and arrays start at 0 by default.</p><p>You can assign to list elements if they are containers. Use Arrays to have every value of the list stored in a container.</p><p><code>List</code> implements <a href="/type/Positional"><code>Positional</code></a> and as such provides support for <a href="/language/subscripts">subscripts</a>.</p> <h1 id="Immutability" class="raku-h1"><a href="#class_List" title="go to top of document">Immutability<a class="raku-anchor" title="direct link" href="#Immutability">§</a></a></h1> <p>Lists are immutable objects, i.e., neither the number of elements in a list nor the elements themselves can be changed. Thus, it is not possible to use operations that change the list structure itself such as <a href="/routine/shift">shift</a>, <a href="/routine/unshift">unshift</a>, <a href="/routine/push">push</a>, <a href="/routine/pop">pop</a>, <a href="/routine/splice">splice</a> and <a href="/language/operators#Operators">binding</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">(1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3).<span class="highlite-ROUTINE">shift</span>; <span class="highlite-COMMENT"># Error Cannot call 'shift' on an immutable 'List' </span>(1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3).<span class="highlite-ROUTINE">unshift</span>(0); <span class="highlite-COMMENT"># Error Cannot call 'unshift' on an immutable 'List' </span>(1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3).<span class="highlite-ROUTINE">push</span>(4); <span class="highlite-COMMENT"># Error Cannot call 'push' on an immutable 'List' </span>(1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3).<span class="highlite-ROUTINE">pop</span>; <span class="highlite-COMMENT"># Error Cannot call 'pop' on an immutable 'List' </span>(1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3)[0]:delete; <span class="highlite-COMMENT"># Error Cannot remove elements from a List </span>(1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3)[0] <span class="highlite-OPERATOR">:=</span> 0; <span class="highlite-COMMENT"># Error Cannot use bind operator with this left-hand side </span>(1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3)[0] <span class="highlite-OPERATOR">=</span> 0; <span class="highlite-COMMENT"># Error Cannot modify an immutable Int </span></pre> </div> </div> <p>A <code>List</code> doesn't <a href="/language/containers">containerize</a> its elements, but if any element happens to be inside a <a href="/type/Scalar"><code>Scalar</code></a> container then the element's contents can be replaced via an assignment.</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-STRING_DELIMITER">'</span><span class="highlite-STRING">z</span><span class="highlite-STRING_DELIMITER">'</span>; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$list</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-STRING_DELIMITER">'</span><span class="highlite-STRING">b</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$list</span>[0].<span class="highlite-ROUTINE">VAR</span>.^<span class="highlite-ROUTINE">name</span>; <span class="highlite-COMMENT"># OUTPUT: «Scalar␤», containerized </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$list</span>[1].<span class="highlite-ROUTINE">VAR</span>.^<span class="highlite-ROUTINE">name</span>; <span class="highlite-COMMENT"># OUTPUT: «Scalar␤», containerized </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$list</span>[2].<span class="highlite-ROUTINE">VAR</span>.^<span class="highlite-ROUTINE">name</span>; <span class="highlite-COMMENT"># OUTPUT: «Str␤», non-containerized </span> <span class="highlite-NAME_SCALAR">$list</span>[0] <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>; <span class="highlite-COMMENT"># OK! </span><span class="highlite-NAME_SCALAR">$list</span>[1] <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">c</span><span class="highlite-STRING_DELIMITER">'</span>; <span class="highlite-COMMENT"># OK! </span><span class="highlite-NAME_SCALAR">$list</span>[2] <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">d</span><span class="highlite-STRING_DELIMITER">'</span>; <span class="highlite-COMMENT"># Error: Cannot modify an immutable List </span></pre> </div> </div> <h1 id="Items,_flattening_and_sigils" class="raku-h1"><a href="#class_List" title="go to top of document">Items, flattening and sigils<a class="raku-anchor" title="direct link" href="#Items,_flattening_and_sigils">§</a></a></h1> <p>In Raku, assigning a <code>List</code> to a scalar variable does not lose information. The difference is that iteration generally treats a list (or any other list-like object, like a <a href="/type/Seq"><code>Seq</code></a> or an <a href="/type/Array"><code>Array</code></a>) inside a scalar as a single element.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$s</span> <span class="highlite-OPERATOR">=</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3); <span class="highlite-KEYWORD">for</span> <span class="highlite-NAME_SCALAR">$s</span> { } <span class="highlite-COMMENT"># one iteration </span><span class="highlite-KEYWORD">for</span> <span class="highlite-NAME_SCALAR">$s</span>.<span class="highlite-ROUTINE">list</span> { } <span class="highlite-COMMENT"># three iterations </span> <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$t</span> <span class="highlite-OPERATOR">=</span> [1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3]; <span class="highlite-KEYWORD">for</span> <span class="highlite-NAME_SCALAR">$t</span> { } <span class="highlite-COMMENT"># one iteration </span><span class="highlite-KEYWORD">for</span> <span class="highlite-NAME_SCALAR">$t</span>.<span class="highlite-ROUTINE">list</span> { } <span class="highlite-COMMENT"># three iterations </span> <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_ARRAY">@a</span> <span class="highlite-OPERATOR">=</span> 1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3; <span class="highlite-KEYWORD">for</span> <span class="highlite-NAME_ARRAY">@a</span> { } <span class="highlite-COMMENT"># three iterations </span><span class="highlite-KEYWORD">for</span> <span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-ROUTINE">item</span> { } <span class="highlite-COMMENT"># one iteration</span></pre> </div> </div> <p>This operation is called <em>itemization</em> or <em>putting in an item context</em>. <code>.item</code> does the job for objects, as well as <code>$( ... )</code> and, on array variables, <code>$@a</code>.</p><p>Lists generally don't interpolate (flatten) into other lists, except when they are in list context and the single argument to an operation such as <code>append</code>:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$a</span> <span class="highlite-OPERATOR">=</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3); <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$nested</span> <span class="highlite-OPERATOR">=</span> (<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$a</span>); <span class="highlite-COMMENT"># two elements </span> <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$flat</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$nested</span>.<span class="highlite-ROUTINE">map</span>({ .<span class="highlite-TYPE">Slip</span> }); <span class="highlite-COMMENT"># six elements, with explicit Slip </span> <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_ARRAY">@b</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a b</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-NAME_ARRAY">@b</span>.append: <span class="highlite-NAME_SCALAR">$a</span>.<span class="highlite-ROUTINE">list</span>; <span class="highlite-COMMENT"># The array variable @b has 5 elements, because </span> <span class="highlite-COMMENT"># the list $a is the sole argument to append </span> <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@b</span>.<span class="highlite-ROUTINE">elems</span>; <span class="highlite-COMMENT"># OUTPUT: «5␤» </span> <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_ARRAY">@c</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a b</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-NAME_ARRAY">@c</span>.append: <span class="highlite-NAME_SCALAR">$a</span>.<span class="highlite-ROUTINE">list</span><span class="highlite-OPERATOR">,</span> 7; <span class="highlite-COMMENT"># The array variable @c has 4 elements, because </span> <span class="highlite-COMMENT"># the list $a wasn't the only argument and thus </span> <span class="highlite-COMMENT"># wasn't flatten by the append operation </span> <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@c</span>.<span class="highlite-ROUTINE">elems</span>; <span class="highlite-COMMENT"># OUTPUT: «4␤» </span> <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_ARRAY">@d</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a b</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-NAME_ARRAY">@d</span>.append: <span class="highlite-NAME_SCALAR">$a</span>; <span class="highlite-COMMENT"># The array variable @d has 3 elements, because </span> <span class="highlite-COMMENT"># $a is in an item context and as far as append is </span> <span class="highlite-COMMENT"># concerned a single element </span> <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@d</span>.<span class="highlite-ROUTINE">elems</span>; <span class="highlite-COMMENT"># OUTPUT: «3␤»</span></pre> </div> </div> <p>The same flattening behavior applies all objects that do the <a href="/type/Iterable"><code>Iterable</code></a> role, notably <a href="/type/Hash"><code>Hash</code></a>es:</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> a <span class="highlite-OPERATOR">=&gt;</span> 1<span class="highlite-OPERATOR">,</span> b <span class="highlite-OPERATOR">=&gt;</span> 2; <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_ARRAY">@b</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_HASH">%h</span>; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@b</span>.<span class="highlite-ROUTINE">elems</span>; <span class="highlite-COMMENT"># OUTPUT: «2␤» </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_ARRAY">@c</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_HASH">%h</span><span class="highlite-OPERATOR">,</span> ; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@c</span>.<span class="highlite-ROUTINE">elems</span>; <span class="highlite-COMMENT"># OUTPUT: «1␤» </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_ARRAY">@d</span> <span class="highlite-OPERATOR">=</span> $<span class="highlite-NAME_HASH">%h</span>; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@d</span>.<span class="highlite-ROUTINE">elems</span>; <span class="highlite-COMMENT"># OUTPUT: «1␤»</span></pre> </div> </div> <p>Slurpy parameters (<code>*@a</code>) flatten non-itemized sublists:</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> fe(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@flat</span>) { <span class="highlite-NAME_ARRAY">@flat</span>.<span class="highlite-ROUTINE">elems</span> } <span class="highlite-ROUTINE">say</span> fe(<span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a b</span><span class="highlite-STRING_DELIMITER">&gt;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">d e</span><span class="highlite-STRING_DELIMITER">&gt;</span>); <span class="highlite-COMMENT"># OUTPUT: «4␤» </span><span class="highlite-ROUTINE">say</span> fe(<span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a b</span><span class="highlite-STRING_DELIMITER">&gt;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">d e</span><span class="highlite-STRING_DELIMITER">&gt;</span>.<span class="highlite-ROUTINE">item</span>); <span class="highlite-COMMENT"># OUTPUT: «3␤»</span></pre> </div> </div> <p><a name="index-entry-()_(empty_list)" class="index-entry"></a> The empty list is created with <code>()</code>. Smartmatching against the empty list will check for the absence of 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">my</span> <span class="highlite-NAME_ARRAY">@a</span>; <span class="highlite-KEYWORD">for</span> <span class="highlite-NAME_ARRAY">@a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-ROUTINE">list</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-TYPE">Seq</span> <span class="highlite-KEYWORD">-&gt;</span> \listoid { <span class="highlite-ROUTINE">say</span> listoid <span class="highlite-OPERATOR">~~</span> () } <span class="highlite-COMMENT"># OUTPUT: «True␤True␤True␤»</span></pre> </div> </div> <p>Retrieving values from an empty list will always return <a href="/type/Nil"><code>Nil</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-ROUTINE">say</span> ()[33.<span class="highlite-ROUTINE">rand</span>]; <span class="highlite-COMMENT"># OUTPUT: «Nil␤»</span></pre> </div> </div> <p>Coercion to <a href="/type/Bool"><code>Bool</code></a> also indicates if the <code>List</code> got any 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">my</span> <span class="highlite-NAME_ARRAY">@a</span>; <span class="highlite-ROUTINE">say</span> [<span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-ROUTINE">elems</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-TYPE">Bool</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">?</span><span class="highlite-NAME_ARRAY">@a</span>]; <span class="highlite-COMMENT"># OUTPUT: «[0 False False]␤» </span><span class="highlite-NAME_ARRAY">@a</span>.push: 42; <span class="highlite-ROUTINE">say</span> [<span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-ROUTINE">elems</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-TYPE">Bool</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">?</span><span class="highlite-NAME_ARRAY">@a</span>]; <span class="highlite-COMMENT"># OUTPUT: «[1 True True]␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">empty</span><span class="highlite-STRING_DELIMITER">'</span> <span class="highlite-KEYWORD">unless</span> <span class="highlite-NAME_ARRAY">@a</span>; <span class="highlite-COMMENT"># no output</span></pre> </div> </div> <h1 id="Methods" class="raku-h1"><a href="#class_List" title="go to top of document">Methods<a class="raku-anchor" title="direct link" href="#Methods">§</a></a></h1> <h2 id="method_ACCEPTS" class="raku-h2"><a href="#class_List" title="go to top of document">method ACCEPTS<a class="raku-anchor" title="direct link" href="#method_ACCEPTS">§</a></a></h2> <!-- defnmark method_ACCEPTS 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">ACCEPTS</span>(List:D: <span class="highlite-NAME_SCALAR">$topic</span>)</pre> </div> </div> <p>If <code>$topic</code> is an <a href="/type/Iterable"><code>Iterable</code></a>, returns <code>True</code> or <code>False</code> based on whether the contents of the two <a href="/type/Iterable"><code>Iterable</code></a>s match. A <a href="/type/Whatever"><code>Whatever</code></a> element in the invocant matches anything in the corresponding position of the <code>$topic</code> <a href="/type/Iterable"><code>Iterable</code></a>. A <a href="/type/HyperWhatever"><code>HyperWhatever</code></a> matches any number of any elements, including no 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-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3) <span class="highlite-OPERATOR">~~</span> (1<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-OPERATOR">,</span> 3); <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3) <span class="highlite-OPERATOR">~~</span> (9<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-OPERATOR">,</span> 5); <span class="highlite-COMMENT"># OUTPUT: «False␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3) <span class="highlite-OPERATOR">~~</span> ( <span class="highlite-OPERATOR">**</span><span class="highlite-OPERATOR">,</span> 3); <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3) <span class="highlite-OPERATOR">~~</span> ( <span class="highlite-OPERATOR">**</span><span class="highlite-OPERATOR">,</span> 5); <span class="highlite-COMMENT"># OUTPUT: «False␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 3) <span class="highlite-OPERATOR">~~</span> (1<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">**</span><span class="highlite-OPERATOR">,</span> 3); <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 4<span class="highlite-OPERATOR">,</span> 5<span class="highlite-OPERATOR">,</span> 3) <span class="highlite-OPERATOR">~~</span> (1<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">**</span><span class="highlite-OPERATOR">,</span> 3); <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 4<span class="highlite-OPERATOR">,</span> 5<span class="highlite-OPERATOR">,</span> 6) <span class="highlite-OPERATOR">~~</span> (1<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">**</span><span class="highlite-OPERATOR">,</span> 5); <span class="highlite-COMMENT"># OUTPUT: «False␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 4<span class="highlite-OPERATOR">,</span> 5<span class="highlite-OPERATOR">,</span> 6) <span class="highlite-OPERATOR">~~</span> ( <span class="highlite-OPERATOR">**</span> ); <span class="highlite-COMMENT"># OUTPUT: «True␤» </span><span class="highlite-ROUTINE">say</span> () <span class="highlite-OPERATOR">~~</span> ( <span class="highlite-OPERATOR">**</span> ); <span class="highlite-COMMENT"># OUTPUT: «True␤»</span></pre> </div> </div> <p>In addition, returns <code>False</code> if either the invocant or <code>$topic</code> <a href="/routine/is-lazy">is a lazy</a> <a href="/type/Iterable"><code>Iterable</code></a>, unless <code>$topic</code> is the same object as the invocant, in which case <code>True</code> is returned.</p><p>If <code>$topic</code> is <em>not</em> an <a href="/type/Iterable"><code>Iterable</code></a>, returns the invocant if the invocant has no elements or its first element is a <a href="/type/Match"><code>Match</code></a> object (this behavior powers <code>m:g//</code> smartmatch), or <code>False</code> otherwise.</p> <h2 id="routine_list" class="raku-h2"><a href="#class_List" title="go to top of document">routine list<a class="raku-anchor" title="direct link" href="#routine_list">§</a></a></h2> <!-- defnmark routine_list 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">list</span>(+<span class="highlite-ROUTINE">list</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">list</span>(List:D:)</pre> </div> </div> <p>The method just returns the invocant <a href="/routine/self">self</a>. The subroutine adheres to the <a href="/language/functions#Slurpy_conventions">single argument rule</a>: if called with a single argument that is a non-<a href="/language/mop#VAR">itemized</a> <a href="/type/Iterable"><code>Iterable</code></a> it returns a <code>List</code> based on the argument's <a href="/routine/iterator">iterator</a>; otherwise it just returns the argument list.</p><p>For example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$tuple</span> <span class="highlite-OPERATOR">=</span> (1<span class="highlite-OPERATOR">,</span> 2); <span class="highlite-COMMENT"># an itemized List </span><span class="highlite-ROUTINE">put</span> <span class="highlite-NAME_SCALAR">$tuple</span>.<span class="highlite-ROUTINE">list</span>.<span class="highlite-ROUTINE">raku</span>; <span class="highlite-COMMENT"># OUTPUT: «(1, 2)␤» </span><span class="highlite-ROUTINE">put</span> <span class="highlite-ROUTINE">list</span>(<span class="highlite-NAME_SCALAR">$tuple</span>).<span class="highlite-ROUTINE">raku</span>; <span class="highlite-COMMENT"># OUTPUT: «($(1, 2),)␤» </span><span class="highlite-ROUTINE">put</span> <span class="highlite-ROUTINE">list</span>(<span class="highlite-OPERATOR">|</span><span class="highlite-NAME_SCALAR">$tuple</span>).<span class="highlite-ROUTINE">raku</span>; <span class="highlite-COMMENT"># OUTPUT: «(1, 2)␤»</span></pre> </div> </div> <p>The last statement uses the <a href="/language/operators#prefix_|"><code>prefix:&lt;|&gt;</code></a> operator to flatten the tuple into an argument list, so it is equivalent 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-ROUTINE">put</span> <span class="highlite-ROUTINE">list</span>(1<span class="highlite-OPERATOR">,</span> 2).<span class="highlite-ROUTINE">raku</span>; <span class="highlite-COMMENT"># OUTPUT: «(1, 2)␤»</span></pre> </div> </div> <p>There are other ways to list the elements of an itemized single argument. For example, you can <a href="/routine/<>">decontainerize</a> the argument or use the <a href="/type/Any#index-entry-@_list_contextualizer"><code>@</code> list contextualizer</a>:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">put</span> <span class="highlite-ROUTINE">list</span>(<span class="highlite-NAME_SCALAR">$tuple</span>&lt;<span class="highlite-OPERATOR">&gt;</span>).<span class="highlite-ROUTINE">raku</span>; <span class="highlite-COMMENT"># OUTPUT: «(1, 2)␤» </span><span class="highlite-ROUTINE">put</span> <span class="highlite-ROUTINE">list</span>(@<span class="highlite-NAME_SCALAR">$tuple</span>).<span class="highlite-ROUTINE">raku</span>; <span class="highlite-COMMENT"># OUTPUT: «(1, 2)␤» </span></pre> </div> </div> <p>Note that converting a type object to a list may not do what you expect:</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">put</span> <span class="highlite-TYPE">List</span>.<span class="highlite-ROUTINE">list</span>.<span class="highlite-ROUTINE">raku</span>; <span class="highlite-COMMENT"># OUTPUT: «(List,)␤»</span></pre> </div> </div> <p>This is because the <code>.list</code> candidate accepting a type object as the invocant is provided by <a href="/routine/list#(Any)_method_list"><code>Any</code></a>. That candidate returns a list with one element: the type object self. If you're developing a collection type whose type object should be a valid representation of an empty collection, you may want to provide your own candidate for undefined invocants or override the <code>Any:</code> candidates with an &quot;only&quot; method. For example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-KEYWORD">class</span> LinkedList { <span class="highlite-KEYWORD">has</span> <span class="highlite-NAME_SCALAR">$.value</span>; <span class="highlite-COMMENT"># the value stored in this node </span> <span class="highlite-KEYWORD">has</span> LinkedList <span class="highlite-NAME_SCALAR">$.next</span>; <span class="highlite-COMMENT"># undefined if there is no next node </span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">values</span>( <span class="highlite-KEYWORD">--&gt;</span> Seq:D) { <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$node</span> <span class="highlite-OPERATOR">:=</span> <span class="highlite-ROUTINE">self</span>; <span class="highlite-KEYWORD">gather</span> <span class="highlite-KEYWORD">while</span> <span class="highlite-NAME_SCALAR">$node</span> { <span class="highlite-ROUTINE">take</span> <span class="highlite-NAME_SCALAR">$node</span>.<span class="highlite-ROUTINE">value</span>; <span class="highlite-NAME_SCALAR">$node</span> <span class="highlite-OPERATOR">:=</span> <span class="highlite-NAME_SCALAR">$node</span>.<span class="highlite-ROUTINE">next</span>; } } <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">list</span>( <span class="highlite-KEYWORD">--&gt;</span> List:D) { <span class="highlite-ROUTINE">self</span>.<span class="highlite-ROUTINE">values</span>.<span class="highlite-ROUTINE">list</span>; } } <span class="highlite-KEYWORD">my</span> LinkedList <span class="highlite-NAME_SCALAR">$nodes</span>; <span class="highlite-COMMENT"># an empty linked list </span><span class="highlite-ROUTINE">put</span> <span class="highlite-NAME_SCALAR">$nodes</span>.<span class="highlite-ROUTINE">list</span>.<span class="highlite-ROUTINE">raku</span>; <span class="highlite-COMMENT"># OUTPUT: «()␤» </span></pre> </div> </div> <h2 id="routine_elems" class="raku-h2"><a href="#class_List" title="go to top of document">routine elems<a class="raku-anchor" title="direct link" href="#routine_elems">§</a></a></h2> <!-- defnmark routine_elems 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">elems</span>(<span class="highlite-NAME_SCALAR">$list</span> <span class="highlite-KEYWORD">--&gt;</span> Int:D) <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">elems</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Int:D)</pre> </div> </div> <p>Returns the number of elements in the list.</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> (1,2,3,4).<span class="highlite-ROUTINE">elems</span>; <span class="highlite-COMMENT"># OUTPUT: «4␤»</span></pre> </div> </div> <h2 id="routine_end" class="raku-h2"><a href="#class_List" title="go to top of document">routine end<a class="raku-anchor" title="direct link" href="#routine_end">§</a></a></h2> <!-- defnmark routine_end 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">end</span>(<span class="highlite-NAME_SCALAR">$list</span> <span class="highlite-KEYWORD">--&gt;</span> Int:D) <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">end</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Int:D)</pre> </div> </div> <p>Returns the index of the last element.</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> (1,2,3,4).<span class="highlite-ROUTINE">end</span>; <span class="highlite-COMMENT"># OUTPUT: «3␤»</span></pre> </div> </div> <h2 id="routine_keys" class="raku-h2"><a href="#class_List" title="go to top of document">routine keys<a class="raku-anchor" title="direct link" href="#routine_keys">§</a></a></h2> <!-- defnmark routine_keys 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">keys</span>(<span class="highlite-NAME_SCALAR">$list</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">keys</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns a sequence of indexes into the list (e.g., <code>0...(@list.elems-1)</code>).</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (1,2,3,4).<span class="highlite-ROUTINE">keys</span>; <span class="highlite-COMMENT"># OUTPUT: «(0 1 2 3)␤»</span></pre> </div> </div> <h2 id="routine_values" class="raku-h2"><a href="#class_List" title="go to top of document">routine values<a class="raku-anchor" title="direct link" href="#routine_values">§</a></a></h2> <!-- defnmark routine_values 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">values</span>(<span class="highlite-NAME_SCALAR">$list</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">values</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns a sequence of the list elements, in order.</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> (1,2,3,4).^<span class="highlite-ROUTINE">name</span>; <span class="highlite-COMMENT"># OUTPUT: «List␤» </span><span class="highlite-ROUTINE">say</span> (1,2,3,4).<span class="highlite-ROUTINE">values</span>.^<span class="highlite-ROUTINE">name</span>; <span class="highlite-COMMENT"># OUTPUT: «Seq␤»</span></pre> </div> </div> <h2 id="routine_kv" class="raku-h2"><a href="#class_List" title="go to top of document">routine kv<a class="raku-anchor" title="direct link" href="#routine_kv">§</a></a></h2> <!-- defnmark routine_kv 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">kv</span>(<span class="highlite-NAME_SCALAR">$list</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">kv</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns an interleaved sequence of indexes and values. For example</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> &lt;a b c&gt;.<span class="highlite-ROUTINE">kv</span>; <span class="highlite-COMMENT"># OUTPUT: «(0 a 1 b 2 c)␤»</span></pre> </div> </div> <h2 id="routine_pairs" class="raku-h2"><a href="#class_List" title="go to top of document">routine pairs<a class="raku-anchor" title="direct link" href="#routine_pairs">§</a></a></h2> <!-- defnmark routine_pairs 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">pairs</span>(<span class="highlite-NAME_SCALAR">$list</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">pairs</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns a sequence of pairs, with the indexes as keys and the list values as values.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> &lt;a b c&gt;.<span class="highlite-ROUTINE">pairs</span>; <span class="highlite-COMMENT"># OUTPUT: «(0 =&gt; a 1 =&gt; b 2 =&gt; c)␤»</span></pre> </div> </div> <h2 id="routine_antipairs" class="raku-h2"><a href="#class_List" title="go to top of document">routine antipairs<a class="raku-anchor" title="direct link" href="#routine_antipairs">§</a></a></h2> <!-- defnmark routine_antipairs 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">antipairs</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns a <a href="/type/Seq"><code>Seq</code></a> of pairs, with the values as keys and the indexes as values, i.e. the direct opposite to <a href="/type/List#routine_pairs">pairs</a>.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> &lt;a b c&gt;.<span class="highlite-ROUTINE">antipairs</span>; <span class="highlite-COMMENT"># OUTPUT: «(a =&gt; 0 b =&gt; 1 c =&gt; 2)␤»</span></pre> </div> </div> <h2 id="routine_invert" class="raku-h2"><a href="#class_List" title="go to top of document">routine invert<a class="raku-anchor" title="direct link" href="#routine_invert">§</a></a></h2> <!-- defnmark routine_invert 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">invert</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Assumes every element of the List is a <a href="/type/Pair"><code>Pair</code></a>. Returns all elements as a <a href="/type/Seq"><code>Seq</code></a> of <a href="/type/Pair"><code>Pair</code></a>s where the keys and values have been exchanged. If the value of a <a href="/type/Pair"><code>Pair</code></a> is an <a href="/type/Iterable"><code>Iterable</code></a>, then it will expand the values of that <a href="/type/Iterable"><code>Iterable</code></a> into separate 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">my</span> <span class="highlite-NAME_SCALAR">$l</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-TYPE">List</span>.<span class="highlite-ROUTINE">new</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span> <span class="highlite-OPERATOR">=&gt;</span> (2<span class="highlite-OPERATOR">,</span> 3)<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">b</span><span class="highlite-STRING_DELIMITER">'</span> <span class="highlite-OPERATOR">=&gt;</span> 17); <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$l</span>.<span class="highlite-ROUTINE">invert</span>; <span class="highlite-COMMENT"># OUTPUT: «(2 =&gt; a 3 =&gt; a 17 =&gt; b)␤»</span></pre> </div> </div> <h2 id="routine_join" class="raku-h2"><a href="#class_List" title="go to top of document">routine join<a class="raku-anchor" title="direct link" href="#routine_join">§</a></a></h2> <!-- defnmark routine_join 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">join</span>(<span class="highlite-NAME_SCALAR">$separator</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@list</span>) <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">join</span>(List:D: <span class="highlite-NAME_SCALAR">$separator</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING_DELIMITER">&quot;</span>)</pre> </div> </div> <p>Treats the elements of the list as strings by calling <a href="/type/Mu#method_Str"><code>.Str</code></a> on each of them, interleaves them with <code>$separator</code> and concatenates everything into a single string.</p><p>Example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">join</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">&lt;</span><span class="highlite-STRING">a b c</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-COMMENT"># OUTPUT: «a, b, c␤»</span></pre> </div> </div> <p>The method form also allows you to omit the separator:</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> &lt;a b c&gt;.<span class="highlite-ROUTINE">join</span>; <span class="highlite-COMMENT"># OUTPUT: «abc␤»</span></pre> </div> </div> <p>Note that the method form does not flatten sublists:</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> (1<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-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «1|a b c␤»</span></pre> </div> </div> <p>The subroutine form behaves slurpily, flattening all arguments after the first into a single list:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">join</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 1<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-COMMENT"># OUTPUT: «1|a|b|c␤»</span></pre> </div> </div> <p>In this case, the list <code>&lt;a b c&gt;</code> is <em>slurped</em> and flattened, unlike what happens when <code>join</code> is invoked as a method.</p><p>If one of the elements of the list happens to be a <a href="/type/Junction"><code>Junction</code></a>, then <code>join</code> will also return a <a href="/type/Junction"><code>Junction</code></a> with concatenation done as much as possible:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">|</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">b</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">c</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">d</span><span class="highlite-STRING_DELIMITER">&quot;</span>).<span class="highlite-ROUTINE">join</span>; <span class="highlite-COMMENT"># OUTPUT: «any(acd,bcd)␤»</span></pre> </div> </div> <h2 id="routine_map" class="raku-h2"><a href="#class_List" title="go to top of document">routine map<a class="raku-anchor" title="direct link" href="#routine_map">§</a></a></h2> <!-- defnmark routine_map 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">map</span>(\SELF: <span class="highlite-NAME_CODE">&amp;block</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">map</span>(<span class="highlite-NAME_CODE">&amp;code</span><span class="highlite-OPERATOR">,</span> +<span class="highlite-ROUTINE">values</span>)</pre> </div> </div> <p>Examples applied to lists are included here for the purpose of illustration.</p><p>For a list, it invokes <code>&amp;code</code> for each element and gathers the return values in a sequence and returns it. This happens lazily, i.e. <code>&amp;code</code> is only invoked when the return values are accessed.Examples:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">world</span><span class="highlite-STRING_DELIMITER">'</span>).map: { .^<span class="highlite-ROUTINE">name</span> } <span class="highlite-COMMENT"># OUTPUT: «(Str Int Rat Int Str)␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">map</span> <span class="highlite-OPERATOR">*</span>.<span class="highlite-TYPE">Str</span>.<span class="highlite-ROUTINE">chars</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">world</span><span class="highlite-STRING_DELIMITER">'</span>; <span class="highlite-COMMENT"># OUTPUT: «(5 1 8 2 5)␤» </span></pre> </div> </div> <p><code>map</code> inspects the arity of the code object, and tries to pass as many arguments to it as expected:</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> b(<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$b</span>) { <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-NAME_SCALAR">$a</span><span class="highlite-STRING"> before </span><span class="highlite-NAME_SCALAR">$b</span><span class="highlite-STRING_DELIMITER">&quot;</span> }; <span class="highlite-ROUTINE">say</span> &lt;a b <span class="highlite-OPERATOR">x</span> y&gt;.<span class="highlite-ROUTINE">map</span>(<span class="highlite-NAME_CODE">&amp;b</span>).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">, </span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a before b, x before y␤»</span></pre> </div> </div> <p>iterates the list two items at a time.</p><p>Note that <code>map</code> does not flatten embedded lists and arrays, 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">((1<span class="highlite-OPERATOR">,</span> 2)<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a b</span><span class="highlite-STRING_DELIMITER">&gt;</span>).<span class="highlite-ROUTINE">map</span>({ .<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">,</span><span class="highlite-STRING_DELIMITER">'</span>)})</pre> </div> </div> <p>passes <code>(1, 2)</code> and <code>&lt;a b&gt;</code> in turn to the block, leading to a total of two iterations and the result sequence <code>&quot;1,2&quot;, &quot;a,b&quot;</code>.</p><p>If <code>&amp;code</code> is a <a href="/type/Block"><code>Block</code></a> loop phasers will be executed and loop control statements will be treated as in loop control flow. Please note that <code>return</code> is executed in the context of its definition. It is not the return statement of the block but the surrounding Routine. Using a <a href="/type/Routine"><code>Routine</code></a> will also handle loop control statements and loop phasers. Any <a href="/type/Routine"><code>Routine</code></a> specific control statement or phaser will be handled in the context of that <a href="/type/Routine"><code>Routine</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">sub</span> <span class="highlite-REGEX_DELIMITER">s {</span><span class="highlite-REGEX_SPECIAL"> </span><span class="highlite-REGEX_LITERAL">my</span><span class="highlite-REGEX_SPECIAL"> &amp;</span><span class="highlite-REGEX_LITERAL">loop</span><span class="highlite-REGEX_SPECIAL">-</span><span class="highlite-REGEX_LITERAL">block</span><span class="highlite-REGEX_SPECIAL"> = {</span> <span class="highlite-KEYWORD">return</span> <span class="highlite-COMMENT"># return from sub s </span> <span class="highlite-REGEX_SPECIAL">}; </span><span class="highlite-REGEX_LITERAL">say</span><span class="highlite-REGEX_SPECIAL"> '</span><span class="highlite-REGEX_LITERAL">hi</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">3</span><span class="highlite-REGEX_SPECIAL">).</span><span class="highlite-REGEX_LITERAL">map</span><span class="highlite-REGEX_SPECIAL">: &amp;</span><span class="highlite-REGEX_LITERAL">loop</span><span class="highlite-REGEX_SPECIAL">-</span><span class="highlite-REGEX_LITERAL">block</span><span class="highlite-REGEX_SPECIAL">; </span><span class="highlite-REGEX_LITERAL">say</span><span class="highlite-REGEX_SPECIAL"> '</span><span class="highlite-REGEX_LITERAL">oi‽</span><span class="highlite-REGEX_SPECIAL">' </span><span class="highlite-COMMENT"># dead code </span><span class="highlite-REGEX_DELIMITER">}</span>; <span class="highlite-ROUTINE">s</span> <span class="highlite-COMMENT"># OUTPUT: «hi␤»</span></pre> </div> </div> <h2 id="method_flatmap" class="raku-h2"><a href="#class_List" title="go to top of document">method flatmap<a class="raku-anchor" title="direct link" href="#method_flatmap">§</a></a></h2> <!-- defnmark method_flatmap 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">flatmap</span>(List:D: <span class="highlite-NAME_CODE">&amp;code</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Convenience method, analogous to <a href="#routine_map"><code>.map(&amp;block)</code></a><a href="/type/Iterable#method_flat"><code>.flat</code></a>.</p> <h2 id="method_gist" class="raku-h2"><a href="#class_List" title="go to top of document">method gist<a class="raku-anchor" title="direct link" href="#method_gist">§</a></a></h2> <!-- defnmark method_gist 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">gist</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Str:D)</pre> </div> </div> <p>Returns the string containing the parenthesized &quot;gist&quot; of the List, <strong>listing up to the first 100</strong> elements, separated by space, appending an ellipsis if the List has more than 100 elements. If List <a href="/routine/is-lazy"><code>is-lazy</code></a>, returns string <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-ROUTINE">put</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3).<span class="highlite-ROUTINE">gist</span>; <span class="highlite-COMMENT"># OUTPUT: «(1 2 3)␤» </span><span class="highlite-ROUTINE">put</span> (1.<span class="highlite-OPERATOR">.</span>∞).<span class="highlite-TYPE">List</span>.<span class="highlite-ROUTINE">gist</span>; <span class="highlite-COMMENT"># OUTPUT: «(...)␤» </span> <span class="highlite-ROUTINE">put</span> (1..200).<span class="highlite-TYPE">List</span>.<span class="highlite-ROUTINE">gist</span>; <span class="highlite-COMMENT"># OUTPUT: </span><span class="highlite-COMMENT"># (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 </span><span class="highlite-COMMENT"># 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 </span><span class="highlite-COMMENT"># 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 </span><span class="highlite-COMMENT"># 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 </span><span class="highlite-COMMENT"># 96 97 98 99 100 ...) </span></pre> </div> </div> <h2 id="routine_grep" class="raku-h2"><a href="#class_List" title="go to top of document">routine grep<a class="raku-anchor" title="direct link" href="#routine_grep">§</a></a></h2> <!-- defnmark routine_grep 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">grep</span>(<span class="highlite-TYPE">Mu</span> <span class="highlite-NAME_SCALAR">$matcher</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@elems</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$k</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$kv</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$p</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$v</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">grep</span>(List:D: <span class="highlite-TYPE">Mu</span> <span class="highlite-NAME_SCALAR">$matcher</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$k</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$kv</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$p</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$v</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns a sequence of elements against which <code>$matcher</code> smartmatches. The elements are returned in the order in which they appear in the original list.</p><p>Examples:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">world</span><span class="highlite-STRING_DELIMITER">'</span>).grep: <span class="highlite-TYPE">Int</span>; <span class="highlite-COMMENT"># OUTPUT: «(1 42)␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">grep</span> { .<span class="highlite-TYPE">Str</span>.<span class="highlite-ROUTINE">chars</span> <span class="highlite-OPERATOR">&gt;</span> 3 }<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">world</span><span class="highlite-STRING_DELIMITER">'</span>; <span class="highlite-COMMENT"># OUTPUT: «(hello 3.142857 world)␤»</span></pre> </div> </div> <p>Note that if you want to grep for elements that do not match, you can use a <code>none</code>-<a href="/type/Junction"><code>Junction</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-ROUTINE">say</span> &lt;a b 6 <span class="highlite-ROUTINE">d</span> 8 0&gt;.<span class="highlite-ROUTINE">grep</span>(<span class="highlite-ROUTINE">none</span> <span class="highlite-TYPE">Int</span>); <span class="highlite-COMMENT"># OUTPUT: «(a b d)␤» </span><span class="highlite-ROUTINE">say</span> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span> <span class="highlite-ROUTINE">f</span>&gt;.<span class="highlite-ROUTINE">grep</span>(<span class="highlite-ROUTINE">none</span> <span class="highlite-OPERATOR">/</span><span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">[aeiou]</span><span class="highlite-STRING_DELIMITER">&gt;</span><span class="highlite-REGEX_DELIMITER">/</span><span class="highlite-REGEX_SPECIAL">); </span><span class="highlite-COMMENT"># OUTPUT: «(b c d f)␤»</span><span class="highlite-REGEX_DELIMITER"></span></pre> </div> </div> <p>Another option to grep for elements that do not match a regex is to use a block:</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> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span> <span class="highlite-ROUTINE">f</span>&gt;.<span class="highlite-ROUTINE">grep</span>({<span class="highlite-OPERATOR">!</span> <span class="highlite-REGEX_DELIMITER">/</span><span class="highlite-REGEX_SPECIAL">&lt;[aeiou]&gt;/}) </span><span class="highlite-COMMENT"># OUTPUT: «(b c d f)␤»</span><span class="highlite-REGEX_DELIMITER"></span></pre> </div> </div> <p>The reason the example above works is because a regex in Boolean context applies itself to <code>$_</code>. In this case, <code>!</code> boolifies the <code>/&lt;[aeiou]&gt;/</code> regex and negates the result. Smartmatching against a <a href="/type/Callable"><code>Callable</code></a> (in this case a <a href="/type/Block"><code>Block</code></a>) returns the value returned from that callable, so the boolified result of a regex is then used to decide whether the current value should be kept in the result of a grep.</p><p>The optional named parameters <code>:k</code>, <code>:kv</code>, <code>:p</code>, <code>:v</code> provide the same functionality as on slices:</p> <ul class="rakudoc-item"> <li><p>k</p></li> </ul> <p>Only return the index values of the matching elements in order.</p> <ul class="rakudoc-item"> <li><p>kv</p></li> </ul> <p>Return both the index and matched elements in order.</p> <ul class="rakudoc-item"> <li><p>p</p></li> </ul> <p>Return the index and the matched element as a <a href="/type/Pair"><code>Pair</code></a>, in order.</p> <ul class="rakudoc-item"> <li><p>v</p></li> </ul> <p>Only return the matched elements (same as not specifying any named parameter at all).</p><p>Examples:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">world</span><span class="highlite-STRING_DELIMITER">'</span>).grep: <span class="highlite-TYPE">Int</span><span class="highlite-OPERATOR">,</span> :k; <span class="highlite-COMMENT"># OUTPUT: «(1 3)␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">grep</span> { .<span class="highlite-TYPE">Str</span>.<span class="highlite-ROUTINE">chars</span> <span class="highlite-OPERATOR">&gt;</span> 3 }<span class="highlite-OPERATOR">,</span> :kv<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">world</span><span class="highlite-STRING_DELIMITER">'</span>; <span class="highlite-COMMENT"># OUTPUT: «(0 hello 2 3.142857 4 world)␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">grep</span> { .<span class="highlite-TYPE">Str</span>.<span class="highlite-ROUTINE">chars</span> <span class="highlite-OPERATOR">&gt;</span> 3 }<span class="highlite-OPERATOR">,</span> :p<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">world</span><span class="highlite-STRING_DELIMITER">'</span>; <span class="highlite-COMMENT"># OUTPUT: «(0 =&gt; hello 2 =&gt; 3.142857 4 =&gt; world)␤»</span></pre> </div> </div> <h2 id="routine_first" class="raku-h2"><a href="#class_List" title="go to top of document">routine first<a class="raku-anchor" title="direct link" href="#routine_first">§</a></a></h2> <!-- defnmark routine_first 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">first</span>(<span class="highlite-TYPE">Mu</span> <span class="highlite-NAME_SCALAR">$matcher</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@elems</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$k</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$kv</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$p</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$end</span>) <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">first</span>(List:D: <span class="highlite-TYPE">Mu</span> <span class="highlite-NAME_SCALAR">$matcher</span>?<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$k</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$kv</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$p</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$end</span>)</pre> </div> </div> <p>Returns the first item of the list which smartmatches against <code>$matcher</code>, returns <a href="/type/Nil"><code>Nil</code></a> when no values match. The optional named parameter <code>:end</code> indicates that the search should be from the <strong>end</strong> of the list, rather than from the start.</p><p>Examples:</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> (1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> 300).first: <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">&gt;</span> 5; <span class="highlite-COMMENT"># OUTPUT: «42␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> 300).first: <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">&gt;</span> 5<span class="highlite-OPERATOR">,</span> :end; <span class="highlite-COMMENT"># OUTPUT: «300␤» </span><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">world</span><span class="highlite-STRING_DELIMITER">'</span>).first: <span class="highlite-TYPE">Complex</span>; <span class="highlite-COMMENT"># OUTPUT: «Nil␤»</span></pre> </div> </div> <p>The optional named parameters <code>:k</code>, <code>:kv</code>, <code>:p</code> provide the same functionality as on slices:</p> <ul class="rakudoc-item"> <li><p>k</p></li> </ul> <p>Return the index value of the matching element. Index is always counted from the beginning of the list, regardless of whether the <code>:end</code> named parameter is specified or not.</p> <ul class="rakudoc-item"> <li><p>kv</p></li> </ul> <p>Return both the index and matched element.</p> <ul class="rakudoc-item"> <li><p>p</p></li> </ul> <p>Return the index and the matched element as a <a href="/type/Pair"><code>Pair</code></a>.</p><p>Examples:</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> (1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> 300).first: <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">&gt;</span> 5<span class="highlite-OPERATOR">,</span> :k; <span class="highlite-COMMENT"># OUTPUT: «2␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> 300).first: <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">&gt;</span> 5<span class="highlite-OPERATOR">,</span> :p; <span class="highlite-COMMENT"># OUTPUT: «2 =&gt; 42␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> 300).first: <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">&gt;</span> 5<span class="highlite-OPERATOR">,</span> :kv<span class="highlite-OPERATOR">,</span> :end; <span class="highlite-COMMENT"># OUTPUT: «(3 300)␤»</span></pre> </div> </div> <p>In method form, the <code>$matcher</code> can be omitted, in which case the first available item (or last if <code>:end</code> is set) will be returned. See also <a href="/routine/head"><code>head</code></a> and <a href="/routine/tail"><code>tail</code></a> methods.</p> <h2 id="method_head" class="raku-h2"><a href="#class_List" title="go to top of document">method head<a class="raku-anchor" title="direct link" href="#method_head">§</a></a></h2> <!-- defnmark method_head 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">head</span>(Any:D:) <span class="highlite-KEYWORD">is</span> <span class="highlite-KEYWORD">raw</span> <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">head</span>(Any:D: Callable:D <span class="highlite-NAME_SCALAR">$w</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">head</span>(Any:D: <span class="highlite-NAME_SCALAR">$n</span>)</pre> </div> </div> <p>This method is directly inherited from <a href="/type/Any"><code>Any</code></a>, and it returns the <strong>first</strong> <code>$n</code> items of the list, an empty list if <code>$n</code> &lt;= 0, or the first element with no argument. The version that takes a <a href="/type/Callable"><code>Callable</code></a> uses a <a href="/type/WhateverCode"><code>WhateverCode</code></a> to specify all elements, starting from the first, but the last ones.</p><p>Examples:</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> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">head</span> ; <span class="highlite-COMMENT"># OUTPUT: «a␤» </span><span class="highlite-ROUTINE">say</span> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">head</span>(2); <span class="highlite-COMMENT"># OUTPUT: «(a b)␤» </span><span class="highlite-ROUTINE">say</span> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">head</span>(*-3); <span class="highlite-COMMENT"># OUTPUT: «(a b)␤»</span></pre> </div> </div> <h2 id="method_tail" class="raku-h2"><a href="#class_List" title="go to top of document">method tail<a class="raku-anchor" title="direct link" href="#method_tail">§</a></a></h2> <!-- defnmark method_tail 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">tail</span>(List:D:) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">tail</span>(List:D: <span class="highlite-NAME_SCALAR">$n</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns a <a href="/type/Seq"><code>Seq</code></a> containing the <strong>last</strong> <code>$n</code> items of the list. Returns an empty <a href="/type/Seq"><code>Seq</code></a> if <code>$n</code> &lt;= 0. Defaults to the last element if no argument is specified. Throws an exception if the list is lazy.</p><p>Examples:</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> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">tail</span>(*-3);<span class="highlite-COMMENT"># OUTPUT: «(d e)␤» </span><span class="highlite-ROUTINE">say</span> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">tail</span>(2); <span class="highlite-COMMENT"># OUTPUT: «(d e)␤» </span><span class="highlite-ROUTINE">say</span> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">tail</span>; <span class="highlite-COMMENT"># OUTPUT: «e␤» </span></pre> </div> </div> <p>In the first case, <code>$n</code> is taking the shape of a <a href="/type/WhateverCode"><code>WhateverCode</code></a> to indicate the number of elements from the beginning that will be excluded. <code>$n</code> can be either a Callable, in which case it will be called with the value <code>0</code>, or anything else that can be converted to a number, in which case it will use that as the number of elements in the output <a href="/type/Seq"><code>Seq</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-ROUTINE">say</span> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">tail</span>( { <span class="highlite-NAME_SCALAR">$_</span> <span class="highlite-OPERATOR">-</span> 2 } ); <span class="highlite-COMMENT"># OUTPUT: «(c d e)␤»</span></pre> </div> </div> <h2 id="routine_categorize" class="raku-h2"><a href="#class_List" title="go to top of document">routine categorize<a class="raku-anchor" title="direct link" href="#routine_categorize">§</a></a></h2> <!-- defnmark routine_categorize 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">categorize</span>() <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">categorize</span>(<span class="highlite-TYPE">Whatever</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">categorize</span>(<span class="highlite-NAME_SCALAR">$test</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$into</span>!<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_CODE">&amp;as</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">categorize</span>(<span class="highlite-NAME_SCALAR">$test</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_CODE">&amp;as</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">categorize</span>(<span class="highlite-NAME_SCALAR">$test</span><span class="highlite-OPERATOR">,</span> +items<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$into</span>!<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_HASH">%named</span> ) <span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">categorize</span>(<span class="highlite-NAME_SCALAR">$test</span><span class="highlite-OPERATOR">,</span> +items<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_HASH">%named</span> )</pre> </div> </div> <p>These methods are directly inherited from <a href="/type/Any"><code>Any</code></a>; see <a href="/type/Any#routine_categorize"><code>Any.list</code></a> for more examples.</p><p>This routine transforms a list of values into a hash representing the categorizations of those values according to <code>$test</code>, which is called once for every element in the list; each hash key represents one possible categorization for one or more of the incoming list values, and the corresponding hash value contains an array of those list values categorized by the <code>$test</code>, acting like a mapper, into the category of the associated key.</p><p>Note that, unlike <a href="/routine/classify">classify</a>, which assumes that the return value of the mapper is a single value, <code>categorize</code> always assumes that the return value of the mapper is a list of categories that are appropriate to the current value.</p><p>Example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> mapper(<span class="highlite-TYPE">Int</span> <span class="highlite-NAME_SCALAR">$i</span>) <span class="highlite-KEYWORD">returns</span> <span class="highlite-TYPE">List</span> { <span class="highlite-NAME_SCALAR">$i</span> <span class="highlite-OPERATOR">%%</span> 2 <span class="highlite-OPERATOR">??</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">even</span><span class="highlite-STRING_DELIMITER">'</span> <span class="highlite-OPERATOR">!!</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">odd</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$i</span>.<span class="highlite-ROUTINE">is-prime</span> <span class="highlite-OPERATOR">??</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">prime</span><span class="highlite-STRING_DELIMITER">'</span> <span class="highlite-OPERATOR">!!</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">not prime</span><span class="highlite-STRING_DELIMITER">'</span> } <span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">categorize</span> <span class="highlite-NAME_CODE">&amp;mapper</span><span class="highlite-OPERATOR">,</span> (1<span class="highlite-OPERATOR">,</span> 7<span class="highlite-OPERATOR">,</span> 6<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 2); <span class="highlite-COMMENT"># OUTPUT: «{even =&gt; [6 2], not prime =&gt; [1 6], odd =&gt; [1 7 3], prime =&gt; [7 3 2]}␤»</span></pre> </div> </div> <h2 id="routine_classify" class="raku-h2"><a href="#class_List" title="go to top of document">routine classify<a class="raku-anchor" title="direct link" href="#routine_classify">§</a></a></h2> <!-- defnmark routine_classify 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">classify</span>(<span class="highlite-NAME_SCALAR">$test</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$into</span>!<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_CODE">&amp;as</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">classify</span>(<span class="highlite-NAME_SCALAR">$test</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_CODE">&amp;as</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">classify</span>(<span class="highlite-NAME_SCALAR">$test</span><span class="highlite-OPERATOR">,</span> +items<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$into</span>!<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_HASH">%named</span> ) <span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">classify</span>(<span class="highlite-NAME_SCALAR">$test</span><span class="highlite-OPERATOR">,</span> +items<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_HASH">%named</span> )</pre> </div> </div> <p>Transforms a list of values into a hash representing the classification of those values; each hash key represents the classification for one or more of the incoming list values, and the corresponding hash value contains an array of those list values classified into the category of the associated key. <code>$test</code> will be an expression that will produce the hash keys according to which the elements are going to be classified.</p><p>Example:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">classify</span> { <span class="highlite-NAME_SCALAR">$_</span> <span class="highlite-OPERATOR">%%</span> 2 <span class="highlite-OPERATOR">??</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">even</span><span class="highlite-STRING_DELIMITER">'</span> <span class="highlite-OPERATOR">!!</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">odd</span><span class="highlite-STRING_DELIMITER">'</span> }<span class="highlite-OPERATOR">,</span> (1<span class="highlite-OPERATOR">,</span> 7<span class="highlite-OPERATOR">,</span> 6<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 2); <span class="highlite-COMMENT"># OUTPUT: «{even =&gt; [6 2], odd =&gt; [1 7 3]}␤» </span><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">hello</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> 1<span class="highlite-OPERATOR">,</span> 22/7<span class="highlite-OPERATOR">,</span> 42<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">world</span><span class="highlite-STRING_DELIMITER">'</span>).classify: { .<span class="highlite-TYPE">Str</span>.<span class="highlite-ROUTINE">chars</span> }; <span class="highlite-COMMENT"># OUTPUT: «{1 =&gt; [1], 2 =&gt; [42], 5 =&gt; [hello world], 8 =&gt; [3.142857]}␤»</span></pre> </div> </div> <p>It can also take <code>:as</code> as a named parameter, transforming the value before classifying 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-ROUTINE">say</span> &lt;Innie Minnie Moe&gt;.<span class="highlite-ROUTINE">classify</span>( { <span class="highlite-NAME_SCALAR">$_</span>.<span class="highlite-ROUTINE">chars</span> }<span class="highlite-OPERATOR">,</span> :as{ <span class="highlite-ROUTINE">lc</span> <span class="highlite-NAME_SCALAR">$_</span> }); <span class="highlite-COMMENT"># OUTPUT: «{3 =&gt; [moe], 5 =&gt; [innie], 6 =&gt; [minnie]}␤»</span></pre> </div> </div> <p>This code is classifying by number of characters, which is the expression that has been passed as <code>$test</code> parameter, but the <code>:as</code> block lowercases it before doing the transformation. The named parameter <code>:into</code> can also be used to classify <em>into</em> a newly defined variable:</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-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">Innie Minnie Moe</span><span class="highlite-STRING_DELIMITER">&gt;</span>.<span class="highlite-ROUTINE">classify</span>( { <span class="highlite-NAME_SCALAR">$_</span>.<span class="highlite-ROUTINE">chars</span> }<span class="highlite-OPERATOR">,</span> :as{ <span class="highlite-ROUTINE">lc</span> <span class="highlite-NAME_SCALAR">$_</span> }<span class="highlite-OPERATOR">,</span> :into( <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_HASH">%words</span>{<span class="highlite-TYPE">Int</span>} ) ); <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_HASH">%words</span>; <span class="highlite-COMMENT"># OUTPUT: «{3 =&gt; [moe], 5 =&gt; [innie], 6 =&gt; [minnie]}␤»</span></pre> </div> </div> <p>We are declaring the scope of <code>%words{Int}</code> on the fly, with keys that are actually integers; it gets created with the result of the classification.</p> <h2 id="method_Bool" class="raku-h2"><a href="#class_List" title="go to top of document">method Bool<a class="raku-anchor" title="direct link" href="#method_Bool">§</a></a></h2> <!-- defnmark method_Bool 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-TYPE">Bool</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Bool:D)</pre> </div> </div> <p>Returns <code>True</code> if the list has at least one element, and <code>False</code> for the empty list.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> ().<span class="highlite-TYPE">Bool</span>; <span class="highlite-COMMENT"># OUTPUT: «False␤» </span><span class="highlite-ROUTINE">say</span> (1).<span class="highlite-TYPE">Bool</span>; <span class="highlite-COMMENT"># OUTPUT: «True␤»</span></pre> </div> </div> <h2 id="method_Str" class="raku-h2"><a href="#class_List" title="go to top of document">method Str<a class="raku-anchor" title="direct link" href="#method_Str">§</a></a></h2> <!-- defnmark method_Str 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-TYPE">Str</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Str:D)</pre> </div> </div> <p>Stringifies the elements of the list and joins them with spaces (same as <code>.join(' ')</code>).</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (1,2,3,4,5).<span class="highlite-TYPE">Str</span>; <span class="highlite-COMMENT"># OUTPUT: «1 2 3 4 5␤»</span></pre> </div> </div> <h2 id="method_Int" class="raku-h2"><a href="#class_List" title="go to top of document">method Int<a class="raku-anchor" title="direct link" href="#method_Int">§</a></a></h2> <!-- defnmark method_Int 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-TYPE">Int</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Int:D)</pre> </div> </div> <p>Returns the number of elements in the list (same as <code>.elems</code>).</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (1,2,3,4,5).<span class="highlite-TYPE">Int</span>; <span class="highlite-COMMENT"># OUTPUT: «5␤»</span></pre> </div> </div> <h2 id="method_Numeric" class="raku-h2"><a href="#class_List" title="go to top of document">method Numeric<a class="raku-anchor" title="direct link" href="#method_Numeric">§</a></a></h2> <!-- defnmark method_Numeric 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-TYPE">Numeric</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Int:D)</pre> </div> </div> <p>Returns the number of elements in the list (same as <code>.elems</code>).</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (1,2,3,4,5).<span class="highlite-TYPE">Numeric</span>; <span class="highlite-COMMENT"># OUTPUT: «5␤»</span></pre> </div> </div> <h2 id="method_Capture" class="raku-h2"><a href="#class_List" title="go to top of document">method Capture<a class="raku-anchor" title="direct link" href="#method_Capture">§</a></a></h2> <!-- defnmark method_Capture 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-TYPE">Capture</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Capture:D)</pre> </div> </div> <p>Returns a <a href="/type/Capture"><code>Capture</code></a> where each <a href="/type/Pair"><code>Pair</code></a>, if any, in the &lt;<code>List</code> has been converted to a named argument (with the <a href="/type/Pair#method_key">key</a> of the <a href="/type/Pair"><code>Pair</code></a> stringified). All other elements in the <code>List</code> are converted to positional arguments in the order they are found, i.e. the first non pair item in the list becomes the first positional argument, which gets index <code>0</code>, the second non pair item becomes the second positional argument, getting index <code>1</code> etc.</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">$list</span> <span class="highlite-OPERATOR">=</span> (7<span class="highlite-OPERATOR">,</span> 5<span class="highlite-OPERATOR">,</span> a <span class="highlite-OPERATOR">=&gt;</span> 2<span class="highlite-OPERATOR">,</span> b <span class="highlite-OPERATOR">=&gt;</span> 17); <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$capture</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-NAME_SCALAR">$list</span>.<span class="highlite-TYPE">Capture</span>; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$capture</span>.<span class="highlite-ROUTINE">keys</span>; <span class="highlite-COMMENT"># OUTPUT: «(0 1 a b)␤» </span>my-sub(<span class="highlite-OPERATOR">|</span><span class="highlite-NAME_SCALAR">$capture</span>); <span class="highlite-COMMENT"># OUTPUT: «7, 5, 2, 17␤» </span> <span class="highlite-KEYWORD">sub</span> my-sub(<span class="highlite-NAME_SCALAR">$first</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$second</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_SCALAR">$b</span>) { <span class="highlite-ROUTINE">say</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-NAME_SCALAR">$first</span><span class="highlite-STRING">, </span><span class="highlite-NAME_SCALAR">$second</span><span class="highlite-STRING">, </span><span class="highlite-NAME_SCALAR">$a</span><span class="highlite-STRING">, </span><span class="highlite-NAME_SCALAR">$b</span><span class="highlite-STRING_DELIMITER">&quot;</span> }</pre> </div> </div> <p>A more advanced example demonstrating the returned <a href="/type/Capture"><code>Capture</code></a> being matched against a <a href="/type/Signature"><code>Signature</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">$list</span> <span class="highlite-OPERATOR">=</span> (7<span class="highlite-OPERATOR">,</span> 5<span class="highlite-OPERATOR">,</span> a <span class="highlite-OPERATOR">=&gt;</span> 2<span class="highlite-OPERATOR">,</span> b <span class="highlite-OPERATOR">=&gt;</span> 17); <span class="highlite-ROUTINE">say</span> <span class="highlite-OPERATOR">so</span> <span class="highlite-NAME_SCALAR">$list</span>.<span class="highlite-TYPE">Capture</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-OPERATOR">:</span>($ <span class="highlite-KEYWORD">where</span> <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">==</span> 7<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"># OUTPUT: «True␤» </span> <span class="highlite-NAME_SCALAR">$list</span> <span class="highlite-OPERATOR">=</span> (8<span class="highlite-OPERATOR">,</span> 5<span class="highlite-OPERATOR">,</span> a <span class="highlite-OPERATOR">=&gt;</span> 2<span class="highlite-OPERATOR">,</span> b <span class="highlite-OPERATOR">=&gt;</span> 17); <span class="highlite-ROUTINE">say</span> <span class="highlite-OPERATOR">so</span> <span class="highlite-NAME_SCALAR">$list</span>.<span class="highlite-TYPE">Capture</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-OPERATOR">:</span>($ <span class="highlite-KEYWORD">where</span> <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">==</span> 7<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"># OUTPUT: «False␤»</span></pre> </div> </div> <h2 id="routine_pick" class="raku-h2"><a href="#class_List" title="go to top of document">routine pick<a class="raku-anchor" title="direct link" href="#routine_pick">§</a></a></h2> <!-- defnmark routine_pick 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">pick</span>(<span class="highlite-NAME_SCALAR">$count</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@list</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">pick</span>(List:D: <span class="highlite-NAME_SCALAR">$count</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">pick</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Mu</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">pick</span>(List:D: <span class="highlite-TYPE">Callable</span> <span class="highlite-NAME_SCALAR">$calculate</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>If <code>$count</code> is supplied: Returns <code>$count</code> elements chosen at random and without repetition from the invocant. If <code>*</code> is passed as <code>$count</code>, or <code>$count</code> is greater than or equal to the size of the list, then all elements from the invocant list are returned in a random sequence; i.e. they are returned shuffled.</p><p>In <em>method</em> form, if <code>$count</code> is omitted: Returns a single random item from the list, or Nil if the list is empty</p><p>Examples:</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> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">pick</span>; <span class="highlite-COMMENT"># OUTPUT: «b␤» </span><span class="highlite-ROUTINE">say</span> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.pick: 3; <span class="highlite-COMMENT"># OUTPUT: «(c a e)␤» </span><span class="highlite-ROUTINE">say</span> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.pick: <span class="highlite-OPERATOR">*</span>; <span class="highlite-COMMENT"># OUTPUT: «(e d a b c)␤»</span></pre> </div> </div> <p>As of the 2021.06 release of the Rakudo compiler, it is also possible to specify <code>**</code> (aka <a href="/type/HyperWhatever"><code>HyperWhatever</code></a>) as the count.</p><p>In that case, <code>.pick</code> will start picking again on the original list after it has been exhausted, again and again, indefinitely.</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> &lt;a b c&gt;.<span class="highlite-ROUTINE">pick</span>(<span class="highlite-OPERATOR">**</span>).<span class="highlite-ROUTINE">head</span>(10); <span class="highlite-COMMENT"># OUTPUT: «((a c b c a b b c a b))␤»</span></pre> </div> </div> <h2 id="routine_roll" class="raku-h2"><a href="#class_List" title="go to top of document">routine roll<a class="raku-anchor" title="direct link" href="#routine_roll">§</a></a></h2> <!-- defnmark routine_roll 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">roll</span>(<span class="highlite-NAME_SCALAR">$count</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@list</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">roll</span>(List:D: <span class="highlite-NAME_SCALAR">$count</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">roll</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Mu</span>)</pre> </div> </div> <p>If <code>$count</code> is supplied: Returns a sequence of <code>$count</code> elements, each randomly selected from the list. Each random choice is made independently, like a separate die roll where each die face is a list element. If <code>*</code> is passed as <code>$count</code> returns a lazy, infinite sequence of randomly chosen elements from the original list.</p><p>If <code>$count</code> is omitted: Returns a single random item from the list, or Nil if the list is empty</p><p>Examples:</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> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">roll</span>; <span class="highlite-COMMENT"># 1 random letter </span><span class="highlite-ROUTINE">say</span> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.roll: 3; <span class="highlite-COMMENT"># 3 random letters </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">roll</span> 8<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">a b c d e</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-COMMENT"># 8 random letters </span> <span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_SCALAR">$random-digits</span> <span class="highlite-OPERATOR">:=</span> (^10).<span class="highlite-ROUTINE">roll</span>(<span class="highlite-OPERATOR">*</span>); <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_SCALAR">$random-digits</span>[^15]; <span class="highlite-COMMENT"># 15 random digits</span></pre> </div> </div> <h2 id="routine_eager" class="raku-h2"><a href="#class_List" title="go to top of document">routine eager<a class="raku-anchor" title="direct link" href="#routine_eager">§</a></a></h2> <!-- defnmark routine_eager 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">eager</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> List:D)</pre> </div> </div> <p>Evaluates all elements in the <code>List</code> eagerly, and returns them as a <code>List</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> \ll <span class="highlite-OPERATOR">=</span> (<span class="highlite-ROUTINE">lazy</span> 1..5).<span class="highlite-ROUTINE">cache</span>; <span class="highlite-ROUTINE">say</span> ll[]; <span class="highlite-COMMENT"># OUTPUT: «(...)␤» </span><span class="highlite-ROUTINE">say</span> ll.<span class="highlite-ROUTINE">eager</span> <span class="highlite-COMMENT"># OUTPUT: «(1 2 3 4 5)␤»</span></pre> </div> </div> <h2 id="routine_reverse" class="raku-h2"><a href="#class_List" title="go to top of document">routine reverse<a class="raku-anchor" title="direct link" href="#routine_reverse">§</a></a></h2> <!-- defnmark routine_reverse 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">reverse</span>(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@list</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">reverse</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns a <a href="/type/Seq"><code>Seq</code></a> with the same elements in reverse order.</p><p>Note that <code>reverse</code> always refers to reversing elements of a list; to reverse the characters in a string, use <a href="/routine/flip">flip</a>.</p><p>Examples:</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> &lt;hello world!<span class="highlite-OPERATOR">&gt;</span>.<span class="highlite-ROUTINE">reverse</span>; <span class="highlite-COMMENT"># OUTPUT: «(world! hello)␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">reverse</span> ^10; <span class="highlite-COMMENT"># OUTPUT: «(9 8 7 6 5 4 3 2 1 0)␤»</span></pre> </div> </div> <h2 id="routine_rotate" class="raku-h2"><a href="#class_List" title="go to top of document">routine rotate<a class="raku-anchor" title="direct link" href="#routine_rotate">§</a></a></h2> <!-- defnmark routine_rotate 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">rotate</span>(<span class="highlite-NAME_ARRAY">@list</span><span class="highlite-OPERATOR">,</span> Int:D <span class="highlite-NAME_SCALAR">$n</span> <span class="highlite-OPERATOR">=</span> 1 <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">rotate</span>(List:D: Int:D <span class="highlite-NAME_SCALAR">$n</span> <span class="highlite-OPERATOR">=</span> 1 <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns a <a href="/type/Seq"><code>Seq</code></a> with the list elements rotated to the left when <code>$n</code> is positive or to the right otherwise.</p><p>Examples:</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> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">rotate</span>(2); <span class="highlite-COMMENT"># OUTPUT: (c d e a b) </span><span class="highlite-ROUTINE">say</span> &lt;a b c <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">rotate</span>(-1); <span class="highlite-COMMENT"># OUTPUT: (e a b c d)</span></pre> </div> </div> <p><strong>Note</strong>: Before Rakudo version 2020.06 a new <code>List</code> was returned instead of a <a href="/type/Seq"><code>Seq</code></a>.</p> <h2 id="routine_sort" class="raku-h2"><a href="#class_List" title="go to top of document">routine sort<a class="raku-anchor" title="direct link" href="#routine_sort">§</a></a></h2> <!-- defnmark routine_sort 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">sort</span>(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@elems</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">sort</span>(<span class="highlite-NAME_CODE">&amp;custom-routine-to-use</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@elems</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">sort</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">sort</span>(List:D: <span class="highlite-NAME_CODE">&amp;custom-routine-to-use</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Sorts the list, smallest element first. By default <a href="/routine/cmp"><code>infix:&lt;cmp&gt;</code></a> is used for comparing list elements.</p><p>If <code>&amp;custom-routine-to-use</code> is provided, and it accepts two arguments, it is invoked for pairs of list elements, and should return <code>Order::Less</code>, <code>Order::Same</code> or <code>Order::More</code>.</p><p>If <code>&amp;custom-routine-to-use</code> accepts only one argument, the list elements are sorted according to <code>custom-routine-to-use($a) cmp custom-routine-to-use($b)</code>. The return values of <code>&amp;custom-routine-to-use</code> are cached, so that <code>&amp;custom-routine-to-use</code> is only called once per list element.</p><p>Examples:</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> (3<span class="highlite-OPERATOR">,</span> -4<span class="highlite-OPERATOR">,</span> 7<span class="highlite-OPERATOR">,</span> -1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 0).<span class="highlite-ROUTINE">sort</span>; <span class="highlite-COMMENT"># OUTPUT: «(-4 -1 0 2 3 7)␤» </span><span class="highlite-ROUTINE">say</span> (3<span class="highlite-OPERATOR">,</span> -4<span class="highlite-OPERATOR">,</span> 7<span class="highlite-OPERATOR">,</span> -1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 0).sort: <span class="highlite-OPERATOR">*</span>.<span class="highlite-ROUTINE">abs</span>; <span class="highlite-COMMENT"># OUTPUT: «(0 -1 2 3 -4 7)␤» </span><span class="highlite-ROUTINE">say</span> (3<span class="highlite-OPERATOR">,</span> -4<span class="highlite-OPERATOR">,</span> 7<span class="highlite-OPERATOR">,</span> -1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 0).sort: { $^b <span class="highlite-OPERATOR">leg</span> $^a }; <span class="highlite-COMMENT"># OUTPUT: «(7 3 2 0 -4 -1)␤»</span></pre> </div> </div> <p>Additionally, if <code>&amp;custom-routine-to-use</code> returns a <code>List</code>, elements will be sorted based upon multiple values with subsequent values in the <code>List</code> being used to break the tie if the comparison between the prior elements evaluate to <code>Order::Same</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">@resistance</span> <span class="highlite-OPERATOR">=</span> ( <span class="highlite-OPERATOR">%</span>( first-name <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">Kyle</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> last-name <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">Reese</span><span class="highlite-STRING_DELIMITER">'</span> )<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">%</span>( first-name <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">Sarah</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> last-name <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">Connor</span><span class="highlite-STRING_DELIMITER">'</span> )<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">%</span>( first-name <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">John</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> last-name <span class="highlite-OPERATOR">=&gt;</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">Connor</span><span class="highlite-STRING_DELIMITER">'</span> )<span class="highlite-OPERATOR">,</span> ); .<span class="highlite-ROUTINE">say</span> <span class="highlite-KEYWORD">for</span> <span class="highlite-NAME_ARRAY">@resistance</span>.sort: { <span class="highlite-OPERATOR">.</span>&lt;last-name&gt;<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">.</span>&lt;first-name&gt; }; <span class="highlite-COMMENT">#`( OUTPUT: {first-name =&gt; John, last-name =&gt; Connor} {first-name =&gt; Sarah, last-name =&gt; Connor} {first-name =&gt; Kyle, last-name =&gt; Reese} )</span></pre> </div> </div> <p>This sorting can be based on characteristics of a single element:</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> &lt;ddd aaa bbb bb ccc c&gt;.<span class="highlite-ROUTINE">sort</span>( {.<span class="highlite-ROUTINE">chars</span><span class="highlite-OPERATOR">,</span> .<span class="highlite-TYPE">Str</span>} ); <span class="highlite-COMMENT"># OUTPUT: «(c bb aaa bbb ccc ddd)␤» </span></pre> </div> </div> <p>In this case, elements of the array are sorted in ascending order according first to the string length (<code>.chars</code>) and second to the actual alphabetical order <code>.Str</code>) if the length is exactly the same.</p><p>Any number of criteria can be used in 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-ROUTINE">say</span> &lt;01 11 111 2 20 02&gt;.<span class="highlite-ROUTINE">sort</span>( { .<span class="highlite-TYPE">Int</span><span class="highlite-OPERATOR">,</span> .<span class="highlite-ROUTINE">comb</span>.<span class="highlite-ROUTINE">sum</span><span class="highlite-OPERATOR">,</span> .<span class="highlite-TYPE">Str</span> } ); <span class="highlite-COMMENT"># OUTPUT: «(01 02 2 11 20 111)␤» </span></pre> </div> </div> <p>Calling the <code>sort</code> sub without any arguments has become a runtime error as of release 2022.07 of the Rakudo compiler:</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">sort</span>; <span class="highlite-COMMENT"># ERROR: «Must specify something to sort␤» </span></pre> </div> </div> <p>As of release 2023.08 of the Rakudo compiler it is also possible to specify a <code>:k</code> named argument. This will cause the result to be a list of <strong>indices</strong> of the sorting process.</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> &lt;a c b <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;.<span class="highlite-ROUTINE">sort</span>(:k); <span class="highlite-COMMENT"># OUTPUT: «(0 2 1 3 4)␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">sort</span> &lt;a c b <span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span>&gt;<span class="highlite-OPERATOR">,</span> :k; <span class="highlite-COMMENT"># OUTPUT: «(0 2 1 3 4)␤»</span></pre> </div> </div> <h2 id="routine_reduce" class="raku-h2"><a href="#class_List" title="go to top of document">routine reduce<a class="raku-anchor" title="direct link" href="#routine_reduce">§</a></a></h2> <!-- defnmark routine_reduce 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">reduce</span>(Any:D: <span class="highlite-NAME_CODE">&amp;with</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">reduce</span> (<span class="highlite-NAME_CODE">&amp;with</span><span class="highlite-OPERATOR">,</span> +<span class="highlite-ROUTINE">list</span>)</pre> </div> </div> <p>Returns a single &quot;combined&quot; value from a list of arbitrarily many values, by iteratively applying a routine which knows how to combine <em>two</em> values. In addition to the subroutine and the list, an initial value can be provided to initialize the reduction, which ends up being the return value if the list is empty. Thus <code>reduce f, init, list</code> combines the elements of the list from left to right, as is shown in the following pseudocode:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>「Pseudo」 without highlighting</label> <div> <pre class="nohighlights"><pre class="nohighlights"> result0 = init result1 = f(result0, list[0]) result2 = f(result1, list[1]) ... resultn = f(resultn-1, list[n-1]) </pre> </pre> </div> </div> <p><code>resultn</code> is the final result for an n-element list.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">reduce</span> <span class="highlite-NAME_CODE">&amp;infix:</span><span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">+</span><span class="highlite-STRING_DELIMITER">&gt;</span><span class="highlite-OPERATOR">,</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3); <span class="highlite-COMMENT"># OUTPUT: «6␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3).reduce: <span class="highlite-NAME_CODE">&amp;infix:</span><span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">+</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-COMMENT"># OUTPUT: «6␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">reduce</span> <span class="highlite-NAME_CODE">&amp;max</span><span class="highlite-OPERATOR">,</span> (5<span class="highlite-OPERATOR">,</span> 9<span class="highlite-OPERATOR">,</span> 12<span class="highlite-OPERATOR">,</span> 1); <span class="highlite-COMMENT"># OUTPUT: «12␤»</span></pre> </div> </div> <p>If <code>list</code> contains just a single element, the operator is applied to that single element if possible; if not, it returns the element itself.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">reduce</span> <span class="highlite-NAME_CODE">&amp;infix:</span><span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">-</span><span class="highlite-STRING_DELIMITER">&gt;</span><span class="highlite-OPERATOR">,</span> (10<span class="highlite-OPERATOR">,</span>); <span class="highlite-COMMENT"># OUTPUT: «10␤»</span></pre> </div> </div> <p>When the list contains no elements, an exception is thrown, unless <code>&amp;with</code> is an <em>operator</em> with a known identity value (e.g., the identity value of <code>infix:&lt;+&gt;</code> is 0). For this reason, you're advised to prefix the input list with an initial value (or explicit identity 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> \strings <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">One good string!</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">And one another good string!</span><span class="highlite-STRING_DELIMITER">&quot;</span>; <span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">reduce</span> { $^a <span class="highlite-OPERATOR">~</span> $^b }<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> |strings; <span class="highlite-COMMENT"># like strings.join </span> <span class="highlite-KEYWORD">my</span> \numbers <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-ROUTINE">say</span> <span class="highlite-ROUTINE">reduce</span> { $^a <span class="highlite-OPERATOR">&gt;</span> $^b <span class="highlite-OPERATOR">??</span> $^a <span class="highlite-OPERATOR">!!</span> $^b }<span class="highlite-OPERATOR">,</span> 0<span class="highlite-OPERATOR">,</span> |numbers; <span class="highlite-COMMENT"># like numbers.max </span> <span class="highlite-KEYWORD">sub</span> count-and-sum-evens( (<span class="highlite-TYPE">Int</span> \<span class="highlite-ROUTINE">count</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span> \<span class="highlite-ROUTINE">sum</span>)<span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Int</span> \<span class="highlite-OPERATOR">x</span> ) { <span class="highlite-OPERATOR">x</span> <span class="highlite-OPERATOR">%%</span> 2 <span class="highlite-OPERATOR">??</span> (<span class="highlite-ROUTINE">count</span>+1<span class="highlite-OPERATOR">,</span> <span class="highlite-ROUTINE">sum</span>+<span class="highlite-OPERATOR">x</span>) <span class="highlite-OPERATOR">!!</span> (<span class="highlite-ROUTINE">count</span><span class="highlite-OPERATOR">,</span> <span class="highlite-ROUTINE">sum</span>) } <span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">reduce</span> <span class="highlite-NAME_CODE">&amp;count-and-sum-evens</span><span class="highlite-OPERATOR">,</span> (0<span class="highlite-OPERATOR">,</span> 0)<span class="highlite-OPERATOR">,</span> |numbers; <span class="highlite-COMMENT"># OUTPUT: «(2 6)␤»</span></pre> </div> </div> <p>In the last example, since <code>reduce</code> only supports one initial value we use a <code>List</code> with two values, which is by itself a single value. The <code>count-and-sum-evens</code> subroutine takes two positional values: a <code>List</code> of two <a href="/type/Int"><code>Int</code></a>s and an <a href="/type/Int"><code>Int</code></a>, and return a <code>List</code> storing the count and sum of the even integers accumulated.</p><p>If <code>&amp;with</code> is the code object of an <em>operator</em>, its inherent identity value and associativity is respected - in other words, <code>(VAL1, VAL2, VAL3).reduce(&amp;infix:&lt;OP&gt;)</code> is the same as <code>VAL1 OP VAL2 OP VAL3</code> even for operators which aren't left-associative:</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"># Raise 2 to the 81st power, because 3 to the 4th power is 81 </span>(2,3,4).<span class="highlite-ROUTINE">reduce</span>(<span class="highlite-NAME_CODE">&amp;infix:</span><span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">**</span><span class="highlite-STRING_DELIMITER">&gt;</span>).<span class="highlite-ROUTINE">lsb</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «81␤» </span>(2*<span class="highlite-OPERATOR">*</span>(3**4)).<span class="highlite-ROUTINE">lsb</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «81␤» </span>(2**3**4).<span class="highlite-ROUTINE">lsb</span>.<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «81␤» </span> <span class="highlite-COMMENT"># Subtract 4 from -1, because 2 minus 3 is -1 </span>(2,3,4).<span class="highlite-ROUTINE">reduce</span>(<span class="highlite-NAME_CODE">&amp;infix:</span><span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">-</span><span class="highlite-STRING_DELIMITER">&gt;</span>).<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «-5␤» </span>((2-3)-4).<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «-5␤» </span>(2-3-4).<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «-5␤»</span></pre> </div> </div> <p>Since reducing with an infix operator is a common thing to do, the <a href="/language/operators#Reduction_metaoperators">reduction metaoperator</a> <code>[ ]</code> provides a syntactic shortcut. Thus, instead of passing the operator's code object to <code>reduce</code>, just pass the operator directly to <code>[ ]</code>. To use a user-defined subroutine instead, provide an additional layer of square brackets around the subroutine's code object:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> [<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-COMMENT"># OUTPUT: «24␤» </span><span class="highlite-ROUTINE">say</span> [<span class="highlite-OPERATOR">min</span>] (4<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 1<span class="highlite-OPERATOR">,</span> 3); <span class="highlite-COMMENT"># OUTPUT: «1␤» </span> <span class="highlite-KEYWORD">sub</span> mult { $^a <span class="highlite-OPERATOR">*</span> $^b }; <span class="highlite-ROUTINE">say</span> [[<span class="highlite-NAME_CODE">&amp;mult</span>]] (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 4); <span class="highlite-COMMENT"># OUTPUT: «24␤»</span></pre> </div> </div> <p>Semantically, all the following do the same thing:</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> \numbers <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-ROUTINE">say</span> <span class="highlite-ROUTINE">reduce</span> { $^a <span class="highlite-OPERATOR">+</span> $^b }<span class="highlite-OPERATOR">,</span> 0<span class="highlite-OPERATOR">,</span> |numbers; <span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">reduce</span> <span class="highlite-OPERATOR">*</span> <span class="highlite-OPERATOR">+</span> <span class="highlite-OPERATOR">*</span><span class="highlite-OPERATOR">,</span> 0<span class="highlite-OPERATOR">,</span> |numbers; <span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">reduce</span> <span class="highlite-OPERATOR">&amp;</span>[<span class="highlite-OPERATOR">+</span>]<span class="highlite-OPERATOR">,</span> numbers; <span class="highlite-COMMENT"># operator does not need explicit identity value </span><span class="highlite-ROUTINE">say</span> [<span class="highlite-OPERATOR">+</span>] numbers;</pre> </div> </div> <p>Since <code>reduce</code> is an implicit loop that iterates over with its <em>reducing</em> subroutine, it responds to <code>next</code>, <code>last</code> and <code>redo</code> statements inside <code>&amp;with</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> last-after-seven { <span class="highlite-ROUTINE">last</span> <span class="highlite-KEYWORD">if</span> $^a <span class="highlite-OPERATOR">&gt;</span> 7; $^a <span class="highlite-OPERATOR">+</span> $^b }; <span class="highlite-ROUTINE">say</span> (2<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 4<span class="highlite-OPERATOR">,</span> 5).reduce: <span class="highlite-NAME_CODE">&amp;last-after-seven</span>; <span class="highlite-COMMENT"># OUTPUT: «9␤»</span></pre> </div> </div> <p>Whether <code>reduce</code> accumulates the elements starting from the left or from the right depends on the operator. In the functional programming world, this operation is generally called a <a href="https://en.wikipedia.org/wiki/Fold_%28higher-order_function%29#Folds_on_lists">fold</a>. With a right-associative operator it is a <em>right fold</em>, otherwise (and usually) it is a <em>left fold</em>. In Raku, you can specify the associativity of an operator with the <a href="/language/functions#index-entry-is_assoc"><code>is assoc</code></a> trait.</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> infix:<span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">foo</span><span class="highlite-STRING_DELIMITER">&gt;</span>(<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$b</span>) <span class="highlite-KEYWORD">is</span> assoc&lt;<span class="highlite-ROUTINE">right</span>&gt; { <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">(</span><span class="highlite-NAME_SCALAR">$a</span><span class="highlite-STRING">, </span><span class="highlite-NAME_SCALAR">$b</span><span class="highlite-STRING">)</span><span class="highlite-STRING_DELIMITER">&quot;</span> } <span class="highlite-ROUTINE">say</span> [foo] 1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 4; <span class="highlite-COMMENT"># OUTPUT: «(1, (2, (3, 4)))␤» </span> <span class="highlite-KEYWORD">sub</span> infix:<span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">bar</span><span class="highlite-STRING_DELIMITER">&gt;</span>(<span class="highlite-NAME_SCALAR">$a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$b</span>) <span class="highlite-KEYWORD">is</span> assoc&lt;left&gt; { <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">(</span><span class="highlite-NAME_SCALAR">$a</span><span class="highlite-STRING">, </span><span class="highlite-NAME_SCALAR">$b</span><span class="highlite-STRING">)</span><span class="highlite-STRING_DELIMITER">&quot;</span> } <span class="highlite-ROUTINE">say</span> [bar] 1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 4; <span class="highlite-COMMENT"># OUTPUT: «(((1, 2), 3), 4)␤»</span></pre> </div> </div> <p><strong>Practical example 1:</strong> In this example, we generate a random-ish math formula (e.g., &quot;(4 + ((3 * x) + 11) / 6))&quot;) using <code>reduce</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">@ops</span> <span class="highlite-OPERATOR">=</span> [<span class="highlite-OPERATOR">Z</span>] (<span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">+ - * /</span><span class="highlite-STRING_DELIMITER">&gt;</span><span class="highlite-OPERATOR">,</span> 1..20)».<span class="highlite-ROUTINE">roll</span>(4); <span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">x</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">|</span><span class="highlite-NAME_ARRAY">@ops</span>).reduce: <span class="highlite-KEYWORD">-&gt;</span> <span class="highlite-NAME_SCALAR">$formula</span><span class="highlite-OPERATOR">,</span> [<span class="highlite-NAME_SCALAR">$op</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$number</span>] { <span class="highlite-TYPE">Bool</span>.<span class="highlite-ROUTINE">pick</span> <span class="highlite-OPERATOR">??</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">(</span><span class="highlite-NAME_SCALAR">$formula</span><span class="highlite-STRING"> </span><span class="highlite-NAME_SCALAR">$op</span><span class="highlite-STRING"> </span><span class="highlite-NAME_SCALAR">$number</span><span class="highlite-STRING">)</span><span class="highlite-STRING_DELIMITER">&quot;</span> <span class="highlite-OPERATOR">!!</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">(</span><span class="highlite-NAME_SCALAR">$number</span><span class="highlite-STRING"> </span><span class="highlite-NAME_SCALAR">$op</span><span class="highlite-STRING"> </span><span class="highlite-NAME_SCALAR">$formula</span><span class="highlite-STRING">)</span><span class="highlite-STRING_DELIMITER">&quot;</span> }</pre> </div> </div> <p><strong>Practical example 2:</strong> Suppose we have a polynomial represented as a list of integer coefficients, c[n-1], c[n-2], ..., c[0], where c[i] is the coefficient of xi. We can evaluate it using <code>map</code> and <code>reduce</code> as follows:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> evaluate(List:D \c <span class="highlite-KEYWORD">where</span> c.<span class="highlite-ROUTINE">all</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-TYPE">Int</span><span class="highlite-OPERATOR">,</span> Rat:D \<span class="highlite-OPERATOR">x</span> <span class="highlite-KEYWORD">--&gt;</span> Rat:D) { <span class="highlite-KEYWORD">my</span> \xi <span class="highlite-OPERATOR">=</span> (c.<span class="highlite-ROUTINE">elems</span> <span class="highlite-OPERATOR">^...</span> 0).map: <span class="highlite-KEYWORD">-&gt;</span> \i { <span class="highlite-OPERATOR">x</span> <span class="highlite-OPERATOR">**</span> i }; <span class="highlite-COMMENT"># [x^(n-1), ..., x^0] </span> <span class="highlite-KEYWORD">my</span> \axi <span class="highlite-OPERATOR">=</span> [<span class="highlite-OPERATOR">+</span>] c <span class="highlite-OPERATOR">Z</span>* xi; <span class="highlite-COMMENT"># [c[n-1]*x^(n-1), ..., c[*]x^0] </span> [<span class="highlite-OPERATOR">+</span>] axi; <span class="highlite-COMMENT"># sum of axi </span>} <span class="highlite-KEYWORD">my</span> \c <span class="highlite-OPERATOR">=</span> 2<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 1; <span class="highlite-COMMENT"># 2x² + 3x + 1 </span><span class="highlite-ROUTINE">say</span> evaluate c<span class="highlite-OPERATOR">,</span> 3.0; <span class="highlite-COMMENT"># OUTPUT: «28␤» </span><span class="highlite-ROUTINE">say</span> evaluate c<span class="highlite-OPERATOR">,</span> 10.0; <span class="highlite-COMMENT"># OUTPUT: «231␤»</span></pre> </div> </div> <h2 id="routine_produce" class="raku-h2"><a href="#class_List" title="go to top of document">routine produce<a class="raku-anchor" title="direct link" href="#routine_produce">§</a></a></h2> <!-- defnmark routine_produce 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">produce</span>(<span class="highlite-NAME_CODE">&amp;with</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@values</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">produce</span>(List:D: <span class="highlite-NAME_CODE">&amp;with</span>)</pre> </div> </div> <p>Generates a list of all intermediate &quot;combined&quot; values along with the final result by iteratively applying a function which knows how to combine <em>two</em> values.</p><p>If <code>@values</code> contains just a single element, a list containing that element is returned immediately. If it contains no elements, an exception is thrown, unless <code>&amp;with</code> is an <em>operator</em> with a known identity value.</p><p>If <code>&amp;with</code> is the function object of an <em>operator</em>, its inherent identity value and associativity is respected - in other words, <code>(VAL1, VAL2, VAL3).produce(&amp;[OP])</code> is the same as <code>VAL1 OP VAL2 OP VAL3</code> even for operators which aren't left-associative:</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"># Raise 2 to the 81st power, because 3 to the 4th power is 81 </span>[2,3,4].<span class="highlite-ROUTINE">produce</span>(<span class="highlite-OPERATOR">&amp;</span>[<span class="highlite-OPERATOR">**</span>]).<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «(4 81 2417851639229258349412352)␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">produce</span> <span class="highlite-OPERATOR">&amp;</span>[<span class="highlite-OPERATOR">**</span>]<span class="highlite-OPERATOR">,</span> (2,3,4); <span class="highlite-COMMENT"># OUTPUT: «(4 81 2417851639229258349412352)␤» </span><span class="highlite-ROUTINE">say</span> [\<span class="highlite-OPERATOR">**</span>] (2,3,4); <span class="highlite-COMMENT"># OUTPUT: «(4 81 2417851639229258349412352)␤» </span> <span class="highlite-COMMENT"># Subtract 4 from -1, because 2 minus 3 is -1 </span>[2,3,4].<span class="highlite-ROUTINE">produce</span>(<span class="highlite-OPERATOR">&amp;</span>[<span class="highlite-OPERATOR">-</span>]).<span class="highlite-ROUTINE">say</span>; <span class="highlite-COMMENT"># OUTPUT: «(2 -1 -5)␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">produce</span> <span class="highlite-OPERATOR">&amp;</span>[<span class="highlite-OPERATOR">-</span>]<span class="highlite-OPERATOR">,</span> (2,3,4); <span class="highlite-COMMENT"># OUTPUT: «(2 -1 -5)␤» </span><span class="highlite-ROUTINE">say</span> [\<span class="highlite-OPERATOR">-</span>] (2,3,4); <span class="highlite-COMMENT"># OUTPUT: «(2 -1 -5)␤»</span></pre> </div> </div> <p>A triangle metaoperator <code>[\ ]</code> provides a syntactic shortcut for producing with an infix operator:</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"># The following all do the same thing... </span><span class="highlite-KEYWORD">my</span> <span class="highlite-NAME_ARRAY">@numbers</span> <span class="highlite-OPERATOR">=</span> (1,2,3,4,5); <span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">produce</span> { $^a <span class="highlite-OPERATOR">+</span> $^b }<span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_ARRAY">@numbers</span>; <span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">produce</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_ARRAY">@numbers</span>; <span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">produce</span> <span class="highlite-OPERATOR">&amp;</span>[<span class="highlite-OPERATOR">+</span>]<span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_ARRAY">@numbers</span>; <span class="highlite-COMMENT"># operator does not need explicit identity </span><span class="highlite-ROUTINE">say</span> [\<span class="highlite-OPERATOR">+</span>] <span class="highlite-NAME_ARRAY">@numbers</span>; <span class="highlite-COMMENT"># most people write it this way</span></pre> </div> </div> <p>The visual picture of a triangle <code>[\</code> is not accidental. To produce a triangular list of lists, you can use a &quot;triangular comma&quot;:</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>] 1..5; <span class="highlite-COMMENT"># ( </span><span class="highlite-COMMENT"># (1) </span><span class="highlite-COMMENT"># (1 2) </span><span class="highlite-COMMENT"># (1 2 3) </span><span class="highlite-COMMENT"># (1 2 3 4) </span><span class="highlite-COMMENT"># (1 2 3 4 5) </span><span class="highlite-COMMENT"># )</span></pre> </div> </div> <p>Since <code>produce</code> is an implicit loop, it responds to <code>next</code>, <code>last</code> and <code>redo</code> statements inside <code>&amp;with</code>:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (2,3,4,5).produce: { <span class="highlite-ROUTINE">last</span> <span class="highlite-KEYWORD">if</span> $^a <span class="highlite-OPERATOR">&gt;</span> 7; $^a <span class="highlite-OPERATOR">+</span> $^b }; <span class="highlite-COMMENT"># OUTPUT: «(2 5 9)␤»</span></pre> </div> </div> <h2 id="routine_combinations" class="raku-h2"><a href="#class_List" title="go to top of document">routine combinations<a class="raku-anchor" title="direct link" href="#routine_combinations">§</a></a></h2> <!-- defnmark routine_combinations 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">combinations</span>(<span class="highlite-NAME_SCALAR">$from</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$of</span> <span class="highlite-OPERATOR">=</span> 0.<span class="highlite-OPERATOR">.*</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">combinations</span>(List:D: <span class="highlite-TYPE">Int</span>() <span class="highlite-NAME_SCALAR">$of</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">combinations</span>(List:D: Iterable:D <span class="highlite-NAME_SCALAR">$of</span> <span class="highlite-OPERATOR">=</span> 0.<span class="highlite-OPERATOR">.*</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns a <a href="/type/Seq"><code>Seq</code></a> with all <code>$of</code>-combinations of the invocant list. <code>$of</code> can be a numeric <a href="/type/Range"><code>Range</code></a>, in which case combinations of the range of item numbers it represents will be returned (i.e. <code>2.6 .. 4</code> will return 2-, 3-, and 4-item combinations). Otherwise, <code>$of</code> is coerced to an <a href="/type/Int"><code>Int</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-ROUTINE">say</span> <span class="highlite-KEYWORD">for</span> &lt;a b c&gt;.combinations: 2; <span class="highlite-COMMENT"># OUTPUT: </span><span class="highlite-COMMENT"># (a b) </span><span class="highlite-COMMENT"># (a c) </span><span class="highlite-COMMENT"># (b c)</span></pre> </div> </div> <p>Above, there are three possible ways to combine the 2-items lists from the original list, which is what we receive in the output. See <a href="/routine/permutations">permutations</a> if you want permutations instead of combinations.</p><p>With <a href="/type/Range"><code>Range</code></a> argument, we get both three 2-item combinations and one 3-item combination:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights">.<span class="highlite-ROUTINE">say</span> <span class="highlite-KEYWORD">for</span> &lt;a b c&gt;.combinations: 2..3; <span class="highlite-COMMENT"># OUTPUT: </span><span class="highlite-COMMENT"># (a b) </span><span class="highlite-COMMENT"># (a c) </span><span class="highlite-COMMENT"># (b c) </span><span class="highlite-COMMENT"># (a b c)</span></pre> </div> </div> <p>If <code>$of</code> is negative or is larger than there are items in the given list, an empty list will be returned. If <code>$of</code> is zero, a 1-item list containing an empty list will be returned (there's exactly 1 way to pick no items).</p><p>The subroutine form is equivalent to the method form called on the first argument (<code>$from</code>), with the exception that if <code>$from</code> is not an <a href="/type/Iterable"><code>Iterable</code></a>, it gets coerced to an <a href="/type/Int"><code>Int</code></a> and combinations are made from a <a href="/type/Range"><code>Range</code></a> constructed with <code>0..^$from</code> instead:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights">.<span class="highlite-ROUTINE">say</span> <span class="highlite-KEYWORD">for</span> <span class="highlite-ROUTINE">combinations</span> 3<span class="highlite-OPERATOR">,</span> 2 <span class="highlite-COMMENT"># OUTPUT: </span><span class="highlite-COMMENT"># (0 1) </span><span class="highlite-COMMENT"># (0 2) </span><span class="highlite-COMMENT"># (1 2)</span></pre> </div> </div> <p><strong>Note:</strong> some implementations may limit the maximum value of non-<a href="/type/Iterable"><code>Iterable</code></a> <code>$from</code>. On Rakudo, 64-bit systems have a limit of <code>2³¹-1</code> and 32-bit systems have a limit of <code>2²⁸-1</code>.</p> <h2 id="routine_permutations" class="raku-h2"><a href="#class_List" title="go to top of document">routine permutations<a class="raku-anchor" title="direct link" href="#routine_permutations">§</a></a></h2> <!-- defnmark routine_permutations 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">permutations</span>(<span class="highlite-TYPE">Int</span>() <span class="highlite-NAME_SCALAR">$from</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-ROUTINE">permutations</span>(<span class="highlite-TYPE">Iterable</span> <span class="highlite-NAME_SCALAR">$from</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">permutations</span>(List:D: <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns all possible permutations of a list as a <a href="/type/Seq"><code>Seq</code></a> of lists:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights">.<span class="highlite-ROUTINE">say</span> <span class="highlite-KEYWORD">for</span> &lt;a b c&gt;.<span class="highlite-ROUTINE">permutations</span>; <span class="highlite-COMMENT"># OUTPUT: </span><span class="highlite-COMMENT"># (a b c) </span><span class="highlite-COMMENT"># (a c b) </span><span class="highlite-COMMENT"># (b a c) </span><span class="highlite-COMMENT"># (b c a) </span><span class="highlite-COMMENT"># (c a b) </span><span class="highlite-COMMENT"># (c b a)</span></pre> </div> </div> <p><code>permutations</code> treats all elements as unique, thus <code>(1, 1, 2).permutations</code> returns a list of 6 elements, even though there are only three distinct permutations, due to first two elements being the same.</p><p>The subroutine form behaves the same as the method form, computing permutations from its first argument <code>$from</code>. If <code>$from</code> is not an <a href="/type/Iterable"><code>Iterable</code></a>, coerces <code>$from</code> to an <a href="/type/Int"><code>Int</code></a> and picks from a <a href="/type/Range"><code>Range</code></a> constructed with <code>0..^$from</code>:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights">.<span class="highlite-ROUTINE">say</span> <span class="highlite-KEYWORD">for</span> <span class="highlite-ROUTINE">permutations</span> 3; <span class="highlite-COMMENT"># OUTPUT: </span><span class="highlite-COMMENT"># (0 1 2) </span><span class="highlite-COMMENT"># (0 2 1) </span><span class="highlite-COMMENT"># (1 0 2) </span><span class="highlite-COMMENT"># (1 2 0) </span><span class="highlite-COMMENT"># (2 0 1) </span><span class="highlite-COMMENT"># (2 1 0)</span></pre> </div> </div> <h2 id="routine_rotor" class="raku-h2"><a href="#class_List" title="go to top of document">routine rotor<a class="raku-anchor" title="direct link" href="#routine_rotor">§</a></a></h2> <!-- defnmark routine_rotor 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">rotor</span>(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@cycle</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Bool</span>() <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$partial</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Returns a sequence of lists, where each sublist is made up of elements of the invocant.</p><p>In the simplest case, <code>@cycle</code> contains just one integer, in which case the invocant list is split into sublists with as many elements as the integer specifies. If <code>:$partial</code> is True, the final chunk is included even if it doesn't satisfy the length requirement:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">rotor</span>(3).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a b c|d e f␤» </span><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">rotor</span>(3<span class="highlite-OPERATOR">,</span> :partial).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a b c|d e f|g h␤»</span></pre> </div> </div> <p>If the element of <code>@cycle</code> is a <a href="/type/Pair"><code>Pair</code></a> instead, the key of the pair specifies the length of the return sublist, and the value the gap between sublists; negative gaps produce overlap:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">rotor</span>(2 <span class="highlite-OPERATOR">=&gt;</span> 1).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a b|d e|g h␤» </span><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">rotor</span>(3 <span class="highlite-OPERATOR">=&gt;</span> -1).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a b c|c d e|e f g␤»</span></pre> </div> </div> <p>If <code>@cycle</code> contains more than element, <code>rotor</code> cycles through it to find the number of elements for each sublist:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">rotor</span>(2<span class="highlite-OPERATOR">,</span> 3).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a b|c d e|f g␤» </span><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">rotor</span>(1 <span class="highlite-OPERATOR">=&gt;</span> 1<span class="highlite-OPERATOR">,</span> 3).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a|c d e|f␤»</span></pre> </div> </div> <p>Combining multiple cycles and <code>:partial</code> also works:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> (<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">rotor</span>(1 <span class="highlite-OPERATOR">=&gt;</span> 1<span class="highlite-OPERATOR">,</span> 3 <span class="highlite-OPERATOR">=&gt;</span> -1<span class="highlite-OPERATOR">,</span> :partial).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a|c d e|e|g h␤»</span></pre> </div> </div> <p>See <a href="http://blogs.perl.org/users/zoffix_znet/2016/01/perl-6-rotor-the-king-of-list-manipulation.html">this blog post for more elaboration on rotor</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">multi</span> <span class="highlite-ROUTINE">rotor</span>(Int:D <span class="highlite-NAME_SCALAR">$batch</span><span class="highlite-OPERATOR">,</span> \<span class="highlite-ROUTINE">source</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Bool</span>() <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$partial</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) </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">multi</span> <span class="highlite-ROUTINE">rotor</span>(<span class="highlite-OPERATOR">*</span><span class="highlite-NAME_ARRAY">@cycle</span><span class="highlite-OPERATOR">,</span> \<span class="highlite-ROUTINE">source</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">Bool</span>() <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$partial</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D) </pre> </div> </div> <p>Available as of 6.e language version (early implementation exists in Rakudo compiler 2022.02+).</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">rotor</span>(3<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a b c|d e f␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">rotor</span>(3<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> :partial).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a b c|d e f|g h␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">rotor</span>(2 <span class="highlite-OPERATOR">=&gt;</span> 1<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a b|d e|g h␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">rotor</span>(3 <span class="highlite-OPERATOR">=&gt;</span> -1<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span>).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a b c|c d e|e f g␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">rotor</span>(1 <span class="highlite-OPERATOR">=&gt;</span> 1<span class="highlite-OPERATOR">,</span> 3 <span class="highlite-OPERATOR">=&gt;</span> -1<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">a</span><span class="highlite-STRING_DELIMITER">'</span>..<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">h</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> :partial).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">|</span><span class="highlite-STRING_DELIMITER">'</span>); <span class="highlite-COMMENT"># OUTPUT: «a|c d e|e|g h␤» </span></pre> </div> </div> <h2 id="method_batch" class="raku-h2"><a href="#class_List" title="go to top of document">method batch<a class="raku-anchor" title="direct link" href="#method_batch">§</a></a></h2> <!-- defnmark method_batch 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">batch</span>(Int:D <span class="highlite-NAME_SCALAR">$batch</span> <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Seq</span>) <span class="highlite-KEYWORD">multi</span> <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">batch</span>(Int:D <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$elems</span> <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Seq</span>)</pre> </div> </div> <p>Returns a sequence of lists, wherein each list with the exception of the last one is guaranteed to comprise a number of elements equal to the batch size specified by <code>$batch</code> or <code>$elems</code>, respectively. If the invocant has a number of elements that is not an integer multiple of the batch size, the last list in the returned sequence will contain any remaining elements and thus have less than <code>$batch</code> or <code>$elems</code> elements. Accordingly, <code>.batch($batch)</code> is shorthand for <code>.rotor($batch, :partial)</code>.</p> <h2 id="routine_cross" class="raku-h2"><a href="#class_List" title="go to top of document">routine cross<a class="raku-anchor" title="direct link" href="#routine_cross">§</a></a></h2> <!-- defnmark routine_cross 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">cross</span>(<span class="highlite-OPERATOR">+</span><span class="highlite-NAME_ARRAY">@e</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_CODE">&amp;with</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Computes the cross-product of two or more lists or <a href="/type/Iterable"><code>Iterable</code></a>s. This returns a sequence of lists where the first item in each list is an item from the first iterable, the second is from the second given iterable, etc. Every item will be paired with every other item in all the other lists.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">cross</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-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-ROUTINE">map</span>(<span class="highlite-OPERATOR">*</span>.<span class="highlite-ROUTINE">join</span>).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">,</span><span class="highlite-STRING_DELIMITER">&quot;</span>) <span class="highlite-COMMENT"># OUTPUT: «ad,ae,af,bd,be,bf,cd,ce,cf␤»</span></pre> </div> </div> <p>The <code>cross</code> routine has an infix synonym as well, named <a href="/language/operators#infix_X"><code>X</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-ROUTINE">say</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-OPERATOR">X</span> &lt;<span class="highlite-ROUTINE">d</span> <span class="highlite-ROUTINE">e</span> <span class="highlite-ROUTINE">f</span>&gt;).<span class="highlite-ROUTINE">map</span>(<span class="highlite-OPERATOR">*</span>.<span class="highlite-ROUTINE">join</span>).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">,</span><span class="highlite-STRING_DELIMITER">&quot;</span>) <span class="highlite-COMMENT"># output is the same as the previous example</span></pre> </div> </div> <p>If the optional <code>with</code> parameter is passed, it is used as a reduction operation to apply to each of the cross product items.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">cross</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-OPERATOR">,</span> 6]<span class="highlite-OPERATOR">,</span> :with(<span class="highlite-NAME_CODE">&amp;infix:</span><span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">*</span><span class="highlite-STRING_DELIMITER">&gt;</span>)).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">,</span><span class="highlite-STRING_DELIMITER">&quot;</span>); <span class="highlite-COMMENT"># OUTPUT: «4,5,6,8,10,12,12,15,18␤»</span></pre> </div> </div> <p>The <code>X</code> operator can be combined with another operator as a metaoperator to perform a reduction as well:</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> ([1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3] <span class="highlite-OPERATOR">X</span>* [4<span class="highlite-OPERATOR">,</span> 5<span class="highlite-OPERATOR">,</span> 6]).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">,</span><span class="highlite-STRING_DELIMITER">&quot;</span>) <span class="highlite-COMMENT"># same output as the previous example</span></pre> </div> </div> <h2 id="routine_zip" class="raku-h2"><a href="#class_List" title="go to top of document">routine zip<a class="raku-anchor" title="direct link" href="#routine_zip">§</a></a></h2> <!-- defnmark routine_zip 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">zip</span>(<span class="highlite-OPERATOR">+</span><span class="highlite-NAME_ARRAY">@e</span><span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_CODE">&amp;with</span> <span class="highlite-KEYWORD">--&gt;</span> Seq:D)</pre> </div> </div> <p>Builds a 'list of lists', returned as a sequence, from multiple input lists or other <a href="/type/Iterable"><code>Iterable</code></a>s.</p><p><code>zip</code> iterates through each of the input lists synchronously, 'Zipping' them together, so that elements are grouped according to their input list index, in the order that the lists are provided.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">zip</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-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-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">g h i</span><span class="highlite-STRING_DELIMITER">&gt;</span>); <span class="highlite-COMMENT"># OUTPUT: «((a d g) (b e h) (c f i))␤»</span></pre> </div> </div> <p><code>zip</code> has an infix synonym, the <a href="/language/operators#infix_Z"><code>Z</code> operator</a>.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> &lt;a b c&gt; <span class="highlite-OPERATOR">Z</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-OPERATOR">Z</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">g h i</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-COMMENT"># same output</span></pre> </div> </div> <p><code>zip</code> can provide input to 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;a b c&gt; <span class="highlite-OPERATOR">Z</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-OPERATOR">Z</span> &lt;g h i&gt; <span class="highlite-KEYWORD">-&gt;</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">$z</span>] {<span class="highlite-ROUTINE">say</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">$z</span>).<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">,</span><span class="highlite-STRING_DELIMITER">&quot;</span>)} <span class="highlite-COMMENT"># OUTPUT: «a,d,g␤b,e,h␤c,f,i␤»</span></pre> </div> </div> <p>, or more succinctly:</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> .<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">,</span><span class="highlite-STRING_DELIMITER">&quot;</span>) <span class="highlite-KEYWORD">for</span> <span class="highlite-ROUTINE">zip</span> &lt;a b c&gt;<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-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">g h i</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-COMMENT"># same output</span></pre> </div> </div> <p>Note, that if the input lists have an unequal number of elements, then <code>zip</code> terminates once the shortest input list is exhausted, and trailing elements from longer input lists are discarded.</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> &lt;a b c&gt; <span class="highlite-OPERATOR">Z</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">d e f m n o p</span><span class="highlite-STRING_DELIMITER">&gt;</span> <span class="highlite-OPERATOR">Z</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">g h i</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-COMMENT"># ((a d g) (b e h) (c f i))</span></pre> </div> </div> <p>In cases where data clipping is possible, but undesired, then consider using <a href="/routine/roundrobin">roundrobin</a> instead of <code>zip</code>.</p><p>The optional <code>with</code> parameter will additionally reduce the zipped lists. For example, the following multiplies corresponding elements together to return a single list of products.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights">.<span class="highlite-ROUTINE">say</span> <span class="highlite-KEYWORD">for</span> <span class="highlite-ROUTINE">zip</span> &lt;1 2 3&gt;<span class="highlite-OPERATOR">,</span> [1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3]<span class="highlite-OPERATOR">,</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3)<span class="highlite-OPERATOR">,</span> :with(<span class="highlite-NAME_CODE">&amp;infix:</span><span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">*</span><span class="highlite-STRING_DELIMITER">&gt;</span>); <span class="highlite-COMMENT"># OUTPUT: «1␤8␤27␤»</span></pre> </div> </div> <p>The <code>Z</code> form can also be used to perform reduction by implicitly setting the <code>with</code> parameter with a metaoperator :</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights">.<span class="highlite-ROUTINE">say</span> <span class="highlite-KEYWORD">for</span> &lt;1 2 3&gt; <span class="highlite-OPERATOR">Z</span>* [1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3] <span class="highlite-OPERATOR">Z</span>* (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3); <span class="highlite-COMMENT"># same output</span></pre> </div> </div> <h2 id="routine_roundrobin" class="raku-h2"><a href="#class_List" title="go to top of document">routine roundrobin<a class="raku-anchor" title="direct link" href="#routine_roundrobin">§</a></a></h2> <!-- defnmark routine_roundrobin 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">roundrobin</span>(+list-of-lists <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Seq</span>)</pre> </div> </div> <p>Builds a 'list of lists', returned as a sequence, from multiple input lists or other <a href="/type/Iterable"><code>Iterable</code></a>s. <code>roundrobin</code> returns an identical result to that of <a href="/type/List#routine_zip">zip</a>, except when the input lists are allowed to have an unequal number of 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-ROUTINE">say</span> <span class="highlite-ROUTINE">roundrobin</span> &lt;a b c&gt;<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-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">g h i</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-COMMENT"># OUTPUT: «((a d g) (b e h) (c f i))␤» </span> <span class="highlite-ROUTINE">say</span> .<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">,</span><span class="highlite-STRING_DELIMITER">&quot;</span>) <span class="highlite-KEYWORD">for</span> <span class="highlite-ROUTINE">roundrobin</span>([1<span class="highlite-OPERATOR">,</span> 2]<span class="highlite-OPERATOR">,</span> [2<span class="highlite-OPERATOR">,</span> 3]<span class="highlite-OPERATOR">,</span> [3<span class="highlite-OPERATOR">,</span> 4]); <span class="highlite-COMMENT"># OUTPUT: «1,2,3␤2,3,4␤»</span></pre> </div> </div> <p><code>roundrobin</code> does not terminate once one or more of the input lists become exhausted, but proceeds until all elements from all lists have been processed.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">roundrobin</span> &lt;a b c&gt;<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">d e f m n o p</span><span class="highlite-STRING_DELIMITER">&gt;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">g h i j</span><span class="highlite-STRING_DELIMITER">&gt;</span>; <span class="highlite-COMMENT"># OUTPUT: «((a d g) (b e h) (c f i) (m j) (n) (o) (p))␤» </span> <span class="highlite-ROUTINE">say</span> .<span class="highlite-ROUTINE">join</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">,</span><span class="highlite-STRING_DELIMITER">&quot;</span>) <span class="highlite-KEYWORD">for</span> <span class="highlite-ROUTINE">roundrobin</span>([1<span class="highlite-OPERATOR">,</span> 2]<span class="highlite-OPERATOR">,</span> [2<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> 57<span class="highlite-OPERATOR">,</span> 77]<span class="highlite-OPERATOR">,</span> [3<span class="highlite-OPERATOR">,</span> 4<span class="highlite-OPERATOR">,</span> 102]); <span class="highlite-COMMENT"># OUTPUT: «1,2,3␤2,3,4␤57,102␤77␤»</span></pre> </div> </div> <p>Therefore no data values are lost due in the 'zipping' operation. A record of which input list provided which element cannot be gleaned from the resulting sequence, however.</p><p><code>roundrobin</code> can be useful in combining messy data to the point where a manual post-processing step can then be undertaken.</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">roundrobin</span>(+list-of-lists<span class="highlite-OPERATOR">,</span> <span class="highlite-OPERATOR">:</span><span class="highlite-NAME_SCALAR">$slip</span> <span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Seq</span>)</pre> </div> </div> <p>As of release 2022.02 of the Rakudo compiler, it is also possible to specify a <code>:slip</code> named argument. If specified with a true value, will <a href="/language/list#Slips">slip</a> the produced values.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">roundrobin</span> &lt;a b c&gt;<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">d e f m n o p</span><span class="highlite-STRING_DELIMITER">&gt;</span><span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">g h i j</span><span class="highlite-STRING_DELIMITER">&gt;</span><span class="highlite-OPERATOR">,</span> :slip; <span class="highlite-COMMENT"># OUTPUT: «(a d g b e h c f i m j n o p)␤»</span></pre> </div> </div> <h2 id="routine_sum" class="raku-h2"><a href="#class_List" title="go to top of document">routine sum<a class="raku-anchor" title="direct link" href="#routine_sum">§</a></a></h2> <!-- defnmark routine_sum 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">sub</span> <span class="highlite-ROUTINE">sum</span>(<span class="highlite-NAME_SCALAR">$list</span> ) <span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">sum</span>(List:D:)</pre> </div> </div> <p>Returns the sum of all elements in the list or 0 if the list is empty. Throws an exception if an element can not be coerced into Numeric.</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> (1<span class="highlite-OPERATOR">,</span> 3<span class="highlite-OPERATOR">,</span> pi).<span class="highlite-ROUTINE">sum</span>; <span class="highlite-COMMENT"># OUTPUT: «7.14159265358979␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">0xff</span><span class="highlite-STRING_DELIMITER">&quot;</span>).<span class="highlite-ROUTINE">sum</span>; <span class="highlite-COMMENT"># OUTPUT: «256␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-ROUTINE">sum</span>(0b1111<span class="highlite-OPERATOR">,</span> 5); <span class="highlite-COMMENT"># OUTPUT: «20␤»</span></pre> </div> </div> <p>If the list includes a <a href="/type/Junction"><code>Junction</code></a>, the result will accordingly be a <a href="/type/Junction"><code>Junction</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-ROUTINE">say</span> ( 1|2<span class="highlite-OPERATOR">,</span> 3).<span class="highlite-ROUTINE">sum</span>; <span class="highlite-COMMENT"># OUTPUT: «any(4, 5)␤» </span></pre> </div> </div> <p>When called on native integer arrays, it is also possible to specify a <code>:wrap</code> named parameter. This will add the values as native integers, wrapping around if they exceed the size of a native integer. If you are sure you will not exceed that value, or if you don't mind, using <code>:wrap</code> will make the calculation about 20x as fast.</p> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">my</span> <span class="highlite-TYPE">int</span> <span class="highlite-NAME_ARRAY">@a</span> <span class="highlite-OPERATOR">=</span> ^1_000_000; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-ROUTINE">sum</span>(:wrap); <span class="highlite-COMMENT"># OUTPUT: «499999500000␤» </span></pre> </div> </div> <h2 id="method_fmt" class="raku-h2"><a href="#class_List" title="go to top of document">method fmt<a class="raku-anchor" title="direct link" href="#method_fmt">§</a></a></h2> <!-- defnmark method_fmt 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">fmt</span>(<span class="highlite-NAME_SCALAR">$format</span> <span class="highlite-OPERATOR">=</span> <span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">%s</span><span class="highlite-STRING_DELIMITER">'</span><span class="highlite-OPERATOR">,</span> <span class="highlite-NAME_SCALAR">$separator</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-KEYWORD">--&gt;</span> Str:D)</pre> </div> </div> <p>Returns a string where each element in the list has been formatted according to <code>$format</code> and where each element is separated by <code>$separator</code>. If the list contains nested sub-lists, then <code>fmt</code> will flatten them before formatting each element. Thus, <code>fmt</code> will treat <code>[1, 2, [3, 4]]</code> as a list with 4 elements rather than 3.</p><p>For more information about formats strings, see <a href="/routine/sprintf">sprintf</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_ARRAY">@a</span> <span class="highlite-OPERATOR">=</span> 8..11; <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-ROUTINE">fmt</span>(<span class="highlite-STRING_DELIMITER">'</span><span class="highlite-STRING">%03d</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"># OUTPUT: «008,009,010,011␤»</span></pre> </div> </div> <h2 id="method_from" class="raku-h2"><a href="#class_List" title="go to top of document">method from<a class="raku-anchor" title="direct link" href="#method_from">§</a></a></h2> <!-- defnmark method_from 2 --> <p>Assumes the list contains <a href="/type/Match"><code>Match</code> objects</a> and returns the value of <code>.from</code> called on the first element of the list.</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-STRING_DELIMITER">'</span><span class="highlite-STRING">abcdefg</span><span class="highlite-STRING_DELIMITER">'</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-REGEX_DELIMITER">/</span><span class="highlite-REGEX_SPECIAL">(</span><span class="highlite-REGEX_LITERAL">c</span><span class="highlite-REGEX_SPECIAL">)(</span><span class="highlite-REGEX_LITERAL">d</span><span class="highlite-REGEX_SPECIAL">)</span><span class="highlite-REGEX_DELIMITER">/</span>; <span class="highlite-ROUTINE">say</span> $<span class="highlite-OPERATOR">/</span>.<span class="highlite-ROUTINE">list</span>.<span class="highlite-ROUTINE">from</span>; <span class="highlite-COMMENT"># OUTPUT: «2␤» </span> <span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">abc123def</span><span class="highlite-STRING_DELIMITER">&quot;</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-REGEX_DELIMITER">m:g/</span><span class="highlite-REGEX_SPECIAL">\d</span><span class="highlite-REGEX_DELIMITER">/</span>; <span class="highlite-ROUTINE">say</span> $<span class="highlite-OPERATOR">/</span>.<span class="highlite-ROUTINE">list</span>.<span class="highlite-ROUTINE">from</span>; <span class="highlite-COMMENT"># OUTPUT: «3␤»</span></pre> </div> </div> <h2 id="method_to" class="raku-h2"><a href="#class_List" title="go to top of document">method to<a class="raku-anchor" title="direct link" href="#method_to">§</a></a></h2> <!-- defnmark method_to 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">abc123def</span><span class="highlite-STRING_DELIMITER">&quot;</span> <span class="highlite-OPERATOR">~~</span> <span class="highlite-REGEX_DELIMITER">m:g/</span><span class="highlite-REGEX_SPECIAL">\d</span><span class="highlite-REGEX_DELIMITER">/</span>; <span class="highlite-ROUTINE">say</span> $<span class="highlite-OPERATOR">/</span>.<span class="highlite-ROUTINE">to</span>; <span class="highlite-COMMENT"># OUTPUT: «6␤»</span></pre> </div> </div> <p>Assumes the <code>List</code> contains <a href="/type/Match"><code>Match</code></a>es, such as the <code>$/</code> variable being a <code>List</code>, when using <code>:g</code> modifier in regexes. Returns the value of <code>.to</code> called on the last element of the list.</p> <h2 id="method_sink" class="raku-h2"><a href="#class_List" title="go to top of document">method sink<a class="raku-anchor" title="direct link" href="#method_sink">§</a></a></h2> <!-- defnmark method_sink 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">method</span> <span class="highlite-ROUTINE">sink</span>(<span class="highlite-KEYWORD">--&gt;</span> <span class="highlite-TYPE">Nil</span>) { }</pre> </div> </div> <p>It does nothing, and returns <a href="/type/Nil"><code>Nil</code></a>, as the definition clearly shows.</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">sink</span> [1,2,<span class="highlite-TYPE">Failure</span>.<span class="highlite-ROUTINE">new</span>(<span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">boo!</span><span class="highlite-STRING_DELIMITER">&quot;</span>)<span class="highlite-OPERATOR">,</span><span class="highlite-STRING_DELIMITER">&quot;</span><span class="highlite-STRING">still here</span><span class="highlite-STRING_DELIMITER">&quot;</span>]; <span class="highlite-COMMENT"># OUTPUT: «»</span></pre> </div> </div> <h2 id="method_Set" class="raku-h2"><a href="#class_List" title="go to top of document">method Set<a class="raku-anchor" title="direct link" href="#method_Set">§</a></a></h2> <!-- defnmark method_Set 2 --> <p>In general, creates a set which has as members elements of the list.</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> &lt;æ ß þ €<span class="highlite-OPERATOR">&gt;</span>.<span class="highlite-TYPE">Set</span>; <span class="highlite-COMMENT"># OUTPUT: «Set(ß æ þ €)␤»</span></pre> </div> </div> <p>However, there might be some unexpected changes in case the list includes non-scalar data structures. For instance, with <a href="/type/Pair"><code>Pair</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">@a</span> <span class="highlite-OPERATOR">=</span> (:42a<span class="highlite-OPERATOR">,</span> :33b); <span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@a</span>; <span class="highlite-COMMENT"># OUTPUT: «[a =&gt; 42 b =&gt; 33]␤» </span><span class="highlite-ROUTINE">say</span> <span class="highlite-NAME_ARRAY">@a</span>.<span class="highlite-TYPE">Set</span>; <span class="highlite-COMMENT"># OUTPUT: «Set(a b)␤»</span></pre> </div> </div> <p>The set will be composed of the <code>key</code>s of the Pair whose corresponding value is not 0, eliminating all the values. Please check the <a href="/type/Set#Creating_Set_objects"><code>Set</code> documentation</a> for more examples and a more thorough explanation.</p> <h1 id="Operators" class="raku-h1"><a href="#class_List" title="go to top of document">Operators<a class="raku-anchor" title="direct link" href="#Operators">§</a></a></h1> <h2 id="infix_cmp" class="raku-h2"><a href="#class_List" title="go to top of document">infix <code>cmp</code><a class="raku-anchor" title="direct link" href="#infix_cmp">§</a></a></h2> <!-- defnmark infix_cmp 2 --> <div class="raku-code raku-lang"> <button class="copy-code" title="Copy code"><i class="far fa-clipboard"></i></button> <label>Raku highlighting</label> <div> <pre class="nohighlights"><span class="highlite-KEYWORD">multi</span> infix:<span class="highlite-STRING_DELIMITER">&lt;</span><span class="highlite-STRING">cmp</span><span class="highlite-STRING_DELIMITER">&gt;</span>(<span class="highlite-TYPE">List</span> <span class="highlite-NAME_ARRAY">@a</span><span class="highlite-OPERATOR">,</span> <span class="highlite-TYPE">List</span> <span class="highlite-NAME_ARRAY">@b</span>)</pre> </div> </div> <p>Evaluates <code>Lists</code> by comparing element <code>@a[$i]</code> with <code>@b[$i]</code> (for some <code>Int $i</code>, beginning at 0) and returning <code>Order::Less</code>, <code>Order::Same</code>, or <code>Order::More</code> depending on if and how the values differ. If the operation evaluates to <code>Order::Same</code>, <code>@a[$i + 1]</code> is compared with <code>@b[$i + 1]</code>. This is repeated until one is greater than the other or all elements are exhausted.</p><p>If the <code>List</code>s are of different lengths, at most only <code>$n</code> comparisons will be made (where <code>$n = @a.elems min @b.elems</code>). If all of those comparisons evaluate to <code>Order::Same</code>, the final value is selected based upon which <code>List</code> is longer.</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> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3) <span class="highlite-OPERATOR">cmp</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3); <span class="highlite-COMMENT"># OUTPUT: «Same␤» </span><span class="highlite-ROUTINE">say</span> (4<span class="highlite-OPERATOR">,</span> 5<span class="highlite-OPERATOR">,</span> 6) <span class="highlite-OPERATOR">cmp</span> (4<span class="highlite-OPERATOR">,</span> 5<span class="highlite-OPERATOR">,</span> 7); <span class="highlite-COMMENT"># OUTPUT: «Less␤» </span><span class="highlite-ROUTINE">say</span> (7<span class="highlite-OPERATOR">,</span> 8<span class="highlite-OPERATOR">,</span> 9) <span class="highlite-OPERATOR">cmp</span> (7<span class="highlite-OPERATOR">,</span> 8<span class="highlite-OPERATOR">,</span> 8); <span class="highlite-COMMENT"># OUTPUT: «More␤» </span> <span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 2) <span class="highlite-OPERATOR">cmp</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3); <span class="highlite-COMMENT"># OUTPUT: «Less␤» </span><span class="highlite-ROUTINE">say</span> (1<span class="highlite-OPERATOR">,</span> 2<span class="highlite-OPERATOR">,</span> 3) <span class="highlite-OPERATOR">cmp</span> (1<span class="highlite-OPERATOR">,</span> 2); <span class="highlite-COMMENT"># OUTPUT: «More␤» </span><span class="highlite-ROUTINE">say</span> (9).<span class="highlite-TYPE">List</span> <span class="highlite-OPERATOR">cmp</span> (^10).<span class="highlite-TYPE">List</span>; <span class="highlite-COMMENT"># OUTPUT: «More␤»</span></pre> </div> </div> <h1 id="typegraphrelations" class="raku-h1"><a href="#" title="go to top of document">Typegraph<a class="raku-anchor" title="direct link" href="#typegraphrelations">§</a></a></h1> <figure class="typegraph" > <figcaption>Type relations for <code>List</code></figcaption> <svg width="303pt" height="332pt" viewBox="0.00 0.00 303.04 332.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 328)"> <title>raku&#45;type&#45;graph</title> <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-328 299.04,-328 299.04,4 -4,4"/> <!-- List --> <g id="node1" class="node"> <title>List</title> <g id="a_node1"><a xlink:href="/type/List" xlink:title="List"> <ellipse fill="none" stroke="#000000" cx="132.55" cy="-90" rx="27" ry="18"/> <text text-anchor="middle" x="132.55" y="-86.3" font-family="FreeSans" font-size="14.00" fill="#000000">List</text> </a> </g> </g> <!-- Cool --> <g id="node4" class="node"> <title>Cool</title> <g id="a_node4"><a xlink:href="/type/Cool" xlink:title="Cool"> <ellipse fill="none" stroke="#000000" cx="30.55" cy="-162" rx="30.59" ry="18"/> <text text-anchor="middle" x="30.55" y="-158.3" font-family="FreeSans" font-size="14.00" fill="#000000">Cool</text> </a> </g> </g> <!-- List&#45;&gt;Cool --> <g id="edge1" class="edge"> <title>List&#45;&gt;Cool</title> <path fill="none" stroke="#000000" d="M114.31,-103.51C98.65,-114.26 75.85,-129.91 57.98,-142.17"/> <polygon fill="#000000" stroke="#000000" points="55.93,-139.34 49.66,-147.88 59.89,-145.11 55.93,-139.34"/> </g> <!-- Positional --> <g id="node5" class="node"> <title>Positional</title> <g id="a_node5"><a xlink:href="/type/Positional" xlink:title="Positional"> <ellipse fill="none" stroke="#6666ff" cx="132.55" cy="-162" rx="53.89" ry="18"/> <text text-anchor="middle" x="132.55" y="-158.3" font-family="FreeSans" font-size="14.00" fill="#6666ff">Positional</text> </a> </g> </g> <!-- List&#45;&gt;Positional --> <g id="edge6" class="edge"> <title>List&#45;&gt;Positional</title> <path fill="none" stroke="#6666ff" d="M132.55,-108.3C132.55,-116.02 132.55,-125.29 132.55,-133.89"/> <polygon fill="#6666ff" stroke="#6666ff" points="129.05,-133.9 132.55,-143.9 136.05,-133.9 129.05,-133.9"/> </g> <!-- Iterable --> <g id="node6" class="node"> <title>Iterable</title> <g id="a_node6"><a xlink:href="/type/Iterable" xlink:title="Iterable"> <ellipse fill="none" stroke="#6666ff" cx="249.55" cy="-162" rx="45.49" ry="18"/> <text text-anchor="middle" x="249.55" y="-158.3" font-family="FreeSans" font-size="14.00" fill="#6666ff">Iterable</text> </a> </g> </g> <!-- List&#45;&gt;Iterable --> <g id="edge7" class="edge"> <title>List&#45;&gt;Iterable</title> <path fill="none" stroke="#6666ff" d="M152.13,-102.72C169.7,-113.23 195.83,-128.86 216.61,-141.29"/> <polygon fill="#6666ff" stroke="#6666ff" points="215.06,-144.45 225.44,-146.58 218.65,-138.44 215.06,-144.45"/> </g> <!-- Mu --> <g id="node2" class="node"> <title>Mu</title> <g id="a_node2"><a xlink:href="/type/Mu" xlink:title="Mu"> <ellipse fill="none" stroke="#000000" cx="30.55" cy="-306" rx="27" ry="18"/> <text text-anchor="middle" x="30.55" y="-302.3" font-family="FreeSans" font-size="14.00" fill="#000000">Mu</text> </a> </g> </g> <!-- Any --> <g id="node3" class="node"> <title>Any</title> <g id="a_node3"><a xlink:href="/type/Any" xlink:title="Any"> <ellipse fill="none" stroke="#000000" cx="30.55" cy="-234" rx="28.7" ry="18"/> <text text-anchor="middle" x="30.55" y="-230.3" font-family="FreeSans" font-size="14.00" fill="#000000">Any</text> </a> </g> </g> <!-- Any&#45;&gt;Mu --> <g id="edge2" class="edge"> <title>Any&#45;&gt;Mu</title> <path fill="none" stroke="#000000" d="M30.55,-252.3C30.55,-260.02 30.55,-269.29 30.55,-277.89"/> <polygon fill="#000000" stroke="#000000" points="27.05,-277.9 30.55,-287.9 34.05,-277.9 27.05,-277.9"/> </g> <!-- Cool&#45;&gt;Any --> <g id="edge3" class="edge"> <title>Cool&#45;&gt;Any</title> <path fill="none" stroke="#000000" d="M30.55,-180.3C30.55,-188.02 30.55,-197.29 30.55,-205.89"/> <polygon fill="#000000" stroke="#000000" points="27.05,-205.9 30.55,-215.9 34.05,-205.9 27.05,-205.9"/> </g> <!-- Array --> <g id="node7" class="node"> <title>Array</title> <g id="a_node7"><a xlink:href="/type/Array" xlink:title="Array"> <ellipse fill="none" stroke="#000000" cx="92.55" cy="-18" rx="35.19" ry="18"/> <text text-anchor="middle" x="92.55" y="-14.3" font-family="FreeSans" font-size="14.00" fill="#000000">Array</text> </a> </g> </g> <!-- Array&#45;&gt;List --> <g id="edge4" class="edge"> <title>Array&#45;&gt;List</title> <path fill="none" stroke="#000000" d="M102.03,-35.59C106.88,-44.08 112.88,-54.59 118.28,-64.04"/> <polygon fill="#000000" stroke="#000000" points="115.41,-66.07 123.41,-73.01 121.49,-62.59 115.41,-66.07"/> </g> <!-- Slip --> <g id="node8" class="node"> <title>Slip</title> <g id="a_node8"><a xlink:href="/type/Slip" xlink:title="Slip"> <ellipse fill="none" stroke="#000000" cx="172.55" cy="-18" rx="27.1" ry="18"/> <text text-anchor="middle" x="172.55" y="-14.3" font-family="FreeSans" font-size="14.00" fill="#000000">Slip</text> </a> </g> </g> <!-- Slip&#45;&gt;List --> <g id="edge5" class="edge"> <title>Slip&#45;&gt;List</title> <path fill="none" stroke="#000000" d="M163.27,-35.24C158.37,-43.81 152.26,-54.51 146.78,-64.1"/> <polygon fill="#000000" stroke="#000000" points="143.7,-62.43 141.77,-72.85 149.77,-65.91 143.7,-62.43"/> </g> </g> </svg> <p class="fallback"> <a rel="alternate" href="/assets/typegraphs/List.svg"> Expand chart above </a></p> </figure> </div></div></section> </div> </div> </div> <footer class="footer main-footer"> <div class="container px-4"> <nav class="level"> <div class="level-left"> <div class="level-item"> <a href="/about">About</a> </div> <div class="level-item"> <a id="toggle-theme">Toggle theme</a> </div> <div class="level-item" title="104c70a0d 2024-08-20"> <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