1<!doctype html> 2<html lang="en" data-theme="dark"> 3<head> 4<title>Raku®</title> 5<meta content="The Raku® programming language." name="description" /> 6<meta charset="utf-8" /> 7<meta content="width=device-width, initial-scale=1" name="viewport" />
8<script crossorigin="anonymous" integrity="sha384-xcuj3WpfgjlKF+FXhSQFQ0ZNr39ln+hwjN3npfM9VBnUskLolQAcN80McRIVOPuO" src="https://unpkg.com/[email protected]"></script>
8 9
10<script src="https://cdn.jsdelivr.net/gh/highlightjs/[email protected]/build/highlight.min.js"></script>
10 11
12<script src="https://cdn.jsdelivr.net/gh/highlightjs/[email protected]/build/languages/haskell.min.js"></script>
12 13
14<script> 15 (function () { 16 const savedTheme = localStorage.getItem("theme"); 17 18 let theme; 19 if (savedTheme) { 20 theme = savedTheme; 21 } else { 22 theme = window.matchMedia("(prefers-color-scheme: dark)").matches 23 ? "dark" 24 : "light"; 25 } 26 27 document.documentElement.setAttribute("data-theme", theme); 28 })(); 29 </script>
29 30
31<script defer data-website-id="bd5ca56b-3bad-47c7-b0a1-73ba5c3b5713" src="https://cloud.umami.is/script.js"></script>
31 32 33<link type="image/x-icon" href="/img/favicon.ico" rel="icon" /> 34<link rel="stylesheet" href="/css/styles.css" /> 35<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css" rel="stylesheet" /> 36<style>.tab-menu { 37 display: block; 38 justify-content: left; 39} 40.tab-links { 41 display: block; 42} 43.tab-links > li.active > a { 44 text-decoration: underline; 45} 46 47@media (max-width: 768px) { 48 .tab-menu { 49 text-align: left; 50 } 51 .tab-links > * { 52 padding-top: 0; 53 padding-bottom:1em; 54 } 55} 56</style> 57 58<style>.tab-menu { 59 display: block; 60 justify-content: left; 61} 62.tab-links { 63 display: block; 64} 65.tab-links > li > a { 66 border-radius: var(--pico-border-radius); 67 border-top-left-radius: 0; 68 border-top-right-radius: 0; 69 background-color: transparent; 70 text-decoration: none; 71 cursor: pointer; 72 user-select: none; 73} 74.tab-links > li.active > a { 75 text-decoration: none; 76 border-bottom: var(--pico-border-width) solid var(--pico-primary-hover); 77} 78 79@media (max-width: 768px) { 80 .tab-menu { 81 text-align: center; 82 } 83 .tab-links > * { 84 padding-top: 0; 85 padding-bottom:1em; 86 } 87} 88</style> 89 90<style>dashboard { 91 display: flex; 92 flex-wrap: wrap; 93 justify-content: center; 94 gap: 1rem; 95} 96</style> 97 98<style>dashboard > article { 99 display: flex; 100 align-items: center; 101 flex-direction: column; 102 103 /* Responsive sizing */ 104 flex: 1 1 600px; 105 max-width: 800px; 106 107 padding-left: 0.5rem !important; 108 padding-right: 0.5rem !important; 109 margin-top: 0 !important; 110} 111 112dashboard > article > header { 113 border-bottom-color: darkgray; 114 border-radius: 0px; 115} 116 117dashboard > article > footer { 118 border-top-color: darkgray; 119 border-radius: 0px; 120 margin-top: auto; 121} 122</style> 123 124<style>/* Custom styles for the hamburger menu */ 125.menu { 126 display: none; 127 flex-direction: column; 128 gap: 10px; 129 position: absolute; 130 top: 60px; 131 right: 20px; 132 background: rgba(0, 0, 0, .95); 133 padding: 1rem; 134 border-radius: 8px; 135 box-shadow: 0 4px 6px rgba(128, 128, 128, .2); 136 z-index: 800; 137} 138 139.menu a { 140 display: block; 141} 142 143.menu.show { 144 display: flex; 145} 146 147.hamburger { 148 color: var(--pico-primary); 149 display: none; 150 cursor: pointer; 151 font-size: 2.5rem; 152 background: none; 153 border: none; 154 padding: 0.5rem; 155} 156 157@media (max-width: 768px) { 158 .hamburger { 159 display: block; 160 } 161 162 .nav-links { 163 display: none; 164 } 165} 166</style> 167</head> 168 169<body> 170<header class="container"> 171<nav> 172<ul> 173<li class="logo"> 174<span> 175<a target="_self" style="display: flex; align-items: center; gap: 0.5rem; text-decoration: none;" href="https://raku.org"> 176<img title="Hi, my name is Camelia. I'm the spokesbug for the Raku Programming Language. Raku has been developed by a team of dedicated and enthusiastic open source volunteers, and continues to be developed. You can help too. The only requirement is that you know how to be nice to all kinds of people (and butterflies)." src="/img/camelia-logo.png" width="60px" /> 177<p style="margin:0">Raku®</p> 178</a></span></li></ul> 179<ul hx-swap="outerHTML" class="nav-links" hx-target="#content"> 180<li> 181<a href="/community">community</a></li> 182<li> 183<a href="/learn">learn</a></li> 184<li> 185<a href="/tools">tools</a></li> 186<li> 187<a href="https://docs.raku.org" target="_blank" rel="noopener noreferrer">docs</a></li> 188<li> 189<a href="https://raku.land" target="_blank" rel="noopener noreferrer">modules</a></li> 190<li> 191<a rel="noopener noreferrer" href="https://github.com/rakudo/rakudo" target="_blank">source</a></li> 192<li> 193<a href="/install">install</a></li> 194<li> 195 <a style="font-variant-emoji: text" id ="sunIcon">☀</a> 196 <a style="font-variant-emoji: text" id ="moonIcon">☾</a> 197 </li> 198</ul> 199<button id="hamburger" class="hamburger">☰</button> 200<ul hx-target="#content" id="menu" hx-swap="outerHTML" class="menu"> 201<li> 202<a href="/community">community</a></li> 203<li> 204<a href="/learn">learn</a></li> 205<li> 206<a href="/tools">tools</a></li> 207<li> 208<a href="https://docs.raku.org" target="_blank" rel="noopener noreferrer">docs</a></li> 209<li> 210<a target="_blank" href="https://raku.land" rel="noopener noreferrer">modules</a></li> 211<li> 212<a rel="noopener noreferrer" target="_blank" href="https://github.com/rakudo/rakudo">source</a></li> 213<li> 214<a href="/install">install</a></li> 215</ul> 216</nav></header> 217<main class="container"> 218<div> 219<style>#background { 220 background: url('/img/Butterfly_bottom_PSF_transparent.gif'); 221 top: 140px; 222 left: 0vw; 223 width: 100vw; 224 height: 360px; 225 background-size: auto; 226 opacity: 0.1; 227 filter: grayscale(100%); 228 transform: rotate(-9deg); 229 position: fixed; 230 background-repeat: no-repeat; 231 background-position: center top; 232 z-index: -1; 233 pointer-events: none; 234 padding: 20px; 235} 236</style> 237 238<div id="background"></div> 239</div> 240<div align="center"> 241<h1>Raku is an expressive, multi‑paradigm, Open Source language that works the way you think!</h1> 242<div style="min-height:1em;"></div> 243<div> 244<a target="_self" href="/install"> 245<button>
245Install</button></a> 246<div style="min-height:0.4em;"></div> 247<p>Linux, macOS, Windows, Docker</p> 248</div> 249<div style="min-height:1em;"></div> 250</div> 251<div> 252<div class="tabs"> 253<nav class="tab-menu"> 254<ul class="tab-links"> 255<li class="active"> 256<a hx-get="/buttabs/1/multi-paradigm" data-value="1" hx-target="#buttabs-1-content">multi-paradigm</a></li> 257<li class=""> 258<a data-value="2" hx-get="/buttabs/1/strict-gradual" hx-target="#buttabs-1-content">strict-gradual</a></li> 259<li class=""> 260<a data-value="3" hx-target="#buttabs-1-content" hx-get="/buttabs/1/interactive-mode">interactive-mode</a></li> 261<li class=""> 262<a data-value="4" hx-get="/buttabs/1/command-line" hx-target="#buttabs-1-content">command-line</a></li> 263<li class=""> 264<a data-value="5" hx-get="/buttabs/1/thriving-ecosystem" hx-target="#buttabs-1-content">thriving-ecosystem</a></li> 265<li class=""> 266<a hx-get="/buttabs/1/one-liners" hx-target="#buttabs-1-content" data-value="6">one-liners</a></li> 267</ul></nav> 268<div id="buttabs-1-content"> 269<div align="left" class="tab"><style> 270 #grid-1 { 271 display: grid; 272 grid-template-columns: 2.2fr 3.2fr; 273 grid-template-rows: repeat(1, 1fr); 274 gap: 1.5em; 275 direction: rtl; 276 277 } 278 279 @media (max-width: 1024px) { 280 #grid-1 { 281 display: flex; 282 flex-direction: column-reverse; 283 gap: 0.1em; 284 } 285 } 286</style> 287 288<div id="grid-1"> 289<article style="direction:ltr;"> 290<h3>Multi Paradigm</h3> 291<p>Smoothly combine coding styles:</p> 292<ul> 293<li>Object-Oriented: 294<code>class Circle</code> encapsulates data and behavior. 295</li> 296<li>Functional: built-ins like 297<code>.map</code> and operators like 298<code>».</code> and 299<code>[+]</code> . 300</li> 301<li>Declarative: 302<code>...</code> infers sequences, such as the powers of two. 303</li> 304<li>Procedural: the overall code flow is straightforward.</li> 305</ul> 306<p style="font-size:small; text-align:right"> 307<em>...natural syntax & semantics</em></p> 308</article> 309<article style="direction:ltr;"> 310 <div class="raku-code"> 311 <button class="copy-code" title="copy code">â¿»</button> 312 313 <div><pre class="nohighlights"> 314<span class="rainbow-keyword">class</span> Circle {<br> <span class="rainbow-keyword">has</span> <span class="rainbow-name_scalar">$.radius</span>;<br> <span class="rainbow-keyword">method</span> area { Ï <span class="rainbow-operator">*</span> <span class="rainbow-name_scalar">$.radius</span>² }<br>}<br><br><span class="rainbow-keyword">my</span> <span class="rainbow-name_array">@radii</span> <span class="rainbow-operator">=</span> 1,2,4...256;<br><br><span class="rainbow-keyword">my</span> <span class="rainbow-name_array">@circles</span> <span class="rainbow-operator">=</span> <span class="rainbow-routine">map</span> { Circle.<span class="rainbow-routine">new</span>(<span class="rainbow-operator">:</span>$^radius) }<span class="rainbow-operator">,</span> <span class="rainbow-name_array">@radii</span>;<br><br><span class="rainbow-keyword">my</span> <span class="rainbow-name_scalar">$total-area</span> <span class="rainbow-operator">=</span> [<span class="rainbow-operator">+</span>] <span class="rainbow-name_array">@circles</span>».area;<br><br><br><span class="rainbow-routine">say</span> <span class="rainbow-string_delimiter">"</span><span class="rainbow-string">Total area: </span><span class="rainbow-name_scalar">$total-area</span><span class="rainbow-string_delimiter">"</span>; 315</pre> 316</div> 317 </div> 318 </article> 319</div></div></div> 320</div> 321<div class="tabs"> 322<nav class="tab-menu"> 323<ul class="tab-links"> 324<li class="active"> 325<a hx-target="#buttabs-2-content" hx-get="/buttabs/2/grammars" data-value="1">grammars</a></li> 326<li class=""> 327<a hx-get="/buttabs/2/concurrency" hx-target="#buttabs-2-content" data-value="2">concurrency</a></li> 328<li class=""> 329<a hx-target="#buttabs-2-content" data-value="3" hx-get="/buttabs/2/lazy-evaluation">lazy-evaluation</a></li> 330<li class=""> 331<a hx-get="/buttabs/2/role-composition" data-value="4" hx-target="#buttabs-2-content">role-composition</a></li> 332<li class=""> 333<a hx-get="/buttabs/2/mixins" hx-target="#buttabs-2-content" data-value="5">mixins</a></li> 334<li class=""> 335<a hx-get="/buttabs/2/multi-dispatch" data-value="6" hx-target="#buttabs-2-content">multi-dispatch</a></li> 336<li class=""> 337<a data-value="7" hx-get="/buttabs/2/signatures" hx-target="#buttabs-2-content">signatures</a></li> 338<li class=""> 339<a hx-get="/buttabs/2/io" data-value="8" hx-target="#buttabs-2-content">io</a></li> 340</ul></nav> 341<div id="buttabs-2-content"> 342<div class="tab" align="left"><style> 343 #grid-7 { 344 display: grid; 345 grid-template-columns: 2.2fr 3.2fr; 346 grid-template-rows: repeat(1, 1fr); 347 gap: 1.5em; 348 direction: ltr; 349 350 } 351 352 @media (max-width: 1024px) { 353 #grid-7 { 354 display: flex; 355 flex-direction: column-reverse; 356 gap: 0.1em; 357 } 358 } 359</style> 360 361<div id="grid-7"> 362<article style="direction:ltr;"> 363<h3>Grammars</h3> 364<p>Definable grammars for pattern matching and generalized string processing.</p> 365<p style="font-size:small; text-align:right"> 366<em>...domain specific languages</em></p> 367</article> 368<article style="direction:ltr;"> 369 <div class="raku-code"> 370 <button class="copy-code" title="copy code">â¿»</button> 371 372 <div><pre class="nohighlights"> 373<span class="rainbow-keyword">grammar</span> Parser {<br> <span class="rainbow-keyword">rule</span> TOP <span class="rainbow-regex_delimiter">{</span><span class="rainbow-regex_special"> </span><span class="rainbow-regex_literal">I</span><span class="rainbow-regex_special"> <love> <lang> </span><span class="rainbow-regex_delimiter">}</span><br> <span class="rainbow-keyword">token</span> love <span class="rainbow-regex_delimiter">{</span><span class="rainbow-regex_special"> '</span><span class="rainbow-regex_literal">â¥</span><span class="rainbow-regex_special">' | </span><span class="rainbow-regex_literal">love</span><span class="rainbow-regex_special"> </span><span class="rainbow-regex_delimiter">}</span><br> <span class="rainbow-keyword">token</span> lang <span class="rainbow-regex_delimiter">{</span><span class="rainbow-regex_special"> < </span><span class="rainbow-regex_literal">Raku</span><span class="rainbow-regex_special"> </span><span class="rainbow-regex_literal">Rust</span><span class="rainbow-regex_special"> </span><span class="rainbow-regex_literal">Go</span><span class="rainbow-regex_special"> </span><span class="rainbow-regex_literal">Python</span><span class="rainbow-regex_special"> </span><span class="rainbow-regex_literal">Ruby</span><span class="rainbow-regex_special"> </span><span class="rainbow-regex_literal">TypeScript</span><span class="rainbow-regex_special"> </span><span class="rainbow-regex_literal">PHP</span><span class="rainbow-regex_special"> > </span><span class="rainbow-regex_delimiter">}</span><br>}<br><br><span class="rainbow-routine">say</span> Parser.parse: <span class="rainbow-string_delimiter">'</span><span class="rainbow-string">I ⥠Raku</span><span class="rainbow-string_delimiter">'</span>;<br><span class="rainbow-comment"># OUTPUT: ï½¢I ⥠Rakuï½£ love => ï½¢â¥ï½£ lang => ï½¢Rakuï½£<br></span><br><span class="rainbow-routine">say</span> Parser.parse: <span class="rainbow-string_delimiter">'</span><span class="rainbow-string">I love Python</span><span class="rainbow-string_delimiter">'</span>;<br><span class="rainbow-comment"># OUTPUT: ï½¢I love Pythonï½£ love => ï½¢loveï½£ lang => ï½¢Pythonï½£</span> 374</pre> 375</div> 376 </div> 377 </article> 378</div></div></div> 379</div> 380<div class="tabs"> 381<nav class="tab-menu"> 382<ul class="tab-links"> 383<li class="active"> 384<a hx-target="#buttabs-3-content" data-value="1" hx-get="/buttabs/3/unicode-regexes">unicode-regexes</a></li> 385<li class=""> 386<a hx-get="/buttabs/3/hyper-operators" data-value="2" hx-target="#buttabs-3-content">hyper-operators</a></li> 387<li class=""> 388<a hx-get="/buttabs/3/feed-operators" data-value="3" hx-target="#buttabs-3-content">feed-operators</a></li> 389<li class=""> 390<a hx-get="/buttabs/3/rational-numerics" hx-target="#buttabs-3-content" data-value="4">rational-numerics</a></li> 391<li class=""> 392<a data-value="5" hx-get="/buttabs/3/sets-junctions" hx-target="#buttabs-3-content">sets-junctions</a></li> 393<li class=""> 394<a hx-get="/buttabs/3/smartmatching" hx-target="#buttabs-3-content" data-value="6">smartmatching</a></li> 395</ul></nav> 396<div id="buttabs-3-content"> 397<div align="left" class="tab"><style> 398 #grid-15 { 399 display: grid; 400 grid-template-columns: 2.2fr 3.2fr; 401 grid-template-rows: repeat(1, 1fr); 402 gap: 1.5em; 403 direction: rtl; 404 405 } 406 407 @media (max-width: 1024px) { 408 #grid-15 { 409 display: flex; 410 flex-direction: column-reverse; 411 gap: 0.1em; 412 } 413 } 414</style> 415 416<div id="grid-15"> 417<article style="direction:ltr;"> 418<h3>Unicode Regexes</h3> 419<p>The most powerful Unicode-aware regular expression engine available, especially for complex text processing.</p> 420<p>It shines in tasks where precision and multilingual support are essential such as Grapheme and Diacritic handling.</p> 421<p style="font-size:small; text-align:right"> 422<em>...unicode centric text handling</em></p> 423</article> 424<article style="direction:ltr;"> 425 <div class="raku-code"> 426 <button class="copy-code" title="copy code">â¿»</button> 427 428 <div><pre class="nohighlights"> 429<span class="rainbow-routine">say</span> <span class="rainbow-string_delimiter">"</span><span class="rainbow-string">Coolð</span><span class="rainbow-string_delimiter">"</span> <span class="rainbow-operator">~~</span> <span class="rainbow-regex_delimiter">/</span><span class="rainbow-regex_special"><:Letter>* <:Block("Emoticons")>/; </span><span class="rainbow-comment"># ï½¢Coolðï½£<br></span><span class="rainbow-regex_literal">say</span><span class="rainbow-regex_special"> "</span><span class="rainbow-regex_literal">CzeÅÄ</span><span class="rainbow-regex_special">" ~~ </span><span class="rainbow-regex_literal">m</span><span class="rainbow-regex_special">:</span><span class="rainbow-regex_literal">ignoremark</span><span class="rainbow-regex_delimiter">/</span> Czesc <span class="rainbow-operator">/</span>; <span class="rainbow-comment"># ï½¢CzeÅÄï½£<br></span><span class="rainbow-routine">say</span> <span class="rainbow-string_delimiter">"</span><span class="rainbow-string">WEIáºE</span><span class="rainbow-string_delimiter">"</span> <span class="rainbow-operator">~~</span> <span class="rainbow-regex_delimiter">m:ignorecase/</span><span class="rainbow-regex_special"> </span><span class="rainbow-regex_literal">weisse</span><span class="rainbow-regex_special"> </span><span class="rainbow-regex_delimiter">/</span>; <span class="rainbow-comment"># ï½¢WEIáºEï½£<br></span><span class="rainbow-routine">say</span> <span class="rainbow-string_delimiter">"</span><span class="rainbow-string">หà¸à¸¹à¹à¸®à¸¡à¸ªà¹à¸à¸à¸£à¹</span><span class="rainbow-string_delimiter">"</span> <span class="rainbow-operator">~~</span> <span class="rainbow-regex_delimiter">/</span><span class="rainbow-regex_special"><:Letter>+/; </span><span class="rainbow-comment"># 「หà¸à¸¹à¹à¸®à¸¡à¸ªà¹à¸à¸à¸£à¹ï½£</span><span class="rainbow-regex_delimiter"></span> 430</pre> 431</div> 432 </div> 433 </article> 434</div></div></div> 435</div> 436</div> 437<div class="tabs"> 438<nav class="tab-menu"> 439<ul class="tab-links"> 440<li class="active"> 441<a hx-target="#buttabs-4-content" hx-get="/buttabs/4/L10N" data-value="1">L10N</a></li> 442<li class=""> 443<a hx-get="/buttabs/4/LLM" data-value="2" hx-target="#buttabs-4-content">LLM</a></li> 444<li class=""> 445<a data-value="3" hx-get="/buttabs/4/CPAN" hx-target="#buttabs-4-content">CPAN</a></li> 446<li class=""> 447<a hx-get="/buttabs/4/FFI" hx-target="#buttabs-4-content" data-value="4">FFI</a></li> 448<li class=""> 449<a hx-target="#buttabs-4-content" data-value="5" hx-get="/buttabs/4/Web">Web</a></li> 450<li class=""> 451<a data-value="6" hx-target="#buttabs-4-content" hx-get="/buttabs/4/ORM">ORM</a></li> 452</ul></nav> 453<div id="buttabs-4-content"> 454<div align="left" class="tab"><style> 455 #grid-21 { 456 display: grid; 457 grid-template-columns: 2.2fr 3.2fr; 458 grid-template-rows: repeat(1, 1fr); 459 gap: 1.5em; 460 direction: ltr; 461 462 } 463 464 @media (max-width: 1024px) { 465 #grid-21 { 466 display: flex; 467 flex-direction: column-reverse; 468 gap: 0.1em; 469 } 470 } 471</style> 472 473<div id="grid-21"> 474<article style="direction:ltr;"> 475<h3>Localization & Internationalization</h3> 476<p>This snippet is written using Japanese identifiers and strings, showcasing localization (L10N) and internationalization (I18N) features.</p> 477<p>Localized Raku code can be automatically translated to any other localization.</p> 478<p style="font-size:small; text-align:right"> 479<em>...think global: act local</em></p> 480</article> 481<article style="direction:ltr;"> 482 <div class="raku-code"> 483 <button class="copy-code" title="copy code">â¿»</button> 484 485 <div><pre class="nohighlights"> 486ç§ã® <span class="rainbow-name_scalar">$æ°</span> <span class="rainbow-operator">=</span> ããã³ãã <span class="rainbow-string_delimiter">"</span><span class="rainbow-string">æ°ãæãã¦ãã ãã </span><span class="rainbow-string_delimiter">"</span>;<br>è¨ã <span class="rainbow-string_delimiter">"</span><span class="rainbow-string">æ°ã¯</span><span class="rainbow-escape">{</span><span class="rainbow-name_scalar">$æ°</span><span class="rainbow-escape">}</span><span class="rainbow-string">ã§ãã</span><span class="rainbow-string_delimiter">"</span>;<br><br>ããã <span class="rainbow-name_scalar">$æ°</span> <span class="rainbow-operator"><=</span> 10 {<br> è¨ã <span class="rainbow-string_delimiter">"</span><span class="rainbow-string">æ°ã¯10以ä¸ã§ã</span><span class="rainbow-string_delimiter">"</span>;<br>} ãã®ä» {<br> è¨ã <span class="rainbow-string_delimiter">"</span><span class="rainbow-string">æ°ã¯10以ä¸ã§ã</span><span class="rainbow-string_delimiter">"</span>;<br>} 487</pre> 488</div> 489 </div> 490 </article> 491</div></div></div> 492</div> 493<div> 494<p>Supported by:</p><style> 495 #grid-27 { 496 display: grid; 497 grid-template-columns: repeat(5, 1fr); 498 grid-template-rows: repeat(1, 1fr); 499 gap: 1em; 500 direction: ltr; 501 border-radius:12.75px; 502padding:10px;
503justify-items:center; 504background-color:white; 505align-items:center; 506 507 } 508 509 @media (max-width: 1024px) { 510 #grid-27 { 511 display: flex; 512 flex-direction: column; 513 gap: 1em; 514 } 515 } 516</style> 517 518<div id="grid-27"> 519<a href="https://www.dotcom-monitor.com/"> 520<img src="static/logos/adjusted/logo-dotcom-monitor.png" /></a> 521<a href="https://www.loadview-testing.com/"> 522<img src="static/logos/adjusted/LoadView-logo-alt.png" /></a> 523<a href="https://webhostingbuddy.com/"> 524<img src="static/logos/adjusted/web-hosting-buddy-logo.png" /></a> 525<a href="https://www.findmyelectric.com/"> 526<img src="static/logos/adjusted/findmyelectric-logo.png" /></a> 527<a href="https://www.synthauto.com/"> 528<img src="static/logos/adjusted/synthauto-logo.png" /></a> 529</div> 530<p style="font-size:small; text-align:right"> 531<em>if you would like to support Raku, please send a message to 532<a href="/cdn-cgi/l/email-protection#ed9e9d82839e829f84838aad9f8c8698c3829f8ad29e988f87888e99d0" New Sponsor""><span class="__cf_email__" data-cfemail="e99a9986879a869b80878ea99b88829cc7869b8e">[email protected]</span></a> 533</em></p> 534</div> 535<div> 536<p>Trusted by:</p><style> 537 #grid-28 { 538 display: grid; 539 grid-template-columns: repeat(6, 1fr); 540 grid-template-rows: repeat(1, 1fr); 541 gap: 1em; 542 direction: ltr; 543 padding:10px; 544background-color:white; 545align-items:center; 546justify-items:center; 547border-radius:12.75px; 548 549 } 550 551 @media (max-width: 1024px) { 552 #grid-28 { 553 display: flex; 554 flex-direction: column; 555 gap: 1em; 556 } 557 } 558</style> 559 560<div id="grid-28"> 561<a href=""> 562<img src="static/logos/adjusted/cns-logo.png" /></a> 563<a href="https://www.edument.se"> 564<img src="static/logos/adjusted/edument-logo.png" /></a> 565<a href="https://www.haltec.net"> 566<img src="static/logos/adjusted/haltec-logo.png" /></a> 567<a href="https://www.oetiker.ch/en_US"> 568<img src="static/logos/adjusted/oetiker_partner-logo.png" /></a> 569<a href="https://qbrc.swmed.edu"> 570<img src="static/logos/adjusted/qbrc-logo.jpg" /></a> 571<a href="https://virtual.blue"> 572<img src="static/logos/adjusted/virtual_blue-logo.png" /></a> 573</div> 574<p style="font-size:small; text-align:right"> 575<em>organisations that use Raku in a production setting</em></p> 576</div> 577<div align="center" style="min-width:400px;"> 578<div style="min-height:1em;"></div> 579<div> 580<a href="/install" target="_self"> 581<button>Install</button></a> 582<div style="min-height:0.4em;"></div> 583<p>Linux, macOS, Windows, Docker</p> 584</div> 585<div style="min-height:1em;"></div> 586</div> 587</main> 588<footer class="container"> 589<hr /> 590<p> 591 Hypered with <a href="https://htmx.org" target="_blank">htmx</a>. 592 Aloft on <a href="https://harcstack.org" target="_blank"><b>Åir</b></a>. 593 Constructed in <a href="https://cro.raku.org" target="_blank">cro</a>. 594 Written in <a href="https://raku.org" target="_blank">raku</a>. 595 & 596 Styled by <a href="https://picocss.com" target="_blank">picocss</a>. 597 </p> 598<p>Please report any issues with this site at <a href="https://github.com/Raku/raku.org" target="_blank">Raku/raku.org</a>.</p> 599<p>The Raku® Programming Language</p> 600</footer>
vendor: 109 bytes, lines 600-601
600 601<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
601<script> // Hilite-helper.js 602 603 function copyCode() { 604 // copy code block to clipboard adapted from solution at 605 // https://stackoverflow.com/questions/34191780/javascript-copy-string-to-clipboard-as-text-html 606 // if behaviour problems with different browsers add stylesheet code from that solution. 607 const copyButtons = Array.from(document.querySelectorAll('.copy-code')); 608 copyButtons.forEach( function( button ) { 609 // this works with / without label 610 var codeElement = button.nextElementSibling; 611 while (codeElement && codeElement.tagName !== 'DIV') { 612 codeElement = codeElement.nextElementSibling; 613 } 614 button.addEventListener( 'click', function(insideButton) { 615 var container = document.createElement('div'); 616 container.innerHTML = codeElement.innerHTML; 617 container.style.position = 'fixed'; 618 container.style.pointerEvents = 'none'; 619 container.style.opacity = 0; 620 document.body.appendChild(container); 621 window.getSelection().removeAllRanges(); 622 var range = document.createRange(); 623 range.selectNode(container); 624 window.getSelection().addRange(range); 625 document.execCommand("copy", false); 626 document.body.removeChild(container); 627 }); 628 }); 629 } 630 631 // DOM ready 632 document.addEventListener('DOMContentLoaded', function () { 633 // trigger the highlighter for non-Raku code 634 copyCode(); 635 hljs.highlightAll(); 636 }); 637 638 // HTMX updates 639 document.addEventListener('htmx:afterSwap', function () { 640 copyCode(); 641 hljs.highlightAll(); 642 }); 643</script>
643 644
645<script>function setupTabLinks() { 646 const links = document.querySelectorAll('.tab-links > *'); 647 const hiddenInput = document.getElementById('selectedOption'); 648 const display = document.getElementById('selectedDisplay'); 649 650 links.forEach(link => { 651 link.addEventListener('click', function (e) { 652 e.preventDefault(); 653 654 links.forEach(l => l.classList.remove('active')); 655 656 this.classList.add('active'); 657 658 const value = this.getAttribute('data-value'); 659 if (hiddenInput) hiddenInput.value = value; 660 if (display) display.textContent = `Selected: ${this.textContent}`; 661 }); 662 }); 663} 664 665// Run on initial load 666document.addEventListener('DOMContentLoaded', setupTabLinks); 667 668// Re-run after HTMX swaps in new content 669document.body.addEventListener('htmx:afterSwap', setupTabLinks); 670</script>
670 671
672<script>function setupTabLinks() { 673 const links = document.querySelectorAll('.tab-links > *'); 674 const hiddenInput = document.getElementById('selectedOption'); 675 const display = document.getElementById('selectedDisplay'); 676 677 links.forEach(link => { 678 link.addEventListener('click', function (e) { 679 e.preventDefault(); 680 681 links.forEach(l => l.classList.remove('active')); 682 683 this.classList.add('active'); 684 685 const value = this.getAttribute('data-value'); 686 if (hiddenInput) hiddenInput.value = value; 687 if (display) display.textContent = `Selected: ${this.textContent}`; 688 }); 689 }); 690} 691 692// Run on initial load 693document.addEventListener('DOMContentLoaded', setupTabLinks); 694 695// Re-run after HTMX swaps in new content 696document.body.addEventListener('htmx:afterSwap', setupTabLinks); 697</script>
697 698
699<script> 700 // Show/hide icons 701 function updateIcons(theme) { 702 if (theme === "dark") { 703 sunIcon.style.display = "none"; 704 moonIcon.style.display = "block"; 705 } else { 706 sunIcon.style.display = "block"; 707 moonIcon.style.display = "none"; 708 } 709 } 710 function setTheme(mode) { 711 const htmlElement = document.documentElement; 712 let newTheme = mode; 713 714 if (mode === "toggle") { 715 const currentTheme = htmlElement.getAttribute("data-theme") || "light"; 716 newTheme = currentTheme === "dark" ? "light" : "dark"; 717 } else if (mode === "system") { 718 newTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; 719 } 720 721 htmlElement.setAttribute("data-theme", newTheme); 722 localStorage.setItem("theme", newTheme); // Save theme to localStorage 723 updateIcons(newTheme); 724 } 725 726 // update icons on page load 727 document.addEventListener("DOMContentLoaded", () => { 728 const theme = document.documentElement.getAttribute("data-theme"); 729 updateIcons(theme); 730 }); 731 732 // Listen for system dark mode changes and update the theme dynamically 733 window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => { 734 setTheme("system"); // Follow system setting 735 }); 736 737 // Attach to icon click 738 const sunIcon = document.getElementById("sunIcon"); 739 const moonIcon = document.getElementById("moonIcon"); 740 741 document.getElementById("sunIcon").addEventListener("click", () => setTheme("dark")); 742 document.getElementById("moonIcon").addEventListener("click", () => setTheme("light")); 743 </script>
743 744
745<script>const hamburger = document.getElementById('hamburger'); 746const menu = document.getElementById('menu'); 747 748if (hamburger && menu) { 749 hamburger.addEventListener('click', () => { 750 menu.classList.toggle('show'); 751 }); 752 753 document.addEventListener('click', (e) => { 754 if (!menu.contains(e.target) && !hamburger.contains(e.target)) { 755 menu.classList.remove('show'); 756 } 757 }); 758} 759 760// Hide the menu when resizing the viewport to a wider width 761window.addEventListener('resize', () => { 762 if (menu && window.innerWidth > 768) { 763 menu.classList.remove('show'); 764 } 765}); 766</script>
766 767</body> 768</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.