[{"data":1,"prerenderedAt":827},["ShallowReactive",2],{"footer-settings":3,"post-shell:design-principles-for-enzo-a4f9af10cd03":22,"post-body:design-principles-for-enzo-a4f9af10cd03":64,"code-block:6a8e6cd2eb667:enzo:midnight":788,"code-block:6a8e6cd2eb66d:enzo:midnight":789,"code-block:6a8e6cd2eb6ae:enzo:midnight":790,"code-block:6a8e6cd2eb6b7:enzo:midnight":791,"code-block:6a8e6cd2eb6be:enzo:midnight":792,"code-block:6a8e6cd2eb6c0:enzo:midnight":793,"code-block:6a8e6cd2eb6d0:enzo:midnight":794,"code-block:6a8e6cd2eb6d2:enzo:midnight":795,"code-block:6a8e6cd2eb6da:enzo:midnight":796,"code-block:6a8e6cd2eb6dc:enzo:midnight":797,"code-block:6a8e6cd2eb6e1:enzo:midnight":798,"code-block:6a8e6cd2eb6e4:enzo:midnight":799,"code-block:6a8e6cd2eb6e7:enzo:midnight":800,"code-block:6a8e6cd2eb6e9:enzo:midnight":801,"code-block:6a8e6cd2eb6f0:enzo:midnight":802,"code-block:6a8e6cd2eb6f3:enzo:midnight":803,"code-block:6a8e6cd2eb70c:enzo:midnight":804,"code-block:6a8e6cd2eb711:enzo:midnight":805,"code-block:6a8e6cd2eb714:enzo:midnight":806,"code-block:6a8e6cd2eb716:enzo:midnight":807,"code-block:6a8e6cd2eb718:enzo:midnight":808,"code-block:6a8e6cd2eb726:enzo:midnight":809,"code-block:6a8e6cd2eb729:enzo:midnight":810,"code-block:6a8e6cd2eb74a:enzo:midnight":811,"code-block:6a8e6cd2eb751:enzo:midnight":812,"code-block:6a8e6cd2eb66b:javascript:midnight":813,"code-block:6a8e6cd2eb6b5:javascript:midnight":814,"code-block:6a8e6cd2eb6c9:javascript:midnight":815,"code-block:6a8e6cd2eb6cd:javascript:midnight":816,"code-block:6a8e6cd2eb6d4:javascript:midnight":817,"code-block:6a8e6cd2eb6df:javascript:midnight":818,"code-block:6a8e6cd2eb6f7:javascript:midnight":819,"code-block:6a8e6cd2eb709:javascript:midnight":820,"code-block:6a8e6cd2eb6ce:python:midnight":821,"code-block:6a8e6cd2eb73b:java:midnight":822,"code-block:6a8e6cd2eb73e:java:midnight":823,"code-block:6a8e6cd2eb74e:java:midnight":824,"code-block:6a8e6cd2eb745:rust:midnight":825,"code-block:6a8e6cd2eb70a:fsharp:midnight":826},{"heading":4,"body":5,"links":6,"note":21},"Bottom line, still up front.","A small footer for global links, contact paths, and project context.",[7,10,13,16,19],{"label":8,"url":9},"About","http:\u002F\u002Fmy-website.localhost\u002Fabout#now",{"label":11,"url":12},"Case Studies","http:\u002F\u002Fmy-website.localhost\u002F#selected-work",{"label":14,"url":15},"Side Projects","http:\u002F\u002Fmy-website.localhost\u002Fside-projects",{"label":17,"url":18},"Writing","http:\u002F\u002Fmy-website.localhost\u002Fwriting",{"label":20,"url":9},"Now","",{"id":23,"slug":24,"date":25,"author":26,"title":29,"excerpt":30,"canonicalUrl":31,"featuredImage":32,"authorName":28,"featuredMedia":33,"blocks":63},"cG9zdDo2MzI=","design-principles-for-enzo-a4f9af10cd03","October 17, 2025",{"node":27},{"name":28},"Aslan French","Design Principles for Enzo","In my last post, I introduced Enzo, a programming language I designed and implemented as both a learning tool and a piece of creative expression. It’s an art project, not a commercial product, a sketch of my personal&#8230;","https:\u002F\u002Fmedium.com\u002Fdesign-bootcamp\u002Fdesign-principles-for-enzo-a4f9af10cd03",{"node":33},{"id":34,"sourceUrl":35,"srcSet":36,"sizes":37,"altText":21,"mediaDetails":38},"cG9zdDo4NDQ=","https:\u002F\u002Fwww.aslanfrench.work\u002Fmedia\u002F2025\u002F10\u002Fenzo.jpg","https:\u002F\u002Fwww.aslanfrench.work\u002Fmedia\u002F2025\u002F10\u002Fenzo-300x285.jpg 300w, https:\u002F\u002Fwww.aslanfrench.work\u002Fmedia\u002F2025\u002F10\u002Fenzo-768x730.jpg 768w, https:\u002F\u002Fwww.aslanfrench.work\u002Fmedia\u002F2025\u002F10\u002Fenzo.jpg 1000w","(max-width: 300px) 100vw, 300px",{"width":39,"height":40,"sizes":41},1000,951,[42,50,56],{"name":43,"sourceUrl":44,"width":45,"height":46,"mimeType":47,"file":48,"fileSize":49},"medium","https:\u002F\u002Fwww.aslanfrench.work\u002Fmedia\u002F2025\u002F10\u002Fenzo-300x285.jpg","300","285","image\u002Fjpeg","enzo-300x285.jpg",27005,{"name":51,"sourceUrl":52,"width":53,"height":53,"mimeType":47,"file":54,"fileSize":55},"thumbnail","https:\u002F\u002Fwww.aslanfrench.work\u002Fmedia\u002F2025\u002F10\u002Fenzo-150x150.jpg","150","enzo-150x150.jpg",16154,{"name":57,"sourceUrl":58,"width":59,"height":60,"mimeType":47,"file":61,"fileSize":62},"medium_large","https:\u002F\u002Fwww.aslanfrench.work\u002Fmedia\u002F2025\u002F10\u002Fenzo-768x730.jpg","768","730","enzo-768x730.jpg",77132,[],[65,71,75,80,85,90,94,98,102,106,110,114,118,122,126,130,134,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,427,431,435,439,443,447,451,455,459,463,467,471,475,479,483,487,491,495,499,503,507,511,515,519,523,527,531,535,539,543,547,551,555,559,563,567,571,575,579,583,587,591,595,599,603,607,611,615,619,623,627,631,635,639,643,647,651,655,659,663,667,671,675,679,683,687,691,695,699,703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,771,775,779,783],{"name":66,"clientId":67,"parentClientId":68,"renderedHtml":69,"attributes":70},"core\u002Fparagraph","6a8e6cd2eb647",null,"\n\u003Cp class=\"wp-block-paragraph\">In \u003Ca href=\"\u002Fwriting\u002Fa-ux-designer-designs-a-programming-language-ff7c7cf44dd4\" data-type=\"post\" data-id=\"629\">my last post\u003C\u002Fa>, I introduced Enzo, a programming language I designed and implemented as both a learning tool and a piece of creative expression. It’s an art project, not a commercial product, a sketch of my personal perspective on what code could feel like. Its design wasn’t guided by formal UX research, but by a set of personal heuristics and intuition.\u003C\u002Fp>\n",{},{"name":66,"clientId":72,"parentClientId":68,"renderedHtml":73,"attributes":74},"6a8e6cd2eb657","\n\u003Cp class=\"wp-block-paragraph\">This article explains the principles behind Enzo’s syntax and contrasts them with mainstream languages. It’s written for a technical audience but aims to stay accessible. If you want reference material, skim the \u003Ca href=\"https:\u002F\u002Fhackmd.io\u002F@jcklpe\u002FSkqPDU8xw\">syntax spec README\u003C\u002Fa> or the \u003Ca href=\"https:\u002F\u002Fcolab.research.google.com\u002Fgithub\u002Fjcklpe\u002Fenzo-lang\u002Fblob\u002Fmaster\u002Finterpreter\u002Fdemo.ipynb\">short interactive Colab\u003C\u002Fa>. Neither is required, the focus here is the \u003Cem>why\u003C\u002Fem>: the design decisions, the heuristics behind them, and how they compare to mainstream languages.\u003C\u002Fp>\n",{},{"name":76,"clientId":77,"parentClientId":68,"renderedHtml":78,"attributes":79},"core\u002Fheading","6a8e6cd2eb658","\n\u003Ch2 class=\"wp-block-heading\">Design principles\u002Fheuristics\u003C\u002Fh2>\n",{},{"name":81,"clientId":82,"parentClientId":68,"renderedHtml":83,"attributes":84},"core\u002Flist","6a8e6cd2eb659","\n\u003Col class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Personal Intuition as the Primary Driver:\u003C\u002Fstrong> Enzo is an art project. I didn’t run user studies or benchmarks; I followed what felt clear, interesting, and readable to me. Its design reflects my personal taste and curiosity.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Favor Non-Programmer Intuition:\u003C\u002Fstrong> When a choice exists between a computer science convention and a pattern a layperson would find natural, prefer the latter. Would grandma understand it?\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Prioritize the Human Interface over Machine Performance:\u003C\u002Fstrong> When forced to choose, I favor making the language predictable, safe, and simple for the \u003Cem>human\u003C\u002Fem> over maximizing computational efficiency. Enzo is biased toward clarity and ease of understanding (as understood by principles 1 and 2), even if it means doing extra work under the&nbsp;hood.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Reinforce Generalizable Patterns:\u003C\u002Fstrong> Unify disparate language concepts under a single, recurring pattern to reduce the surface area of the language to learn, and reinforce a cohesive mental model through repetition and parallel structure.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>No Overloading (of Symbols or Concepts):\u003C\u002Fstrong> A symbol, keyword, or syntactic structure should have one conceptual job, rather than giving multiple meanings to the same symbol (which many languages do out of historical accident or for brevity).\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Explicit Over Implicit:\u003C\u002Fstrong> The programmer’s intent should be clearly stated in the code; avoid “magic” or invisible behavior. This is supported by the famous “Knowledge in the World versus in the Head” heuristic articulated by Don Norman in “The Design of Everyday&nbsp;Things”.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Favor Composition Over Inheritance:\u003C\u002Fstrong> Build from small pieces that snap together (like LEGO bricks) instead of deep hierarchies. This harkens back to the \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FUnix_philosophy\">Unix philosophy\u003C\u002Fa>.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Decouple Syntax from Formatting:\u003C\u002Fstrong> People are going to have differences in taste in terms of presentation, so the parser shouldn’t depend on strict whitespace or formatting style; be strict where needed, loose everywhere else.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Syntactic Clarity over Annotation:\u003C\u002Fstrong> Let structure carry meaning so the language can infer, not litter code with boilerplate.\u003C\u002Fli>\n\u003C\u002Fol>\n",{},{"name":86,"clientId":87,"parentClientId":82,"renderedHtml":88,"attributes":89},"core\u002Flist-item","6a8e6cd2eb65a","\n\u003Cli>\u003Cstrong>Personal Intuition as the Primary Driver:\u003C\u002Fstrong> Enzo is an art project. I didn’t run user studies or benchmarks; I followed what felt clear, interesting, and readable to me. Its design reflects my personal taste and curiosity.\u003C\u002Fli>\n",{},{"name":86,"clientId":91,"parentClientId":82,"renderedHtml":92,"attributes":93},"6a8e6cd2eb65b","\n\u003Cli>\u003Cstrong>Favor Non-Programmer Intuition:\u003C\u002Fstrong> When a choice exists between a computer science convention and a pattern a layperson would find natural, prefer the latter. Would grandma understand it?\u003C\u002Fli>\n",{},{"name":86,"clientId":95,"parentClientId":82,"renderedHtml":96,"attributes":97},"6a8e6cd2eb65c","\n\u003Cli>\u003Cstrong>Prioritize the Human Interface over Machine Performance:\u003C\u002Fstrong> When forced to choose, I favor making the language predictable, safe, and simple for the \u003Cem>human\u003C\u002Fem> over maximizing computational efficiency. Enzo is biased toward clarity and ease of understanding (as understood by principles 1 and 2), even if it means doing extra work under the&nbsp;hood.\u003C\u002Fli>\n",{},{"name":86,"clientId":99,"parentClientId":82,"renderedHtml":100,"attributes":101},"6a8e6cd2eb65d","\n\u003Cli>\u003Cstrong>Reinforce Generalizable Patterns:\u003C\u002Fstrong> Unify disparate language concepts under a single, recurring pattern to reduce the surface area of the language to learn, and reinforce a cohesive mental model through repetition and parallel structure.\u003C\u002Fli>\n",{},{"name":86,"clientId":103,"parentClientId":82,"renderedHtml":104,"attributes":105},"6a8e6cd2eb65e","\n\u003Cli>\u003Cstrong>No Overloading (of Symbols or Concepts):\u003C\u002Fstrong> A symbol, keyword, or syntactic structure should have one conceptual job, rather than giving multiple meanings to the same symbol (which many languages do out of historical accident or for brevity).\u003C\u002Fli>\n",{},{"name":86,"clientId":107,"parentClientId":82,"renderedHtml":108,"attributes":109},"6a8e6cd2eb65f","\n\u003Cli>\u003Cstrong>Explicit Over Implicit:\u003C\u002Fstrong> The programmer’s intent should be clearly stated in the code; avoid “magic” or invisible behavior. This is supported by the famous “Knowledge in the World versus in the Head” heuristic articulated by Don Norman in “The Design of Everyday&nbsp;Things”.\u003C\u002Fli>\n",{},{"name":86,"clientId":111,"parentClientId":82,"renderedHtml":112,"attributes":113},"6a8e6cd2eb660","\n\u003Cli>\u003Cstrong>Favor Composition Over Inheritance:\u003C\u002Fstrong> Build from small pieces that snap together (like LEGO bricks) instead of deep hierarchies. This harkens back to the \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FUnix_philosophy\">Unix philosophy\u003C\u002Fa>.\u003C\u002Fli>\n",{},{"name":86,"clientId":115,"parentClientId":82,"renderedHtml":116,"attributes":117},"6a8e6cd2eb661","\n\u003Cli>\u003Cstrong>Decouple Syntax from Formatting:\u003C\u002Fstrong> People are going to have differences in taste in terms of presentation, so the parser shouldn’t depend on strict whitespace or formatting style; be strict where needed, loose everywhere else.\u003C\u002Fli>\n",{},{"name":86,"clientId":119,"parentClientId":82,"renderedHtml":120,"attributes":121},"6a8e6cd2eb662","\n\u003Cli>\u003Cstrong>Syntactic Clarity over Annotation:\u003C\u002Fstrong> Let structure carry meaning so the language can infer, not litter code with boilerplate.\u003C\u002Fli>\n",{},{"name":66,"clientId":123,"parentClientId":68,"renderedHtml":124,"attributes":125},"6a8e6cd2eb664","\n\u003Cp class=\"wp-block-paragraph\">With these principles in mind, let’s build the language up from its most basic components.\u003C\u002Fp>\n",{},{"name":76,"clientId":127,"parentClientId":68,"renderedHtml":128,"attributes":129},"6a8e6cd2eb665","\n\u003Ch2 class=\"wp-block-heading\">Names and&nbsp;Values\u003C\u002Fh2>\n",{},{"name":66,"clientId":131,"parentClientId":68,"renderedHtml":132,"attributes":133},"6a8e6cd2eb666","\n\u003Cp class=\"wp-block-paragraph\">Enzo is built around a simple, repeating rhythm. This is the most important pattern in the whole language: you have little chunks of data-values, which I call \u003Cstrong>“atoms”\u003C\u002Fstrong> (like a number or a piece of text) and you can bind them to \u003Cstrong>keynames\u003C\u002Fstrong>. The unit of an atom bound to a keyname is a variable.\u003C\u002Fp>\n",{},{"name":135,"clientId":136,"parentClientId":68,"renderedHtml":137,"attributes":138},"core\u002Fcode","6a8e6cd2eb667","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>\u002F\u002F A Number atom is bound to a keyname\n$the-answer: 42;\n\n\u002F\u002F A Text atom is bound to a keyname\n$greeting: \"hello, world\";\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":140,"parentClientId":68,"renderedHtml":141,"attributes":142},"6a8e6cd2eb668","\n\u003Cp class=\"wp-block-paragraph\">You’ll notice two things right away. First, all variable keynames start with a \u003Ccode>$\u003C\u002Fcode> sigil. This is a personal, aesthetic choice for clarity, driven by the \u003Cstrong>Explicit Over Implicit #6\u003C\u002Fstrong> heuristic. When I scan code, the \u003Ccode>$\u003C\u002Fcode> is a visual flag that says, \"this is a piece of data.\" I understand some people consider this noisy, but PHP\u002FWordpress cooked my&nbsp;brain.\u003C\u002Fp>\n",{},{"name":66,"clientId":144,"parentClientId":68,"renderedHtml":145,"attributes":146},"6a8e6cd2eb669","\n\u003Cp class=\"wp-block-paragraph\">Second, and more importantly, is the colon&nbsp;\u003Ccode>:\u003C\u002Fcode>. In many languages, you'd see an equals sign \u003Ccode>=\u003C\u002Fcode>, but that symbol is often overloaded. In Enzo, the colon has only one job: to declare a name and bind a value to it. This is a direct application of the \u003Cstrong>No Overloading #5\u003C\u002Fstrong> principle.\u003C\u002Fp>\n",{},{"name":66,"clientId":148,"parentClientId":68,"renderedHtml":149,"attributes":150},"6a8e6cd2eb66a","\n\u003Cp class=\"wp-block-paragraph\">This commitment to a uniform pattern becomes clearer when we look at more complex data. In JavaScript, the syntax for creating a variable is different from the syntax for creating a property inside an&nbsp;object:\u003C\u002Fp>\n",{},{"name":135,"clientId":152,"parentClientId":68,"renderedHtml":153,"attributes":154},"6a8e6cd2eb66b","\n\u003Cpre class=\"wp-block-code language-javascript\">\u003Ccode>\u002F\u002F JavaScript: different syntax for similar ideas\nvar name = \"Sam\";               \u002F\u002F uses '='​\nvar person = {  name: \"Todd\" }; \u002F\u002F uses ':'\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":156,"parentClientId":68,"renderedHtml":157,"attributes":158},"6a8e6cd2eb66c","\n\u003Cp class=\"wp-block-paragraph\">This always seemed weird to me. In both cases, you are binding a name to a value. They’re both keyname-value pairs. You’re taking a value and assigning it to name. Shouldn’t they be the same? There are historical reasons for this distinction, and there are underlying differences in implementation, but in Enzo, the exact same syntax is used in both cases, because in Enzo they are the same conceptually, which \u003Cstrong>Reinforces a Generalizable Pattern&nbsp;#4\u003C\u002Fstrong>.\u003C\u002Fp>\n",{},{"name":135,"clientId":160,"parentClientId":68,"renderedHtml":161,"attributes":162},"6a8e6cd2eb66d","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>\u002F\u002F Enzo: one consistent pattern\n$name: \"Sam\";\n\n$person: &#91;\n  $name: \"Todd\",\n  $age: 50\n];\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":164,"parentClientId":68,"renderedHtml":165,"attributes":166},"6a8e6cd2eb66e","\n\u003Cp class=\"wp-block-paragraph\">In this Enzo snippet, \u003Ccode>$person\u003C\u002Fcode> is a list (enclosed in \u003Ccode>[...]\u003C\u002Fcode>) containing two name-value pairs. We didn’t have to switch to a different syntax inside the brackets. This consistency reinforces a cohesive mental model: a \u003Cem>binding is a binding\u003C\u002Fem>, whether it’s at the top level or nested inside a structure.\u003C\u002Fp>\n",{},{"name":66,"clientId":168,"parentClientId":68,"renderedHtml":169,"attributes":170},"6a8e6cd2eb66f","\n\u003Cp class=\"wp-block-paragraph\">This syntactic uniformity also makes the language more \u003Cstrong>Composable #7\u003C\u002Fstrong>. By erasing the distinction between “object property” and “variable” it creates a consistent nestable syntactic unit. Enzo is heavily inspired by LISP’s homoiconicity. It’s not technically homoiconic because it lacks a true one-to-one relationship with the AST, and there are additional control flow structures that glue these atoms together, but there is that same focus on consistent nestable composability.\u003C\u002Fp>\n",{},{"name":76,"clientId":172,"parentClientId":68,"renderedHtml":173,"attributes":174},"6a8e6cd2eb670","\n\u003Ch2 class=\"wp-block-heading\">Lists: One Structure to Rule Them&nbsp;All\u003C\u002Fh2>\n",{},{"name":66,"clientId":176,"parentClientId":68,"renderedHtml":177,"attributes":178},"6a8e6cd2eb671","\n\u003Cp class=\"wp-block-paragraph\">Once we have named values, the next logical step is to structure them. In Enzo, there is only one way to do this: the List, previewed above.\u003C\u002Fp>\n",{},{"name":135,"clientId":180,"parentClientId":68,"renderedHtml":181,"attributes":182},"6a8e6cd2eb6ae","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>\u002F\u002F A List is a collection of values in square brackets\n$my-list: &#91;\n  10,                     \u002F\u002FA simple Number value\n  \"a piece of text\",      \u002F\u002F a simple Text value\n  $age: 30                \u002F\u002F a named Number value inside the list\n];\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":184,"parentClientId":68,"renderedHtml":185,"attributes":186},"6a8e6cd2eb6b0","\n\u003Cp class=\"wp-block-paragraph\">Many languages make you choose upfront: is this an \u003Cem>array\u003C\u002Fem> (a numbered list) or a \u003Cem>map\u003C\u002Fem> (a named collection)?\u003C\u002Fp>\n",{},{"name":66,"clientId":188,"parentClientId":68,"renderedHtml":189,"attributes":190},"6a8e6cd2eb6b1","\n\u003Cp class=\"wp-block-paragraph\">Inspired by the language Lua’s Table, Enzo's List is both simultaneously.\u003C\u002Fp>\n",{},{"name":66,"clientId":192,"parentClientId":68,"renderedHtml":193,"attributes":194},"6a8e6cd2eb6b2","\n\u003Cp class=\"wp-block-paragraph\">In most languages, the split exists for performance reasons. Arrays are fast for number-based access because they store elements as contiguous memory blocks. Maps (or objects) are optimized for name-based lookups via hashing. Even Lua, conceptually unified at the surface, separates these structures under the&nbsp;hood.\u003C\u002Fp>\n",{},{"name":66,"clientId":196,"parentClientId":68,"renderedHtml":197,"attributes":198},"6a8e6cd2eb6b3","\n\u003Cp class=\"wp-block-paragraph\">Enzo does not. Every element,  named or unnamed,  lives in the same structure. That means named values also have numerical indexes (unlike Lua). Following \u003Cstrong>Prioritize the Human Interface over Machine Performance #3\u003C\u002Fstrong>, I’d rather have one simple tool for the user than two optimized ones for the computer.\u003C\u002Fp>\n",{},{"name":66,"clientId":200,"parentClientId":68,"renderedHtml":201,"attributes":202},"6a8e6cd2eb6b4","\n\u003Cp class=\"wp-block-paragraph\">The pattern for \u003Cem>accessing\u003C\u002Fem> elements is also unified. In most languages, the syntax&nbsp;splits:\u003C\u002Fp>\n",{},{"name":135,"clientId":204,"parentClientId":68,"renderedHtml":205,"attributes":206},"6a8e6cd2eb6b5","\n\u003Cpre class=\"wp-block-code language-javascript\">\u003Ccode>array&#91;0];           \u002F\u002F this accesses the 1st slot of an array by an index \nnumberobject.color; \u002F\u002F this accesses the field named \"color\"\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":208,"parentClientId":68,"renderedHtml":209,"attributes":210},"6a8e6cd2eb6b6","\n\u003Cp class=\"wp-block-paragraph\">but in Enzo there is a unified dot notation&nbsp;access:\u003C\u002Fp>\n",{},{"name":135,"clientId":212,"parentClientId":68,"renderedHtml":213,"attributes":214},"6a8e6cd2eb6b7","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$my-list.1;      \u002F\u002F returns 10\n$my-list.age;    \u002F\u002F returns 30\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":216,"parentClientId":68,"renderedHtml":217,"attributes":218},"6a8e6cd2eb6b8","\n\u003Cp class=\"wp-block-paragraph\">By using one structure and one access pattern, Enzo \u003Cstrong>Reinforces a Generalizable Pattern&nbsp;#4\u003C\u002Fstrong>.\u003C\u002Fp>\n",{},{"name":66,"clientId":220,"parentClientId":68,"renderedHtml":221,"attributes":222},"6a8e6cd2eb6b9","\n\u003Cp class=\"wp-block-paragraph\">And yes, in the spirit of \u003Cstrong>Favoring Non-Programmer Intuition #2\u003C\u002Fstrong>, we start counting at 1. Most programming languages use 0-based indexing because it maps directly to how computer memory is addressed (the first item is at an offset of 0). But humans don’t count from zero. “The first item” is item number&nbsp;one.\u003C\u002Fp>\n",{},{"name":66,"clientId":224,"parentClientId":68,"renderedHtml":225,"attributes":226},"6a8e6cd2eb6ba","\n\u003Cp class=\"wp-block-paragraph\">For those wondering: How do you access a dynamically computed indices or properties? Enzo uses \u003Cstrong>Function atoms\u003C\u002Fstrong>, the unified value type for any evaluable expression.\u003C\u002Fp>\n",{},{"name":76,"clientId":228,"parentClientId":68,"renderedHtml":229,"attributes":230},"6a8e6cd2eb6bb","\n\u003Ch2 class=\"wp-block-heading\">Functions are also&nbsp;values\u003C\u002Fh2>\n",{},{"name":66,"clientId":232,"parentClientId":68,"renderedHtml":233,"attributes":234},"6a8e6cd2eb6bc","\n\u003Cp class=\"wp-block-paragraph\">Inspired by LISP’s philosophy of “code as data”, one of Enzo’s core ideas is that a block of code is just another kind of&nbsp;value.\u003C\u002Fp>\n",{},{"name":66,"clientId":236,"parentClientId":68,"renderedHtml":237,"attributes":238},"6a8e6cd2eb6bd","\n\u003Cp class=\"wp-block-paragraph\">What if a block of code was just another type of value, like a Number or a List? In Enzo, it is. The parentheses \u003Ccode>()\u003C\u002Fcode> delimit Function atoms, little self-contained sets of operations on data, as&nbsp;data:\u003C\u002Fp>\n",{},{"name":135,"clientId":240,"parentClientId":68,"renderedHtml":241,"attributes":242},"6a8e6cd2eb6be","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>\u002F\u002F This isn't just a calculation, it's a value that REPRESENTS the action of adding 2 and 2.\n(2 + 2)\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":244,"parentClientId":68,"renderedHtml":245,"attributes":246},"6a8e6cd2eb6bf","\n\u003Cp class=\"wp-block-paragraph\">Because code blocks are values, we can name them using the same keyname: atom pattern from Part 1. Technically all functions in Enzo are anonymous. Some just get bound to keynames.\u003C\u002Fp>\n",{},{"name":135,"clientId":248,"parentClientId":68,"renderedHtml":249,"attributes":250},"6a8e6cd2eb6c0","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>\u002F\u002F This follows the exact same pattern as `$greeting: \"hello\"`\nadd-two: (\n    param $number: 0;\n    return($number + 2);\n);\n\n\u002F\u002F Note: Function keynames can omit the `$` sigil for readability purposes. But you can also invoke using the `$` even if you didn't declare it that way. So `$add-two()`, and `add-two()` are both valid. Even `$add-two` is valid, allowing the Function to recede into the background as just another value.\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":252,"parentClientId":68,"renderedHtml":253,"attributes":254},"6a8e6cd2eb6c1","\n\u003Cp class=\"wp-block-paragraph\">In Enzo, the entire definition, including the parameter declarations inside, \u003Cem>is the value\u003C\u002Fem>. Everything is wrapped up in one little parenthetical “sushi bite.” This deep consistency has several powerful consequences:\u003C\u002Fp>\n",{},{"name":81,"clientId":256,"parentClientId":68,"renderedHtml":257,"attributes":258},"6a8e6cd2eb6c2","\n\u003Col class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>It Replaces {}:\u003C\u002Fstrong> It’s used everywhere a code block is needed, including in control flow structures, ensuring consistent scoping rules, an example of \u003Cstrong>Reinforcing a Generalizable Pattern&nbsp;#4\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>It Replaces Grouping Parentheses:\u003C\u002Fstrong> In \u003Ccode>(2 + 2) * 10\u003C\u002Fcode>, the \u003Ccode>(2 + 2)\u003C\u002Fcode> part is not a special “grouping” syntax as in most languages; it’s a code block that gets evaluated, and its result is then used in the multiplication, another example of \u003Cstrong>Reinforcing a Generalizable Pattern&nbsp;#4\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>It Enables Inferred Static Typing:\u003C\u002Fstrong> Because every core data type has an unambiguous delimiter (\u003Ccode>“”\u003C\u002Fcode>, \u003Ccode>[]\u003C\u002Fcode>, \u003Ccode>()\u003C\u002Fcode>), Enzo can infer static types, leveraging \u003Cstrong>Syntactic Clarity over Annotation #9\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>It Allows for Default Arguments to Parameters:\u003C\u002Fstrong> Because parameters are moved inside the function body, you can declare function parameters with default values. This lets functions behave more like regular data; if no parameters are needed, no parentheses are required.\u003C\u002Fli>\n\u003C\u002Fol>\n",{},{"name":86,"clientId":260,"parentClientId":256,"renderedHtml":261,"attributes":262},"6a8e6cd2eb6c3","\n\u003Cli>\u003Cstrong>It Replaces {}:\u003C\u002Fstrong> It’s used everywhere a code block is needed, including in control flow structures, ensuring consistent scoping rules, an example of \u003Cstrong>Reinforcing a Generalizable Pattern&nbsp;#4\u003C\u002Fstrong>.\u003C\u002Fli>\n",{},{"name":86,"clientId":264,"parentClientId":256,"renderedHtml":265,"attributes":266},"6a8e6cd2eb6c4","\n\u003Cli>\u003Cstrong>It Replaces Grouping Parentheses:\u003C\u002Fstrong> In \u003Ccode>(2 + 2) * 10\u003C\u002Fcode>, the \u003Ccode>(2 + 2)\u003C\u002Fcode> part is not a special “grouping” syntax as in most languages; it’s a code block that gets evaluated, and its result is then used in the multiplication, another example of \u003Cstrong>Reinforcing a Generalizable Pattern&nbsp;#4\u003C\u002Fstrong>.\u003C\u002Fli>\n",{},{"name":86,"clientId":268,"parentClientId":256,"renderedHtml":269,"attributes":270},"6a8e6cd2eb6c5","\n\u003Cli>\u003Cstrong>It Enables Inferred Static Typing:\u003C\u002Fstrong> Because every core data type has an unambiguous delimiter (\u003Ccode>“”\u003C\u002Fcode>, \u003Ccode>[]\u003C\u002Fcode>, \u003Ccode>()\u003C\u002Fcode>), Enzo can infer static types, leveraging \u003Cstrong>Syntactic Clarity over Annotation #9\u003C\u002Fstrong>.\u003C\u002Fli>\n",{},{"name":86,"clientId":272,"parentClientId":256,"renderedHtml":273,"attributes":274},"6a8e6cd2eb6c6","\n\u003Cli>\u003Cstrong>It Allows for Default Arguments to Parameters:\u003C\u002Fstrong> Because parameters are moved inside the function body, you can declare function parameters with default values. This lets functions behave more like regular data; if no parameters are needed, no parentheses are required.\u003C\u002Fli>\n",{},{"name":66,"clientId":276,"parentClientId":68,"renderedHtml":277,"attributes":278},"6a8e6cd2eb6c7","\n\u003Cp class=\"wp-block-paragraph\">For the computed access of lists mentioned above? Enzo handles computed access by requiring the expression in parentheses. For example, \u003Ccode>$my-list.($i + 1)\u003C\u002Fcode> would evaluate the expression \u003Ccode>$i + 1\u003C\u002Fcode> and use that as the index. This again leverages the idea that parentheses in Enzo always represent an evaluable code block, here used to compute an&nbsp;index.\u003C\u002Fp>\n",{},{"name":66,"clientId":280,"parentClientId":68,"renderedHtml":281,"attributes":282},"6a8e6cd2eb6c8","\n\u003Cp class=\"wp-block-paragraph\">This is a stark contrast to JavaScript, which has at least six different ways to declare a function, and where the name, parameters, and body are often separate syntactic parts:\u003C\u002Fp>\n",{},{"name":135,"clientId":284,"parentClientId":68,"renderedHtml":285,"attributes":286},"6a8e6cd2eb6c9","\n\u003Cpre class=\"wp-block-code language-javascript\">\u003Ccode>\u002F\u002F JavaScript: traditional function syntax\nfunction addTwo(number) {  return number + 2;}\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":288,"parentClientId":68,"renderedHtml":289,"attributes":290},"6a8e6cd2eb6ca","\n\u003Cp class=\"wp-block-paragraph\">In JavaScript, the function’s name (\u003Ccode>addTwo\u003C\u002Fcode>), its parameters (\u003Ccode>number\u003C\u002Fcode>), and its body \u003Ccode>{ return number + 2; }\u003C\u002Fcode> are three different parts of the syntax. They’re separated, and the function is not an expression, unless you use one of the alternative syntaxes like function expression or arrow function. In Enzo, there is just one powerful flexible way, which mirrors the structure of other keyname-atom pairs.\u003C\u002Fp>\n",{},{"name":76,"clientId":292,"parentClientId":68,"renderedHtml":293,"attributes":294},"6a8e6cd2eb6cb","\n\u003Ch2 class=\"wp-block-heading\">Mutation and References\u003C\u002Fh2>\n",{},{"name":66,"clientId":296,"parentClientId":68,"renderedHtml":297,"attributes":298},"6a8e6cd2eb6cc","\n\u003Cp class=\"wp-block-paragraph\">Enzo is very deliberate about how data is changed. In many languages, assigning a value to a variable and later changing that variable use the same operator (typically \u003Ccode>=\u003C\u002Fcode>).\u003C\u002Fp>\n",{},{"name":135,"clientId":300,"parentClientId":68,"renderedHtml":301,"attributes":302},"6a8e6cd2eb6cd","\n\u003Cpre class=\"wp-block-code language-javascript\">\u003Ccode>let score = 10;    \u002F\u002F initial declaration\nscore = 15;        \u002F\u002F reassignment (same operator '=')\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":135,"clientId":304,"parentClientId":68,"renderedHtml":305,"attributes":306},"6a8e6cd2eb6ce","\n\u003Cpre class=\"wp-block-code language-python\">\u003Ccode>count = 1\ncount = count + 1  # (uses '=' for update as well)\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":308,"parentClientId":68,"renderedHtml":309,"attributes":310},"6a8e6cd2eb6cf","\n\u003Cp class=\"wp-block-paragraph\">Enzo splits these into two distinct operations with different syntax, following \u003Cstrong>No Overloading (#5)\u003C\u002Fstrong> and \u003Cstrong>Explicit Over Implicit&nbsp;(#6):\u003C\u002Fstrong>\u003C\u002Fp>\n",{},{"name":135,"clientId":312,"parentClientId":68,"renderedHtml":313,"attributes":314},"6a8e6cd2eb6d0","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$score: 100;      \u002F\u002F Creation with ':'\n$score &lt;: 101;    \u002F\u002F Mutation is explicit and visually distinct\n102 :&gt; $score;    \u002F\u002F You can even bind in the other direction (inspired by R)\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":316,"parentClientId":68,"renderedHtml":317,"attributes":318},"6a8e6cd2eb6d1","\n\u003Cp class=\"wp-block-paragraph\">Another choice: all rebindings are passed \u003Cstrong>by value\u003C\u002Fstrong>, not \u003Cstrong>by reference\u003C\u002Fstrong>.\u003C\u002Fp>\n",{},{"name":135,"clientId":320,"parentClientId":68,"renderedHtml":321,"attributes":322},"6a8e6cd2eb6d2","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$original: &#91;1, 2, 3];\n$copy: $original;      \u002F\u002F this makes a copy of the list\n\n$copy.1 &lt;: 99;         \u002F\u002F change the first element of the copy\n$original.1;           \u002F\u002F still 1 -- $original is unchanged\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":324,"parentClientId":68,"renderedHtml":325,"attributes":326},"6a8e6cd2eb6d3","\n\u003Cp class=\"wp-block-paragraph\">Scripting languages like JavaScript or Python apply this default behavior inconsistently. For instance, JavaScript copies primitive values like numbers or strings, but does not copy objects\u002Farrays by&nbsp;value:\u003C\u002Fp>\n",{},{"name":135,"clientId":328,"parentClientId":68,"renderedHtml":329,"attributes":330},"6a8e6cd2eb6d4","\n\u003Cpre class=\"wp-block-code language-javascript\">\u003Ccode>let x = 5;\nlet y = x;\ny = 6;\nconsole.log(x);    \u002F\u002F 5 (primitives are copied by value)\n\n​let arr1 = &#91;10];\nlet arr2 = arr1;arr2&#91;0] = 99;\nconsole.log(arr1&#91;0]);              \u002F\u002F 99 (objects\u002Farrays assigned by reference)\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":332,"parentClientId":68,"renderedHtml":333,"attributes":334},"6a8e6cd2eb6d5","\n\u003Cp class=\"wp-block-paragraph\">Other languages do this for efficiency: copying large objects is memory-intensive. Enzo prefers predictability. Everything copies by value, \u003Cstrong>Prioritizing the Human Interface over Machine Performance #3\u003C\u002Fstrong>.\u003C\u002Fp>\n",{},{"name":66,"clientId":336,"parentClientId":68,"renderedHtml":337,"attributes":338},"6a8e6cd2eb6d6","\n\u003Cp class=\"wp-block-paragraph\">What if you do want to pass by reference?\u003C\u002Fp>\n",{},{"name":66,"clientId":340,"parentClientId":68,"renderedHtml":341,"attributes":342},"6a8e6cd2eb6d7","\n\u003Cp class=\"wp-block-paragraph\">Enter the \u003Ccode>@\u003C\u002Fcode> sigil, Enzo’s single, explicit token for \u003Cem>reference semantics\u003C\u002Fem>, following \u003Cstrong>Explicit Over Implicit #6\u003C\u002Fstrong>. It mirrors the \u003Ccode>$\u003C\u002Fcode> pattern, \u003Cstrong>Reinforcing a Generalizable Pattern&nbsp;#4\u003C\u002Fstrong>.\u003C\u002Fp>\n",{},{"name":66,"clientId":344,"parentClientId":68,"renderedHtml":345,"attributes":346},"6a8e6cd2eb6d8","\n\u003Cp class=\"wp-block-paragraph\">Not only the \u003Ccode>@\u003C\u002Fcode> generalizing the sigil pattern, the \u003Ccode>@\u003C\u002Fcode> is generalized across several&nbsp;domains:\u003C\u002Fp>\n",{},{"name":66,"clientId":348,"parentClientId":68,"renderedHtml":349,"attributes":350},"6a8e6cd2eb6d9","\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Referencing Variables:\u003C\u002Fstrong>\u003Ccode> $copy: $original;\u003C\u002Fcode> makes a copy, but \u003Ccode>$ref: @original;\u003C\u002Fcode> creates an alias. If you mutate through one, the other sees&nbsp;it.\u003C\u002Fp>\n",{},{"name":135,"clientId":352,"parentClientId":68,"renderedHtml":353,"attributes":354},"6a8e6cd2eb6da","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$original: &#91;10];\n$copy: $original;\n$ref: @original;\n\n$copy.1 &lt;: 99;\n$original.1;     \u002F\u002F still 10, because $copy was a separate copy\n\n$ref.1 &lt;: 99;\n$original.1;     \u002F\u002F now 99, because $ref was referencing $original\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":356,"parentClientId":68,"renderedHtml":357,"attributes":358},"6a8e6cd2eb6db","\n\u003Cp class=\"wp-block-paragraph\">​\u003Cstrong>Passing Variable Arguments by Reference:\u003C\u002Fstrong> By default, function arguments are passed by value (copies), which prevents accidental side-effects on the caller’s data. But if you want to modify something in-place, you can pass a reference using \u003Ccode>@\u003C\u002Fcode>. For&nbsp;example:\u003C\u002Fp>\n",{},{"name":135,"clientId":360,"parentClientId":68,"renderedHtml":361,"attributes":362},"6a8e6cd2eb6dc","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>increment: (\n    param $num: 0;\n    $num &lt;: $num + 1;\n);\n\n$val: 5;\nincrement(@val);\n\u002F\u002F After the call, $val is now 6, because the function modified it by reference.\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":364,"parentClientId":68,"renderedHtml":365,"attributes":366},"6a8e6cd2eb6dd","\n\u003Cp class=\"wp-block-paragraph\">In this example, increment would normally just update its local \u003Ccode>$num\u003C\u002Fcode>, and the change wouldn’t affect anything outside. But by calling increment(\u003Ccode>@val\u003C\u002Fcode>), we explicitly said \"no, use \u003Ccode>$val\u003C\u002Fcode> itself,\" so inside the function \u003Ccode>$num\u003C\u002Fcode> refers to the same storage as \u003Ccode>$val\u003C\u002Fcode>. Thus, \u003Ccode>$val\u003C\u002Fcode> gets&nbsp;updated.\u003C\u002Fp>\n",{},{"name":66,"clientId":368,"parentClientId":68,"renderedHtml":369,"attributes":370},"6a8e6cd2eb6de","\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Higher-Order Functions (Passing Functions as Values):\u003C\u002Fstrong> A \u003Cem>higher-order function\u003C\u002Fem> is any function that either takes another function as an argument or returns one as its result. This pattern is useful when you want to abstract behavior: instead of writing similar loops or transformations over and over, you can write one function that accepts another to decide \u003Cem>what to do\u003C\u002Fem> with each piece of&nbsp;data.\u003C\u002Fp>\n",{},{"name":135,"clientId":372,"parentClientId":68,"renderedHtml":373,"attributes":374},"6a8e6cd2eb6df","\n\u003Cpre class=\"wp-block-code language-javascript\">\u003Ccode>function double(x) { \n  return x * 2; \n}\nfunction applyTwice(func, value) {\n  return func(func(value));\n}\n​applyTwice(double, 5);  \u002F\u002F → 20\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":376,"parentClientId":68,"renderedHtml":377,"attributes":378},"6a8e6cd2eb6e0","\n\u003Cp class=\"wp-block-paragraph\">Enzo works the same way conceptually, but it makes the intent more explicit. To pass a function itself (rather than invoking it and passing that value as a copy), you prefix it with \u003Ccode>@\u003C\u002Fcode>, the same sigil used for all reference semantics:\u003C\u002Fp>\n",{},{"name":135,"clientId":380,"parentClientId":68,"renderedHtml":381,"attributes":382},"6a8e6cd2eb6e1","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>double: (param $x: 0; $x * 2);\n\napply-twice: (\n    param $func: ();    \u002F\u002F expects a function\n    param $value: 0;\n\n    return(func(func($value)));\n);\n\napply-twice(@double, 5);    \u002F\u002F -&gt; 20\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":384,"parentClientId":68,"renderedHtml":385,"attributes":386},"6a8e6cd2eb6e2","\n\u003Cp class=\"wp-block-paragraph\">Without the \u003Ccode>@\u003C\u002Fcode>, Enzo would try to \u003Cem>call\u003C\u002Fem> double before passing it, which isn’t what we want. Using the explicit general \u003Ccode>@\u003C\u002Fcode> also means functions can omit parentheses when no arguments are needed, letting them behave like any other value, a small example of \u003Cstrong>Decoupling Syntax from Formatting #9\u003C\u002Fstrong>.\u003C\u002Fp>\n",{},{"name":66,"clientId":388,"parentClientId":68,"renderedHtml":389,"attributes":390},"6a8e6cd2eb6e3","\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Loop Variables by Reference:\u003C\u002Fstrong> By default, Enzo loops give you copies, protecting the original data. To mutate in place, declare the loop variable with&nbsp;\u003Ccode>@\u003C\u002Fcode>:\u003C\u002Fp>\n",{},{"name":135,"clientId":392,"parentClientId":68,"renderedHtml":393,"attributes":394},"6a8e6cd2eb6e4","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$nums: &#91;1, 2, 3];\n\nLoop for @item in $nums, (\n    $item &lt;: $item * 10;\n);\n\n\u002F\u002F $nums is now &#91;10, 20, 30]\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":396,"parentClientId":68,"renderedHtml":397,"attributes":398},"6a8e6cd2eb6e5","\n\u003Cp class=\"wp-block-paragraph\">If we had written \u003Ccode>Loop for $item in $nums,&nbsp;...\u003C\u002Fcode> without the \u003Ccode>@\u003C\u002Fcode>, then \u003Ccode>$item\u003C\u002Fcode> would just be a copy and updating it wouldn’t affect the original&nbsp;list.\u003C\u002Fp>\n",{},{"name":66,"clientId":400,"parentClientId":68,"renderedHtml":401,"attributes":402},"6a8e6cd2eb6e6","\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Destructuring by Reference:\u003C\u002Fstrong> Normally, destructuring copies elements:\u003C\u002Fp>\n",{},{"name":135,"clientId":404,"parentClientId":68,"renderedHtml":405,"attributes":406},"6a8e6cd2eb6e7","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$nums: &#91;1, 2, 3];\n$a, $b, $c: $nums&#91;];\n$a &lt;: 99;\n\u002F\u002F $nums is still &#91;1, 2, 3]\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":408,"parentClientId":68,"renderedHtml":409,"attributes":410},"6a8e6cd2eb6e8","\n\u003Cp class=\"wp-block-paragraph\">Mark them with \u003Ccode>@\u003C\u002Fcode> to alias the originals:\u003C\u002Fp>\n",{},{"name":135,"clientId":412,"parentClientId":68,"renderedHtml":413,"attributes":414},"6a8e6cd2eb6e9","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$nums: &#91;1, 2, 3];\n$a, $b, $c: @nums&#91;];\n$a &lt;: 99;\n\u002F\u002F $nums is now &#91;99, 2, 3]\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":416,"parentClientId":68,"renderedHtml":417,"attributes":418},"6a8e6cd2eb6ea","\n\u003Cp class=\"wp-block-paragraph\">This makes element-level mutation explicit and safe. You can see the direction of data flow immediately, and keeps rebinding semantics uniform across variable assignment, loops, and unpacking.\u003C\u002Fp>\n",{},{"name":66,"clientId":420,"parentClientId":68,"renderedHtml":421,"attributes":422},"6a8e6cd2eb6eb","\n\u003Cp class=\"wp-block-paragraph\">Now that we understand how Enzo handles mutations and references explicitly, let’s look at how it directs the flow of execution.\u003C\u002Fp>\n",{},{"name":76,"clientId":424,"parentClientId":68,"renderedHtml":425,"attributes":426},"6a8e6cd2eb6ec","\n\u003Ch2 class=\"wp-block-heading\">Directing the&nbsp;Flow\u003C\u002Fh2>\n",{},{"name":66,"clientId":428,"parentClientId":68,"renderedHtml":429,"attributes":430},"6a8e6cd2eb6ed","\n\u003Cp class=\"wp-block-paragraph\">In Enzo, control flow structures like \u003Ccode>If\u003C\u002Fcode>\u002F\u003Ccode>Else\u003C\u002Fcode>, \u003Ccode>Loop\u003C\u002Fcode>, and the \u003Ccode>then\u003C\u002Fcode>\u002F\u003Ccode>$this\u003C\u002Fcode> pipeline operator are the glue that sticks the Function atoms together and directs their&nbsp;flow.\u003C\u002Fp>\n",{},{"name":76,"clientId":432,"parentClientId":68,"renderedHtml":433,"attributes":434},"6a8e6cd2eb6ee","\n\u003Ch2 class=\"wp-block-heading\">Conditional flow\u003C\u002Fh2>\n",{},{"name":66,"clientId":436,"parentClientId":68,"renderedHtml":437,"attributes":438},"6a8e6cd2eb6ef","\n\u003Cp class=\"wp-block-paragraph\">Controlling \u003Cem>which\u003C\u002Fem> blocks run is done with plain English\u003Csup data-fn=\"e2e7cc0c-5406-4f91-a20b-b98502542ba1\" class=\"fn\">\u003Ca href=\"#e2e7cc0c-5406-4f91-a20b-b98502542ba1\" id=\"e2e7cc0c-5406-4f91-a20b-b98502542ba1-link\">1\u003C\u002Fa>\u003C\u002Fsup> rather than abstract symbols, \u003Cstrong>Favoring Non-Programmer Intuition #2\u003C\u002Fstrong>. The Enzo \u003Ccode>If\u003C\u002Fcode> construct reads almost like an English sentence:\u003C\u002Fp>\n",{},{"name":135,"clientId":440,"parentClientId":68,"renderedHtml":441,"attributes":442},"6a8e6cd2eb6f0","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>If $score is greater than 90 and $user.isActive, (\n    \"Excellent!\";\n);\n\nElse if $score is greater than 75, (\n    \"Pretty good.\";\n);\n\nElse (\n    \"Keep trying.\";\n);\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":444,"parentClientId":68,"renderedHtml":445,"attributes":446},"6a8e6cd2eb6f1","\n\u003Cp class=\"wp-block-paragraph\">Notice that the conditional statement isn’t enclosed in parentheses, another case of \u003Cstrong>No Overloading #5\u003C\u002Fstrong>. Parentheses mean one thing, and one thing&nbsp;only.\u003C\u002Fp>\n",{},{"name":66,"clientId":448,"parentClientId":68,"renderedHtml":449,"attributes":450},"6a8e6cd2eb6f2","\n\u003Cp class=\"wp-block-paragraph\">Enzo’s multi-branch check (like a switch statement) reuses the same structure, avoiding a separate case&nbsp;syntax:\u003C\u002Fp>\n",{},{"name":135,"clientId":452,"parentClientId":68,"renderedHtml":453,"attributes":454},"6a8e6cd2eb6f3","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>If $fruit is \"apple\", (\n    \"Crunchy snack\";\n),\n\nor is \"orange\", (\n    \"Juicy citrus\";\n),\n\nor is \"banana\", (\n    \"Yellow goodness\";\n),\n\nOtherwise, (\n    \"Unknown fruit\";\n);\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":76,"clientId":456,"parentClientId":68,"renderedHtml":457,"attributes":458},"6a8e6cd2eb6f4","\n\u003Ch2 class=\"wp-block-heading\">Pipeline flow\u003C\u002Fh2>\n",{},{"name":66,"clientId":460,"parentClientId":68,"renderedHtml":461,"attributes":462},"6a8e6cd2eb6f6","\n\u003Cp class=\"wp-block-paragraph\">Many modern languages let you “chain” methods together to process data in sequence:\u003C\u002Fp>\n",{},{"name":135,"clientId":464,"parentClientId":68,"renderedHtml":465,"attributes":466},"6a8e6cd2eb6f7","\n\u003Cpre class=\"wp-block-code language-javascript\">\u003Ccode>userList.filter(isActive).sortBy(\"lastName\").select(&#91;\"id\", \"email\"]);\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":468,"parentClientId":68,"renderedHtml":469,"attributes":470},"6a8e6cd2eb6f8","\n\u003Cp class=\"wp-block-paragraph\">It’s concise, but the dot (\u003Ccode>.\u003C\u002Fcode>) pulls double duty: sometimes “access a property,” sometimes “chain a call,” sometimes both. The actual data flow is implicit, each step must return an object exposing the next&nbsp;method.\u003C\u002Fp>\n",{},{"name":66,"clientId":472,"parentClientId":68,"renderedHtml":473,"attributes":474},"6a8e6cd2eb6f9","\n\u003Cp class=\"wp-block-paragraph\">This implicit behavior hides the actual data flow: it looks like everything belongs to the same object, even when it doesn’t. It also requires the returned implicit objects have the necessary methods, which ties up things in a more complex and fragile hierarchy. That violates Enzo’s \u003Cstrong>No Overloading #5\u003C\u002Fstrong>, \u003Cstrong>Explicit Over Implicit #6\u003C\u002Fstrong>, and \u003Cstrong>Composition Over Inheritance #7\u003C\u002Fstrong> principles.\u003C\u002Fp>\n",{},{"name":66,"clientId":476,"parentClientId":68,"renderedHtml":477,"attributes":478},"6a8e6cd2eb6fa","\n\u003Cp class=\"wp-block-paragraph\">Other languages approach this problem differently. Functional languages and newer JavaScript proposals favor pipeline operators, which make the flow more composable:\u003C\u002Fp>\n",{},{"name":135,"clientId":480,"parentClientId":68,"renderedHtml":481,"attributes":482},"6a8e6cd2eb709","\n\u003Cpre class=\"wp-block-code language-javascript\">\u003Ccode>users  |&gt; filter(%, \"active\")  |&gt; sortBy(%, \"lastName\")  |&gt; select(%, &#91;\"id\", \"email\"]);\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":135,"clientId":484,"parentClientId":68,"renderedHtml":485,"attributes":486},"6a8e6cd2eb70a","\n\u003Cpre class=\"wp-block-code language-fsharp\">\u003Ccode>users|&gt; List.filter isActive|&gt; List.sortBy lastName|&gt; List.map selectColumns\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":488,"parentClientId":68,"renderedHtml":489,"attributes":490},"6a8e6cd2eb70b","\n\u003Cp class=\"wp-block-paragraph\">Enzo has its own approach which is even more explicit and \u003Cstrong>Favors Non-Programmer Intuition #2\u003C\u002Fstrong> with a plain English then and \u003Ccode>$this\u003C\u002Fcode>. Instead of implicitly passing a value as the first argument to the next function, you must use the special \u003Ccode>$this\u003C\u002Fcode> keyword to place it, which also gives greater flexibility with what can be done with that incoming piece of data&nbsp;:\u003C\u002Fp>\n",{},{"name":135,"clientId":492,"parentClientId":68,"renderedHtml":493,"attributes":494},"6a8e6cd2eb70c","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>\u002F\u002F It works with simple anon Function atoms\n\n100 then ($this + 1);                 \u002F\u002F returns 101\n10 then ($this + $this);              \u002F\u002F returns 20, this operation would be impossible with the implicit first argument pattern.\n\n1 then ($this + 1) then ($this * 3)   \u002F\u002F returns 6\n\n\n\u002F\u002F It also works with named Function atoms.\n$users\n    then filter($this, \"active\")\n    then sort-by($this, \"last-name\")\n    then select($this, &#91;\"id\", \"email\"]);\n\n\u002F\u002F Exactly equivalent to, but more readable than a set of nested functions:\nselect(sort-by(filter($users, \"active\"),\"lastName\"), &#91;\"id\", \"email\"]);\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":76,"clientId":496,"parentClientId":68,"renderedHtml":497,"attributes":498},"6a8e6cd2eb70d","\n\u003Ch2 class=\"wp-block-heading\">Looping flow\u003C\u002Fh2>\n",{},{"name":66,"clientId":500,"parentClientId":68,"renderedHtml":501,"attributes":502},"6a8e6cd2eb70e","\n\u003Cp class=\"wp-block-paragraph\">Loops in Enzo are another place where a unified approach replaces several traditional constructs. Many languages have a variety of loop keywords: \u003Ccode>for\u003C\u002Fcode>, \u003Ccode>while\u003C\u002Fcode>,\u003Ccode> do...while\u003C\u002Fcode>, \u003Ccode>foreach\u003C\u002Fcode>, etc., each with its own syntax. Enzo has just one: \u003Ccode>Loop\u003C\u002Fcode>. The behavior of the loop is controlled by the phrase that follows the word “Loop”. This keeps the number of loop constructs low and the syntax uniform, \u003Cstrong>Reinforcing Generalizable Patterns&nbsp;#4\u003C\u002Fstrong>.\u003C\u002Fp>\n",{},{"name":66,"clientId":504,"parentClientId":68,"renderedHtml":505,"attributes":506},"6a8e6cd2eb70f","\n\u003Cp class=\"wp-block-paragraph\">Here are the forms it can&nbsp;take:\u003C\u002Fp>\n",{},{"name":66,"clientId":508,"parentClientId":68,"renderedHtml":509,"attributes":510},"6a8e6cd2eb710","\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Simple Loop:\u003C\u002Fstrong> \u003Ccode>Loop, (...)\u003C\u002Fcode> repeats until told to&nbsp;stop:\u003C\u002Fp>\n",{},{"name":135,"clientId":512,"parentClientId":68,"renderedHtml":513,"attributes":514},"6a8e6cd2eb711","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$count: 0;\n\nLoop, (\n    $count &lt;: $count + 1;\n    If $count is greater than 5, (\n        end-loop;\n    );\n    \"Looping... iteration &lt;$count&gt;\";\n);\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":516,"parentClientId":68,"renderedHtml":517,"attributes":518},"6a8e6cd2eb712","\n\u003Cp class=\"wp-block-paragraph\">This will print “Looping…” messages and increment \u003Ccode>$count\u003C\u002Fcode> until \u003Ccode>$count\u003C\u002Fcode> becomes 6, then the \u003Ccode>If\u003C\u002Fcode> triggers an \u003Ccode>end-loop;\u003C\u002Fcode> which breaks out. Inside any loop,\u003Ccode> end-loop;\u003C\u002Fcode> acts like a “break” (exit the loop immediately) and \u003Ccode>restart-loop;\u003C\u002Fcode> acts like “continue” (jump to the next iteration early). I chose more descriptive keywords over the terse C-style \u003Ccode>break\u003C\u002Fcode>\u002F\u003Ccode>continue\u003C\u002Fcode>&nbsp;, which makes their intention clear at the cost of a few extra characters, and aligns with \u003Cstrong>Non-Programmer Intuition #2\u003C\u002Fstrong>.\u003C\u002Fp>\n",{},{"name":66,"clientId":520,"parentClientId":68,"renderedHtml":521,"attributes":522},"6a8e6cd2eb713","\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>While Loop:\u003C\u002Fstrong> \u003Ccode>Loop while &lt;condition&gt;, (...)\u003C\u002Fcode> This will check the condition before each iteration, and run the block only if the condition is true. For&nbsp;example:\u003C\u002Fp>\n",{},{"name":135,"clientId":524,"parentClientId":68,"renderedHtml":525,"attributes":526},"6a8e6cd2eb714","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$n: 1;\nLoop while $n is less than 3, (\n    \"n is &lt;$n&gt;\";\n    $n &lt;: $n + 1;\n);\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":528,"parentClientId":68,"renderedHtml":529,"attributes":530},"6a8e6cd2eb715","\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Until Loop:\u003C\u002Fstrong> \u003Ccode>Loop until &lt;condition&gt;, (...)\u003C\u002Fcode> is the opposite check, it loops \u003Cem>until\u003C\u002Fem> the condition becomes true (and then&nbsp;stops).\u003C\u002Fp>\n",{},{"name":135,"clientId":532,"parentClientId":68,"renderedHtml":533,"attributes":534},"6a8e6cd2eb716","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$x: 1;\nLoop until $x is 5, (\n    \"x is &lt;$x&gt;\";\n    $x &lt;: $x + 1;\n);\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":536,"parentClientId":68,"renderedHtml":537,"attributes":538},"6a8e6cd2eb717","\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>For-Each Loop:\u003C\u002Fstrong> \u003Ccode>Loop for $item in $collection, (...)\u003C\u002Fcode> will iterate over each element in a List.&nbsp;Example:\u003C\u002Fp>\n",{},{"name":135,"clientId":540,"parentClientId":68,"renderedHtml":541,"attributes":542},"6a8e6cd2eb718","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$nums: &#91;10, 20, 30];\nLoop for $x in $nums, (\n    \"Saw number &lt;$x&gt;\";\n    \u002F\u002F $x is a copy here, changes won't persist\n);\n\nLoop for @x in $nums, (\n    $x &lt;: $x * 2;\n);\n\n\u002F\u002F now $nums is &#91;20, 40, 60] because we doubled each in place\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":544,"parentClientId":68,"renderedHtml":545,"attributes":546},"6a8e6cd2eb719","\n\u003Cp class=\"wp-block-paragraph\">All these forms reuse the single Loop keyword. This keeps the number of loop constructs low and the syntax uniform. Contrast this to how other programming languages handle different kinds of loops: C and Java have while, \u003Ccode>do { } while\u003C\u002Fcode>, and the \u003Ccode>for(;;) loop\u003C\u002Fcode>, all with different syntax. Python has \u003Ccode>while\u003C\u002Fcode> and a \u003Ccode>for&nbsp;... in&nbsp;...\u003C\u002Fcode> but no direct equivalent of a C-style numeric for or an infinite loop (aside from \u003Ccode>while True\u003C\u002Fcode>). Rust has \u003Ccode>loop { }\u003C\u002Fcode> for infinite loops, plus \u003Ccode>while\u003C\u002Fcode> and a \u003Ccode>for&nbsp;... in&nbsp;...\u003C\u002Fcode>. Each of these introduces another keyword or form to&nbsp;learn.\u003C\u002Fp>\n",{},{"name":66,"clientId":548,"parentClientId":68,"renderedHtml":549,"attributes":550},"6a8e6cd2eb71a","\n\u003Cp class=\"wp-block-paragraph\">Additionally, the English-like phrasing of \u003Ccode>Loop while&nbsp;...\u003C\u002Fcode> or \u003Ccode>Loop for&nbsp;...\u003C\u002Fcode> is pretty approachable. Someone could probably guess what \u003Ccode>Loop until $done, (...)\u003C\u002Fcode> means without knowing much programming.\u003C\u002Fp>\n",{},{"name":76,"clientId":552,"parentClientId":68,"renderedHtml":553,"attributes":554},"6a8e6cd2eb71b","\n\u003Ch2 class=\"wp-block-heading\">Interpolating Data\u003C\u002Fh2>\n",{},{"name":66,"clientId":556,"parentClientId":68,"renderedHtml":557,"attributes":558},"6a8e6cd2eb71d","\n\u003Cp class=\"wp-block-paragraph\">You’ve seen \u003Ccode>&lt;…&gt;\u003C\u002Fcode> inside strings. That’s interpolation, one mechanism that replaces a pile of separate features in other languages.\u003C\u002Fp>\n",{},{"name":66,"clientId":560,"parentClientId":68,"renderedHtml":561,"attributes":562},"6a8e6cd2eb71e","\n\u003Cp class=\"wp-block-paragraph\">In other languages, you might have to learn and use different syntax for different kinds of combination or insertion:\u003C\u002Fp>\n",{},{"name":81,"clientId":564,"parentClientId":68,"renderedHtml":565,"attributes":566},"6a8e6cd2eb71f","\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>String concatenation:\u003C\u002Fstrong> e.g., in JavaScript you might do \u003Ccode>\"Hello, \" + name +&nbsp;\"!\"\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Merging two arrays:\u003C\u002Fstrong> e.g., JavaScript \u003Ccode>[...arr1,&nbsp;...arr2]\u003C\u002Fcode> spread syntax or \u003Ccode>arr1.concat(arr2)\u003C\u002Fcode>. Python uses the \u003Ccode>+\u003C\u002Fcode> operator (\u003Ccode>list1 + list2\u003C\u002Fcode>) or&nbsp;extend.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Appending or prepending an element to a list:\u003C\u002Fstrong> Most languages have special methods or syntax (like \u003Ccode>arr.push(item)\u003C\u002Fcode> or \u003Ccode>arr.unshift(item)\u003C\u002Fcode> in JS, \u003Ccode>list.append(item)\u003C\u002Fcode> in Python,&nbsp;etc.).\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Inserting a value into a string or an array at a specific point:\u003C\u002Fstrong> often requires either splitting or manual index operations.\u003C\u002Fli>\n\u003C\u002Ful>\n",{},{"name":86,"clientId":568,"parentClientId":564,"renderedHtml":569,"attributes":570},"6a8e6cd2eb720","\n\u003Cli>\u003Cstrong>String concatenation:\u003C\u002Fstrong> e.g., in JavaScript you might do \u003Ccode>\"Hello, \" + name +&nbsp;\"!\"\u003C\u002Fcode>.\u003C\u002Fli>\n",{},{"name":86,"clientId":572,"parentClientId":564,"renderedHtml":573,"attributes":574},"6a8e6cd2eb721","\n\u003Cli>\u003Cstrong>Merging two arrays:\u003C\u002Fstrong> e.g., JavaScript \u003Ccode>[...arr1,&nbsp;...arr2]\u003C\u002Fcode> spread syntax or \u003Ccode>arr1.concat(arr2)\u003C\u002Fcode>. Python uses the \u003Ccode>+\u003C\u002Fcode> operator (\u003Ccode>list1 + list2\u003C\u002Fcode>) or&nbsp;extend.\u003C\u002Fli>\n",{},{"name":86,"clientId":576,"parentClientId":564,"renderedHtml":577,"attributes":578},"6a8e6cd2eb722","\n\u003Cli>\u003Cstrong>Appending or prepending an element to a list:\u003C\u002Fstrong> Most languages have special methods or syntax (like \u003Ccode>arr.push(item)\u003C\u002Fcode> or \u003Ccode>arr.unshift(item)\u003C\u002Fcode> in JS, \u003Ccode>list.append(item)\u003C\u002Fcode> in Python,&nbsp;etc.).\u003C\u002Fli>\n",{},{"name":86,"clientId":580,"parentClientId":564,"renderedHtml":581,"attributes":582},"6a8e6cd2eb723","\n\u003Cli>\u003Cstrong>Inserting a value into a string or an array at a specific point:\u003C\u002Fstrong> often requires either splitting or manual index operations.\u003C\u002Fli>\n",{},{"name":66,"clientId":584,"parentClientId":68,"renderedHtml":585,"attributes":586},"6a8e6cd2eb724","\n\u003Cp class=\"wp-block-paragraph\">Enzo tries to cover a lot of this ground with one general mechanism, \u003Cstrong>Reinforcing Generalizable Patterns&nbsp;#4\u003C\u002Fstrong>.\u003C\u002Fp>\n",{},{"name":66,"clientId":588,"parentClientId":68,"renderedHtml":589,"attributes":590},"6a8e6cd2eb725","\n\u003Cp class=\"wp-block-paragraph\">Whenever you have text in Enzo, you can interpolate expressions inside \u003Ccode>&lt;\u003C\u002Fcode> and \u003Ccode>&gt;\u003C\u002Fcode>. For&nbsp;example:\u003C\u002Fp>\n",{},{"name":135,"clientId":592,"parentClientId":68,"renderedHtml":593,"attributes":594},"6a8e6cd2eb726","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$first-name: \"Ava\";\n$last-name: \"McCabe\";\n\"Hello, &lt;$first-name&gt; &lt;$last-name&gt;!\";   \u002F\u002F -&gt; \"Hello, Ava McCabe!\"\n\"Sum: &lt;2 + 3&gt;\";                         \u002F\u002F -&gt; \"Sum: 5\"\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":596,"parentClientId":68,"renderedHtml":597,"attributes":598},"6a8e6cd2eb727","\n\u003Cp class=\"wp-block-paragraph\">You can put any expression inside the brackets, not just a variable. This is akin to template strings in other languages, but with its own Enzo&nbsp;flavor.\u003C\u002Fp>\n",{},{"name":66,"clientId":600,"parentClientId":68,"renderedHtml":601,"attributes":602},"6a8e6cd2eb728","\n\u003Cp class=\"wp-block-paragraph\">You can also interpolate Lists which allows you to merge, append, and&nbsp;prepend:\u003C\u002Fp>\n",{},{"name":135,"clientId":604,"parentClientId":68,"renderedHtml":605,"attributes":606},"6a8e6cd2eb729","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>$list-1: &#91;1, 2];\n$list-2: &#91;3, 4];\n$list-3: &#91;&lt;$list-1&gt;, &lt;$list-2&gt;];    \u002F\u002F merged List of &#91;1, 2, 3, 4]\n$list-3 &lt;: &#91;0, &lt;$list-3&gt;];          \u002F\u002F prepended List of &#91;0, 1, 2, 3, 4]\n$list-3 &lt;: &#91;&lt;$list-3&gt;, 5];          \u002F\u002F appended List of &#91;0, 1, 2, 3, 4, 5]\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":608,"parentClientId":68,"renderedHtml":609,"attributes":610},"6a8e6cd2eb72a","\n\u003Cp class=\"wp-block-paragraph\">One simple pattern serves multiple needs, which reinforces the concepts while keeping the syntax&nbsp;simple.\u003C\u002Fp>\n",{},{"name":76,"clientId":612,"parentClientId":68,"renderedHtml":613,"attributes":614},"6a8e6cd2eb72b","\n\u003Ch2 class=\"wp-block-heading\">Custom Data Structures with Blueprints\u003C\u002Fh2>\n",{},{"name":66,"clientId":616,"parentClientId":68,"renderedHtml":617,"attributes":618},"6a8e6cd2eb72c","\n\u003Cp class=\"wp-block-paragraph\">The last major piece of Enzo’s syntax design to discuss is how you define your own custom data structures. Lists can represent almost anything in Enzo, but sometimes you want to define boundaries, “this kind of thing always looks like this,” and “these are the only valid forms it can&nbsp;take.”\u003C\u002Fp>\n",{},{"name":66,"clientId":620,"parentClientId":68,"renderedHtml":621,"attributes":622},"6a8e6cd2eb72d","\n\u003Cp class=\"wp-block-paragraph\">That’s the point of structured types, the foundation of what most programming languages call \u003Cem>object orientation\u003C\u002Fem>.\u003C\u002Fp>\n",{},{"name":66,"clientId":624,"parentClientId":68,"renderedHtml":625,"attributes":626},"6a8e6cd2eb72e","\n\u003Cp class=\"wp-block-paragraph\">Structured types are what let you describe repeatable shapes of data, patterns you can instantiate many times without rewriting the same fields and defaults. They give your program a \u003Cem>semantic grammar\u003C\u002Fem> for talking about the world it models. A \u003Ccode>Goblin\u003C\u002Fcode> or \u003Ccode>User\u003C\u002Fcode> or \u003Ccode>Invoice\u003C\u002Fcode> becomes more than just a loose bundle of keys and values; it becomes a \u003Cem>kind of thing\u003C\u002Fem> the language understands.\u003C\u002Fp>\n",{},{"name":66,"clientId":628,"parentClientId":68,"renderedHtml":629,"attributes":630},"6a8e6cd2eb72f","\n\u003Cp class=\"wp-block-paragraph\">At their core, structured types solve three practical problems:\u003C\u002Fp>\n",{},{"name":81,"clientId":632,"parentClientId":68,"renderedHtml":633,"attributes":634},"6a8e6cd2eb730","\n\u003Col class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Consistency and reuse:\u003C\u002Fstrong> You can create many instances of the same conceptual shape without duplicating field definitions or forgetting defaults.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Semantic clarity:\u003C\u002Fstrong> A type name like \u003Ccode>Invoice\u003C\u002Fcode> or \u003Ccode>User\u003C\u002Fcode> communicates intent far better than a raw data literal. The structure itself becomes self-documenting.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Constrained variation:\u003C\u002Fstrong> Real systems have categories and subtypes. You want to model, for example, that an \u003Ccode>Enemy\u003C\u002Fcode> might be a \u003Ccode>Goblin\u003C\u002Fcode> \u003Cem>or\u003C\u002Fem> an \u003Ccode>Orc\u003C\u002Fcode>, but not a mixture of both. Structured types let you define those distinctions formally.\u003C\u002Fli>\n\u003C\u002Fol>\n",{},{"name":86,"clientId":636,"parentClientId":632,"renderedHtml":637,"attributes":638},"6a8e6cd2eb731","\n\u003Cli>\u003Cstrong>Consistency and reuse:\u003C\u002Fstrong> You can create many instances of the same conceptual shape without duplicating field definitions or forgetting defaults.\u003C\u002Fli>\n",{},{"name":86,"clientId":640,"parentClientId":632,"renderedHtml":641,"attributes":642},"6a8e6cd2eb732","\n\u003Cli>\u003Cstrong>Semantic clarity:\u003C\u002Fstrong> A type name like \u003Ccode>Invoice\u003C\u002Fcode> or \u003Ccode>User\u003C\u002Fcode> communicates intent far better than a raw data literal. The structure itself becomes self-documenting.\u003C\u002Fli>\n",{},{"name":86,"clientId":644,"parentClientId":632,"renderedHtml":645,"attributes":646},"6a8e6cd2eb733","\n\u003Cli>\u003Cstrong>Constrained variation:\u003C\u002Fstrong> Real systems have categories and subtypes. You want to model, for example, that an \u003Ccode>Enemy\u003C\u002Fcode> might be a \u003Ccode>Goblin\u003C\u002Fcode> \u003Cem>or\u003C\u002Fem> an \u003Ccode>Orc\u003C\u002Fcode>, but not a mixture of both. Structured types let you define those distinctions formally.\u003C\u002Fli>\n",{},{"name":76,"clientId":648,"parentClientId":68,"renderedHtml":649,"attributes":650},"6a8e6cd2eb734","\n\u003Ch2 class=\"wp-block-heading\">Product and Sum&nbsp;types\u003C\u002Fh2>\n",{},{"name":66,"clientId":652,"parentClientId":68,"renderedHtml":653,"attributes":654},"6a8e6cd2eb735","\n\u003Cp class=\"wp-block-paragraph\">Most languages describe data using two basic patterns:\u003C\u002Fp>\n",{},{"name":81,"clientId":656,"parentClientId":68,"renderedHtml":657,"attributes":658},"6a8e6cd2eb736","\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Product types\u003C\u002Fstrong> combine information, an \u003Cem>and\u003C\u002Fem> relationship. For example, a \u003Ccode>Goblin\u003C\u002Fcode> might have both \u003Ccode>hp\u003C\u002Fcode> \u003Cstrong>and\u003C\u002Fstrong> \u003Ccode>status-effect\u003C\u002Fcode>. These are what object-oriented languages express as \u003Cem>classes\u003C\u002Fem> or&nbsp;\u003Cem>structs\u003C\u002Fem>.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Sum types\u003C\u002Fstrong> describe alternatives, an \u003Cem>or\u003C\u002Fem> relationship. An \u003Ccode>Status-Effect\u003C\u002Fcode> might be \u003Ccode>Normal\u003C\u002Fcode>, \u003Cstrong>or\u003C\u002Fstrong> \u003Ccode>Poisoned\u003C\u002Fcode>, \u003Cstrong>or\u003C\u002Fstrong> \u003Ccode>Bleeding\u003C\u002Fcode>. These are often called \u003Cem>enums\u003C\u002Fem>, \u003Cem>variants\u003C\u002Fem>, or \u003Cem>union types\u003C\u002Fem>, depending on the language.\u003C\u002Fli>\n\u003C\u002Ful>\n",{},{"name":86,"clientId":660,"parentClientId":656,"renderedHtml":661,"attributes":662},"6a8e6cd2eb737","\n\u003Cli>\u003Cstrong>Product types\u003C\u002Fstrong> combine information, an \u003Cem>and\u003C\u002Fem> relationship. For example, a \u003Ccode>Goblin\u003C\u002Fcode> might have both \u003Ccode>hp\u003C\u002Fcode> \u003Cstrong>and\u003C\u002Fstrong> \u003Ccode>status-effect\u003C\u002Fcode>. These are what object-oriented languages express as \u003Cem>classes\u003C\u002Fem> or&nbsp;\u003Cem>structs\u003C\u002Fem>.\u003C\u002Fli>\n",{},{"name":86,"clientId":664,"parentClientId":656,"renderedHtml":665,"attributes":666},"6a8e6cd2eb738","\n\u003Cli>\u003Cstrong>Sum types\u003C\u002Fstrong> describe alternatives, an \u003Cem>or\u003C\u002Fem> relationship. An \u003Ccode>Status-Effect\u003C\u002Fcode> might be \u003Ccode>Normal\u003C\u002Fcode>, \u003Cstrong>or\u003C\u002Fstrong> \u003Ccode>Poisoned\u003C\u002Fcode>, \u003Cstrong>or\u003C\u002Fstrong> \u003Ccode>Bleeding\u003C\u002Fcode>. These are often called \u003Cem>enums\u003C\u002Fem>, \u003Cem>variants\u003C\u002Fem>, or \u003Cem>union types\u003C\u002Fem>, depending on the language.\u003C\u002Fli>\n",{},{"name":66,"clientId":668,"parentClientId":68,"renderedHtml":669,"attributes":670},"6a8e6cd2eb739","\n\u003Cp class=\"wp-block-paragraph\">Object-oriented languages usually separate these patterns. A class handles the product side (fields combined together), and an enum handles the sum side (choices between options). You often have to glue the two together by&nbsp;hand.\u003C\u002Fp>\n",{},{"name":66,"clientId":672,"parentClientId":68,"renderedHtml":673,"attributes":674},"6a8e6cd2eb73a","\n\u003Cp class=\"wp-block-paragraph\">Languages like Java institutionalized this pattern through \u003Cem>classes\u003C\u002Fem> and \u003Cem>enums\u003C\u002Fem>. You’d write one construct for the structure and another for the variants, and then connect them manually:\u003C\u002Fp>\n",{},{"name":135,"clientId":676,"parentClientId":68,"renderedHtml":677,"attributes":678},"6a8e6cd2eb73b","\n\u003Cpre class=\"wp-block-code language-java\">\u003Ccode>public enum StatusEffect { NORMAL, POISONED, BLEEDING; }\n​\npublic class Goblin {\n  int hp = 100;\n  boolean hasDagger = true;\n  StatusEffect status = StatusEffect.NORMAL;\n}\n​\npublic class Orc {\n  int hp = 200;\n  int rage = 50;\n  StatusEffect status = StatusEffect.NORMAL;\n}\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":680,"parentClientId":68,"renderedHtml":681,"attributes":682},"6a8e6cd2eb73c","\n\u003Cp class=\"wp-block-paragraph\">That works pretty well but what if you want a “sum-of-products”, that is an enum where each item also carries its own structured data (product&nbsp;type)?\u003C\u002Fp>\n",{},{"name":66,"clientId":684,"parentClientId":68,"renderedHtml":685,"attributes":686},"6a8e6cd2eb73d","\n\u003Cp class=\"wp-block-paragraph\">In that case you have to declare both and then glue them together with switches and&nbsp;casts:\u003C\u002Fp>\n",{},{"name":135,"clientId":688,"parentClientId":68,"renderedHtml":689,"attributes":690},"6a8e6cd2eb73e","\n\u003Cpre class=\"wp-block-code language-java\">\u003Ccode>\u002F\u002F an enum to group the Goblin and Orc together\npublic enum EnemyType { GOBLIN, ORC; }\n​\n\u002F\u002F But the GOBLIN enum isn't connected to the Goblin class, so you have to do this:\npublic void printEnemyDetails(EnemyType type, Object data) {\n    switch (type) {\n        case GOBLIN:\n            Goblin goblin = (Goblin) data; \u002F\u002F unchecked cast\n            System.out.println(\"A Goblin with \" + goblin.hp + \" HP.\");\n            break;\n        case ORC:\n            Orc orc = (Orc) data;\n            System.out.println(\"An Orc with \" + orc.hp + \" HP and \" + orc.rage + \" rage.\");\n            break;\n    }\n}\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":692,"parentClientId":68,"renderedHtml":693,"attributes":694},"6a8e6cd2eb73f","\n\u003Cp class=\"wp-block-paragraph\">The pain points here are&nbsp;clear:\u003C\u002Fp>\n",{},{"name":81,"clientId":696,"parentClientId":68,"renderedHtml":697,"attributes":698},"6a8e6cd2eb740","\n\u003Col class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Boilerplate:\u003C\u002Fstrong> You have multiple declarations for what is conceptually one idea (“an&nbsp;enemy”).\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Manual Connection:\u003C\u002Fstrong> The language doesn’t connect the choice and the data for&nbsp;you.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Lack of Safety:\u003C\u002Fstrong> The (\u003Ccode>Goblin\u003C\u002Fcode>) data cast is not checked by the compiler. It’s a promise from you, the programmer, that can easily be broken, leading to runtime&nbsp;crashes.\u003C\u002Fli>\n\u003C\u002Fol>\n",{},{"name":86,"clientId":700,"parentClientId":696,"renderedHtml":701,"attributes":702},"6a8e6cd2eb741","\n\u003Cli>\u003Cstrong>Boilerplate:\u003C\u002Fstrong> You have multiple declarations for what is conceptually one idea (“an&nbsp;enemy”).\u003C\u002Fli>\n",{},{"name":86,"clientId":704,"parentClientId":696,"renderedHtml":705,"attributes":706},"6a8e6cd2eb742","\n\u003Cli>\u003Cstrong>Manual Connection:\u003C\u002Fstrong> The language doesn’t connect the choice and the data for&nbsp;you.\u003C\u002Fli>\n",{},{"name":86,"clientId":708,"parentClientId":696,"renderedHtml":709,"attributes":710},"6a8e6cd2eb743","\n\u003Cli>\u003Cstrong>Lack of Safety:\u003C\u002Fstrong> The (\u003Ccode>Goblin\u003C\u002Fcode>) data cast is not checked by the compiler. It’s a promise from you, the programmer, that can easily be broken, leading to runtime&nbsp;crashes.\u003C\u002Fli>\n",{},{"name":66,"clientId":712,"parentClientId":68,"renderedHtml":713,"attributes":714},"6a8e6cd2eb744","\n\u003Cp class=\"wp-block-paragraph\">Rust unifies those ideas under algebraic data types. A struct defines a product type, and an enum defines a sum type, both using the same lightweight syntax:\u003C\u002Fp>\n",{},{"name":135,"clientId":716,"parentClientId":68,"renderedHtml":717,"attributes":718},"6a8e6cd2eb745","\n\u003Cpre class=\"wp-block-code language-rust\">\u003Ccode>enum StatusEffect { Normal, Poisoned, Bleeding }\n​\nstruct Goblin { hp: i32, has_dagger: bool, status: StatusEffect }\nstruct Orc    { hp: i32, rage: i32,       status: StatusEffect }\n​\nenum Enemy { Goblin(Goblin), Orc(Orc) }\n\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":720,"parentClientId":68,"renderedHtml":721,"attributes":722},"6a8e6cd2eb747","\n\u003Cp class=\"wp-block-paragraph\">It’s cleaner and safer than Java, but you still have two constructs with different keywords.\u003C\u002Fp>\n",{},{"name":66,"clientId":724,"parentClientId":68,"renderedHtml":725,"attributes":726},"6a8e6cd2eb749","\n\u003Cp class=\"wp-block-paragraph\">Enzo’s Blueprint system is heavily inspired by Rust, and unifies them under a \u003Cstrong>Generalizable Patterns #4\u003C\u002Fstrong> echoing its established keyname: atom rhythm, expressing their relationships through \u003Cstrong>Syntactic Clarity over Annotation #9\u003C\u002Fstrong>:\u003C\u002Fp>\n",{},{"name":135,"clientId":728,"parentClientId":68,"renderedHtml":729,"attributes":730},"6a8e6cd2eb74a","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>\u002F\u002F Sum type for state\nStatus-Effect variants: Normal or Poisoned or Bleeding;\n\n\n\u002F\u002F Product types with a sum-typed field\nGoblin: &lt;&#91;\n    hp: 100,\n    has-dagger: \"true\",\n    status: Status-Effect\n]&gt;;\n\nOrc: &lt;&#91;\n    hp: 200,\n    rage: 50,\n    status: Status-Effect\n]&gt;;\n\n\n\u002F\u002F Sum type for which enemy\nEnemy variants: Goblin or Orc;\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":732,"parentClientId":68,"renderedHtml":733,"attributes":734},"6a8e6cd2eb74b","\n\u003Cp class=\"wp-block-paragraph\">Here, the “which kind” and the “what it contains” live in the same pattern. Each variant carries its own structured data, and each structure can contain variants of its own, without extra glue&nbsp;code.\u003C\u002Fp>\n",{},{"name":76,"clientId":736,"parentClientId":68,"renderedHtml":737,"attributes":738},"6a8e6cd2eb74c","\n\u003Ch2 class=\"wp-block-heading\">Composing Types\u003C\u002Fh2>\n",{},{"name":66,"clientId":740,"parentClientId":68,"renderedHtml":741,"attributes":742},"6a8e6cd2eb74d","\n\u003Cp class=\"wp-block-paragraph\">Traditional object-oriented design adds another layer: \u003Cstrong>inheritance.\u003C\u002Fstrong> It says, “this new type is like that old one, plus or minus a few differences.” That can be powerful, but deep hierarchies often create brittle dependencies:\u003C\u002Fp>\n",{},{"name":135,"clientId":744,"parentClientId":68,"renderedHtml":745,"attributes":746},"6a8e6cd2eb74e","\n\u003Cpre class=\"wp-block-code language-java\">\u003Ccode>class Creature {\n    int hp;\n    Creature(int hp) { this.hp = hp; }\n}\n​\nclass Humanoid extends Creature {\n    boolean usesTools = true;\n    Humanoid(int hp) { super(hp); }\n}\n​\nclass NightCreature extends Creature {\n    boolean darkVision = true;\n    NightCreature(int hp) { super(hp); }\n}\n​\n\u002F\u002F Goblin should be BOTH a Humanoid (uses tools) AND a NightCreature (dark vision)...\n\u002F\u002F but Java only allows one parent class.\nclass Goblin extends Humanoid { \u002F\u002F can't also extend NightCreature\n    boolean small = true;\n    Goblin() { super(100); }\n}\n​\n\u002F\u002F Workaround: invent a combo base to simulate multiple inheritance\nclass NightHumanoid extends Creature {\n    boolean usesTools = true;\n    boolean darkVision = true;\n    NightHumanoid(int hp) { super(hp); }\n}\n​\nclass Orc extends NightHumanoid {\n    int rage = 50;\n    Orc() { super(200); }\n}\n​\n\u002F\u002F Every new combination (DayHumanoid, FlyingNightBeast, UndeadNightHumanoid...) needs its own class.\n\u002F\u002F This is the \"class explosion\" problem.\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":748,"parentClientId":68,"renderedHtml":749,"attributes":750},"6a8e6cd2eb74f","\n\u003Cp class=\"wp-block-paragraph\">Each new subclass copies behavior or overrides fields, and the tree of relationships quickly becomes hard to&nbsp;follow.\u003C\u002Fp>\n",{},{"name":66,"clientId":752,"parentClientId":68,"renderedHtml":753,"attributes":754},"6a8e6cd2eb750","\n\u003Cp class=\"wp-block-paragraph\">Enzo \u003Cstrong>Favors Composition Over Inheritance #7\u003C\u002Fstrong>, focusing on simple, reusable pieces you can snap together,&nbsp;:\u003C\u002Fp>\n",{},{"name":135,"clientId":756,"parentClientId":68,"renderedHtml":757,"attributes":758},"6a8e6cd2eb751","\n\u003Cpre class=\"wp-block-code language-enzo\">\u003Ccode>Humanoid: &lt;&#91; tool-use: \"true\" ]&gt;;\nCreature: &lt;&#91; hp: 100 ]&gt;;\nNight-Creature: &lt;&#91; dark-vision: \"true\" ]&gt;;\nFlying-Creature: &lt;&#91; wings: \"true\" ]&gt;;\n\n\n\u002F\u002F A Goblin is composed of simple, reusable pieces\nGoblin: Humanoid and Creature and Night-Creature;\n\n\n\u002F\u002F and these parts can be reused to build other Blueprints\nBat: Creature and Night-Creature and Flying-Creature;\u003C\u002Fcode>\u003C\u002Fpre>\n",{},{"name":66,"clientId":760,"parentClientId":68,"renderedHtml":761,"attributes":762},"6a8e6cd2eb752","\n\u003Cp class=\"wp-block-paragraph\">Composition keeps structures shallow and flexible. Blueprints give you the expressive power of classes, inheritance, and enums, but without the fragmentation. They unify data definition and composition under one consistent, human-readable pattern. No matter what you’re building, you’re always describing structured relationships.\u003C\u002Fp>\n",{},{"name":66,"clientId":764,"parentClientId":68,"renderedHtml":765,"attributes":766},"6a8e6cd2eb753","\n\u003Cp class=\"wp-block-paragraph\">Enzo does include mechanisms for inheritance where it’s genuinely needed, but this article is already long&nbsp;enough.\u003C\u002Fp>\n",{},{"name":76,"clientId":768,"parentClientId":68,"renderedHtml":769,"attributes":770},"6a8e6cd2eb754","\n\u003Ch2 class=\"wp-block-heading\">Next Time\u003C\u002Fh2>\n",{},{"name":66,"clientId":772,"parentClientId":68,"renderedHtml":773,"attributes":774},"6a8e6cd2eb755","\n\u003Cp class=\"wp-block-paragraph\">If you’ve found these ideas interesting, stay tuned for the next article. I’ll shift from language \u003Cem>design\u003C\u002Fem> to \u003Cem>implementation\u003C\u002Fem>, how I actually built Enzo from&nbsp;scratch.\u003C\u002Fp>\n",{},{"name":66,"clientId":776,"parentClientId":68,"renderedHtml":777,"attributes":778},"6a8e6cd2eb756","\n\u003Cp class=\"wp-block-paragraph\">This piece covered only a subset of Enzo’s features. For the full syntax and examples, see the \u003Ca href=\"https:\u002F\u002Fhackmd.io\u002F@jcklpe\u002FSkqPDU8xw\">syntax spec README\u003C\u002Fa>, or explore the \u003Ca href=\"https:\u002F\u002Fcolab.research.google.com\u002Fgithub\u002Fjcklpe\u002Fenzo-lang\u002Fblob\u002Fmaster\u002Finterpreter\u002Fdemo.ipynb\">interactive Colab notebook\u003C\u002Fa> to try it yourself.\u003C\u002Fp>\n",{},{"name":66,"clientId":780,"parentClientId":68,"renderedHtml":781,"attributes":782},"6a8e6cd2eb757","\n\u003Cp class=\"wp-block-paragraph\">\u003C\u002Fp>\n",{},{"name":784,"clientId":785,"parentClientId":68,"renderedHtml":786,"attributes":787},"core\u002Ffootnotes","6a8e6cd2eb758","\u003Col class=\"wp-block-footnotes\">\u003Cli id=\"e2e7cc0c-5406-4f91-a20b-b98502542ba1\">I did not know about the \u003Ca href=\"https:\u002F\u002Fwiki.osdev.org\u002FPlain_English_Programming#:~:text=The%20language%20and%20its%20documentation,unary%20minus%20for%20negating%20variables\" data-type=\"link\" data-id=\"https:\u002F\u002Fwiki.osdev.org\u002FPlain_English_Programming#:~:text=The%20language%20and%20its%20documentation,unary%20minus%20for%20negating%20variables\">Plain Language Programming language\u003C\u002Fa> when I designed Enzo but a friend sent it to me and it ends up looking a lot like Enzo! \u003Ca href=\"#e2e7cc0c-5406-4f91-a20b-b98502542ba1-link\" aria-label=\"Jump to footnote reference 1\">↩︎\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Fol>",{},"\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F A Number atom is bound to a keyname\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$the-answer\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 42\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F A Text atom is bound to a keyname\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$greeting\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"hello, world\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F Enzo: one consistent pattern\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$name\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"Sam\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$person\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">  $name\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"Todd\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">  $age\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 50\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F A List is a collection of values in square brackets\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$my-list\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFEE44\">  10\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">                     \u002F\u002FA simple Number value\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">  \"a piece of text\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">      \u002F\u002F a simple Text value\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">  $age\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 30\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">                \u002F\u002F a named Number value inside the list\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$my-list.\u003C\u002Fspan>\u003Cspan style=\"color:#FF9AB0\">1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">      \u002F\u002F returns 10\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$my-list.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">age\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">    \u002F\u002F returns 30\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F This isn't just a calculation, it's a value that REPRESENTS the action of adding 2 and 2.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">2\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F This follows the exact same pattern as `$greeting: \"hello\"`\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">add-two\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    param\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $number\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">    return(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$number\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F Note: Function keynames can omit the `$` sigil for readability purposes. But you can also invoke using the `$` even if you didn't declare it that way. So `$add-two()`, and `add-two()` are both valid. Even `$add-two` is valid, allowing the Function to recede into the background as just another value.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$score\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 100\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">      \u002F\u002F Creation with ':'\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$score\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 101\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">    \u002F\u002F Mutation is explicit and visually distinct\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFEE44\">102\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> :>\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $score\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">    \u002F\u002F You can even bind in the other direction (inspired by R)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$original\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$copy\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $original\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">      \u002F\u002F this makes a copy of the list\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$copy.\u003C\u002Fspan>\u003Cspan style=\"color:#FF9AB0\">1\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 99\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">         \u002F\u002F change the first element of the copy\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$original.\u003C\u002Fspan>\u003Cspan style=\"color:#FF9AB0\">1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">           \u002F\u002F still 1 -- $original is unchanged\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$original\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">10\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$copy\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $original\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$ref\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#EE80D8\"> @original\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$copy.\u003C\u002Fspan>\u003Cspan style=\"color:#FF9AB0\">1\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 99\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$original.\u003C\u002Fspan>\u003Cspan style=\"color:#FF9AB0\">1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">     \u002F\u002F still 10, because $copy was a separate copy\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$ref.\u003C\u002Fspan>\u003Cspan style=\"color:#FF9AB0\">1\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 99\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$original.\u003C\u002Fspan>\u003Cspan style=\"color:#FF9AB0\">1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">     \u002F\u002F now 99, because $ref was referencing $original\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">increment\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    param\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $num\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">    $num\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $num\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$val\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 5\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">increment(\u003C\u002Fspan>\u003Cspan style=\"color:#EE80D8\">@val\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F After the call, $val is now 6, because the function modified it by reference.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">double\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">param\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $x\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $x\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> *\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">apply-twice\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    param\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $func\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> ()\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">    \u002F\u002F expects a function\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    param\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $value\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">    return(func(func(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$value\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)))\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">apply-twice(\u003C\u002Fspan>\u003Cspan style=\"color:#EE80D8\">@double\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 5\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">    \u002F\u002F -> 20\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$nums\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">Loop\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> for\u003C\u002Fspan>\u003Cspan style=\"color:#EE80D8\"> @item\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> in\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $nums\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">    $item\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $item\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> *\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 10\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F $nums is now [10, 20, 30]\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$nums\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$a\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $b\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $c\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $nums\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">[]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$a\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 99\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F $nums is still [1, 2, 3]\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$nums\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$a\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $b\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $c\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#EE80D8\"> @nums\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">[];\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$a\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 99\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F $nums is now [99, 2, 3]\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">If\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $score\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> is greater than\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 90\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> and\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $user.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">isActive\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"Excellent!\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">Else\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> if \u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$score\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> is greater than\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 75\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"Pretty good.\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">Else\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"Keep trying.\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">If\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $fruit\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> is\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"apple\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"Crunchy snack\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">or\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> is\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"orange\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"Juicy citrus\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">or\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> is\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"banana\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"Yellow goodness\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">Otherwise\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"Unknown fruit\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F It works with simple anon Function atoms\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFEE44\">100\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> then\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">                 \u002F\u002F returns 101\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFEE44\">10\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> then\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $this\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">              \u002F\u002F returns 20, this operation would be impossible with the implicit first argument pattern.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFEE44\">1\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> then\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> then\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> *\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">   \u002F\u002F returns 6\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F It also works with named Function atoms.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$users\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    then\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> filter(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"active\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    then\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> sort-by(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"last-name\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    then\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> select(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">\"id\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"email\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">])\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F Exactly equivalent to, but more readable than a set of nested functions:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">select(sort-by(filter(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">$users\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"active\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">\"lastName\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">\"id\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"email\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">])\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$count\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">Loop\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">    $count\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $count\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    If\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $count\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> is greater than\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 5\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">        end-loop\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">    )\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"Looping... iteration \u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">&#x3C;$count>\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$n\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">Loop\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> while\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $n\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> is less than\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"n is \u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">&#x3C;$n>\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">    $n\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $n\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$x\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">Loop\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> until\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $x\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> is\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 5\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"x is \u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">&#x3C;$x>\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">    $x\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $x\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$nums\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">10\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 20\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 30\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">Loop\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> for\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $x\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> in\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $nums\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">    \"Saw number \u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">&#x3C;$x>\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">    \u002F\u002F $x is a copy here, changes won't persist\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">Loop\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> for\u003C\u002Fspan>\u003Cspan style=\"color:#EE80D8\"> @x\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> in\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $nums\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">    $x\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> $x\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> *\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F now $nums is [20, 40, 60] because we doubled each in place\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$first-name\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"Ava\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$last-name\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"McCabe\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">\"Hello, \u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">&#x3C;$first-name>\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> &#x3C;$last-name>\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">!\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">   \u002F\u002F -> \"Hello, Ava McCabe!\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AAFF44\">\"Sum: \u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">2\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">>\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">                         \u002F\u002F -> \"Sum: 5\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$list-1\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$list-2\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">3\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 4\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$list-3\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">&#x3C;$list-1>\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> &#x3C;$list-2>\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">    \u002F\u002F merged List of [1, 2, 3, 4]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$list-3\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">0\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> &#x3C;$list-3>\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">          \u002F\u002F prepended List of [0, 1, 2, 3, 4]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">$list-3\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> &#x3C;:\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">&#x3C;$list-3>\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 5\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">          \u002F\u002F appended List of [0, 1, 2, 3, 4, 5]\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F Sum type for state\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AA88FF\">Status-Effect\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> variants:\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Normal\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> or\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Poisoned\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> or\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Bleeding\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F Product types with a sum-typed field\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#88AAFF\">Goblin\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> &#x3C;[\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F090D0\">    hp\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 100\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F090D0\">    has-dagger\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"true\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F090D0\">    status\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Status-Effect\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#88AAFF\">]>\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#88AAFF\">Orc\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> &#x3C;[\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F090D0\">    hp\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 200\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F090D0\">    rage\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 50\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F090D0\">    status\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Status-Effect\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#88AAFF\">]>\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F Sum type for which enemy\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#AA88FF\">Enemy\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> variants:\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Goblin\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> or\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Orc\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#88AAFF\">Humanoid\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> &#x3C;[\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\"> tool-use\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"true\"\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> ]>\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#88AAFF\">Creature\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> &#x3C;[\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 100\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> ]>\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#88AAFF\">Night-Creature\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> &#x3C;[\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\"> dark-vision\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"true\"\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> ]>\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#88AAFF\">Flying-Creature\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> &#x3C;[\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\"> wings\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> \"true\"\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> ]>\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F A Goblin is composed of simple, reusable pieces\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#88AAFF\">Goblin\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Humanoid\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> and\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Creature\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> and\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Night-Creature\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F and these parts can be reused to build other Blueprints\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#88AAFF\">Bat\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Creature\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> and\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Night-Creature\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> and\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> Flying-Creature\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F JavaScript: different syntax for similar ideas\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">var\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> name\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">Sam\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">               \u002F\u002F uses '='​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">var\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> person\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">  name\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">:\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">Todd\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> };\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\"> \u002F\u002F uses ':'\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">array\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">0\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">           \u002F\u002F this accesses the 1st slot of an array by an index \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">numberobject\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">color\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\"> \u002F\u002F this accesses the field named \"color\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F JavaScript: traditional function syntax\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">function\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> addTwo(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">number\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">  return\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> number\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">let\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> score\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 10\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">    \u002F\u002F initial declaration\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">score\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 15\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">        \u002F\u002F reassignment (same operator '=')\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">let\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> x\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 5\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">let\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> y\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> x\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">y\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 6\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">console\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">log(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">x\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">    \u002F\u002F 5 (primitives are copied by value)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">let\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> arr1\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">10\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">let\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> arr2\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> arr1\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">arr2\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">0\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 99\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">console\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">log(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">arr1\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">0\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">])\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">              \u002F\u002F 99 (objects\u002Farrays assigned by reference)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">function\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> double(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">x\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">  return\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> x\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> *\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7799CC\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">function\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> applyTwice(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">func\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> value\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">  return\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> func(func(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">value\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">))\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7799CC\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">applyTwice(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">double\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 5\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">  \u002F\u002F → 20\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">userList\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">filter(\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">isActive\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">sortBy(\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">lastName\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">select([\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">id\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">email\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">])\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">users\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">  |>\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> filter(\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">%,\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">active\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">  |>\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> sortBy(\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">%,\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">lastName\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">  |>\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> select(\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">%,\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">id\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">email\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">])\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">count \u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">=\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">count \u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> count \u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">+\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\">  # (uses '=' for update as well)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">public\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> enum\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> StatusEffect\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> NORMAL\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> POISONED\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> BLEEDING\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">public\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> class\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Goblin\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">  int\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 100\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">  boolean\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> hasDagger\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> true\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">  StatusEffect\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> status\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> StatusEffect\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">NORMAL\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">public\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> class\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Orc\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">  int\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 200\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">  int\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> rage\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 50\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">  StatusEffect\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> status\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> StatusEffect\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">NORMAL\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F an enum to group the Goblin and Orc together\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">public\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> enum\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> EnemyType\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> GOBLIN\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> ORC\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F But the GOBLIN enum isn't connected to the Goblin class, so you have to do this:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">public\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> void\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> printEnemyDetails(\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">EnemyType\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> type\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> Object\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> data\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    switch\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\">type\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">)\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">        case\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> GOBLIN\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">            Goblin\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> goblin\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\">Goblin\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">)\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> data\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\"> \u002F\u002F unchecked cast\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">            System\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">out\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">println(\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">A Goblin with \u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> goblin\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">hp\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> HP.\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">            break\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">        case\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> ORC\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">            Orc\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> orc\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\">Orc\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">)\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> data\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6A8A\">            System\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">out\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">println(\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\">An Orc with \u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> orc\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">hp\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> HP and \u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> orc\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">rage\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#AAFF44\"> rage.\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">            break\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">class\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Creature\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    int\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">    Creature(\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">int\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> this\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F090D0\">hp\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">class\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Humanoid\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> extends\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Creature\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    boolean\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> usesTools\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> true\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">    Humanoid(\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">int\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> super\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\">hp\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">);\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">class\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> NightCreature\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> extends\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Creature\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    boolean\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> darkVision\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> true\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">    NightCreature(\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">int\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> super\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\">hp\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">);\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F Goblin should be BOTH a Humanoid (uses tools) AND a NightCreature (dark vision)...\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F but Java only allows one parent class.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">class\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Goblin\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> extends\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Humanoid\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#99AADD;font-style:italic\"> \u002F\u002F can't also extend NightCreature\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    boolean\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> small\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> true\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">    Goblin()\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> super\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">100\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">);\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F Workaround: invent a combo base to simulate multiple inheritance\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">class\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> NightHumanoid\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> extends\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Creature\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    boolean\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> usesTools\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> true\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    boolean\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> darkVision\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#88AAFF\"> true\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">    NightHumanoid(\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">int\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> super\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\">hp\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">);\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">class\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Orc\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\"> extends\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> NightHumanoid\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">    int\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> rage\u003C\u002Fspan>\u003Cspan style=\"color:#FFA66F\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\"> 50\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">    Orc()\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> super\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FFEE44\">200\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">);\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#44DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F Every new combination (DayHumanoid, FlyingNightBeast, UndeadNightHumanoid...) needs its own class.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#99AADD;font-style:italic\">\u002F\u002F This is the \"class explosion\" problem.\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">enum\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> StatusEffect\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Normal\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Poisoned\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Bleeding\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">struct\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Goblin\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> i32\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> has_dagger\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> bool\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> status\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> StatusEffect\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">struct\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Orc\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">    {\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> hp\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> i32\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\"> rage\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> i32\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">,\u003C\u002Fspan>\u003Cspan style=\"color:#FF6A8A\">       status\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> StatusEffect\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">​\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFFFFF\">enum\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\"> Enemy\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> Goblin\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">(\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\">Goblin\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">),\u003C\u002Fspan>\u003Cspan style=\"color:#44DDFF\"> Orc\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">(\u003C\u002Fspan>\u003Cspan style=\"color:#AA88FF\">Orc\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\">)\u003C\u002Fspan>\u003Cspan style=\"color:#7799CC\"> }\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki midnight\" style=\"background-color:#0818a0;color:#e0eaff\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0EAFF\">users\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">|>\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> List.filter isActive\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">|>\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> List.sortBy lastName\u003C\u002Fspan>\u003Cspan style=\"color:#FFFFFF\">|>\u003C\u002Fspan>\u003Cspan style=\"color:#E0EAFF\"> List.map selectColumns\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",1787718861261]