{"id":23194722,"url":"https://github.com/abrudz/dyalog-apl-extended","last_synced_at":"2026-01-19T02:33:13.022Z","repository":{"id":90728634,"uuid":"139723948","full_name":"abrudz/dyalog-apl-extended","owner":"abrudz","description":"Dyalog APL Extended","archived":false,"fork":false,"pushed_at":"2024-05-14T17:31:11.000Z","size":182,"stargazers_count":28,"open_issues_count":0,"forks_count":4,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-05T07:43:16.394Z","etag":null,"topics":["apl","dyalog","dyalog-apl","dyalog-library","dyalogapl","extensions","glyphs","library","repl"],"latest_commit_sha":null,"homepage":"https://tio.run/#apl-dyalog-extended","language":"APL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/abrudz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"abrudz"}},"created_at":"2018-07-04T13:11:25.000Z","updated_at":"2024-12-04T16:44:31.000Z","dependencies_parsed_at":null,"dependency_job_id":"91a9246e-44e6-4245-8753-dfe41408f8ed","html_url":"https://github.com/abrudz/dyalog-apl-extended","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/abrudz/dyalog-apl-extended","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abrudz%2Fdyalog-apl-extended","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abrudz%2Fdyalog-apl-extended/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abrudz%2Fdyalog-apl-extended/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abrudz%2Fdyalog-apl-extended/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abrudz","download_url":"https://codeload.github.com/abrudz/dyalog-apl-extended/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abrudz%2Fdyalog-apl-extended/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28558236,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T00:46:33.223Z","status":"online","status_checked_at":"2026-01-19T02:00:08.049Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apl","dyalog","dyalog-apl","dyalog-library","dyalogapl","extensions","glyphs","library","repl"],"created_at":"2024-12-18T13:15:20.924Z","updated_at":"2026-01-19T02:33:13.008Z","avatar_url":"https://github.com/abrudz.png","language":"APL","funding_links":["https://github.com/sponsors/abrudz"],"categories":[],"sub_categories":[],"readme":"# [Dyalog APL](https://www.dyalog.com/) Extended\r\n\r\nExtended domains of existing primitives/quad-names, and a few new ones. Requires Dyalog APL version 16.0 or higher.\r\n\r\nThis project serves as a breeding ground for ideas. While some have been adopted into Dyalog APL proper, it is unlikely that many will be. Furthermore, Dyalog 18.0 gave a different meaning to monadic `≠` than proposed here, leaving Extended Dyalog APL as a deadend. It spiritual successor of sorts is my [Dyalog APL Vision](https://github.com/abrudz/dyalog_vision).\r\n\r\n### How to use\r\n\r\nThese extensions are [available on *Try it Online*](https://tio.run/##SyzI0U2pTMzJT9dNrShJzUtJTfn//1Hf1EdtEzQMFQwUULAmREjzUW@DekZqTk6@us6j3qWPeleph/sH@bio//8PAA), but can easily be used offline:\r\n\r\n#### Initialisation\r\n\r\nReplacing `ns` with your target namespace (e.g. `#`), do\r\n\r\n```\r\n]Load path/dyalog-apl-extended/* -target=ns\r\n```\r\n\r\nor\u003csup\u003e17.0\u003c/sup\u003e\r\n\r\n```\r\n]Link ns path/dyalog-apl-extended\r\n```\r\n\r\nor\u003csup\u003e17.1\u003c/sup\u003e\r\n\r\n```\r\n]Link.Create ns path/dyalog-apl-extended\r\n```\r\n\r\n#### Running code\r\n\r\nNow you have three options:\r\n\r\n1. Use the extensions directly with the glyph names.\r\n1. Use `ns.Extended.FIX` as a drop in for `⎕FIX`.\r\n1. Use `ns.Extended.Repl ''` to start a (limited) session where the glyphs work. Enter `→` to exit.\r\n\r\n### Content\r\n\r\n| Name                                              | Glyph  |   Type*   | Extension                                                    |\r\n| ------------------------------------------------- | :----: | :---: | ------------------------------------------------------------ |\r\n| \u003cspan id=\"BackSlash\"\u003e[BackSlash](BackSlash.dyalog)\u003c/span\u003e                     |  `\\`   |  🔶   | `∘.f` when dyadic, allows short and/or multiple left args |\r\n| \u003cspan id=\"BackSlashBar\"\u003e[BackSlashBar](BackSlashBar.dyalog)\u003c/span\u003e               |  `⍀`   |  🔶   | `⊢∘f` when dyadic, allows short and/or multiple left args  |\r\n| \u003cspan id=\"Bullet\"\u003e[Bullet](Bullet.dyalog)\u003c/span\u003e                           |  `∙`   |  🔺   | Inner product and Alternant                                  |\r\n| \u003cspan id=\"CircleDiaeresis\"\u003e[CircleDiaeresis](CircleDiaeresis.dyalog)\u003c/span\u003e         |  `⍥`   |  🔺   | Over and Depth                                               |\r\n| \u003cspan id=\"CircleJot\"\u003e[CircleJot](CircleJot.dyalog)\u003c/span\u003e                     |  `⌾`   |  🔺   | Complex/Imaginary                                            |\r\n| \u003cspan id=\"DelDiaeresis\"\u003e[DelDiaeresis](DelDiaeresis.dyalog)\u003c/span\u003e               |  `⍢`   |  🔺   | Under (a.k.a. Dual)                                          |\r\n| \u003cspan id=\"DelTilde\"\u003e[DelTilde](DelTilde.dyalog)\u003c/span\u003e                       |  `⍫`   |  🔺   | Obverse; `⍺⍺` but with inverse `⍵⍵`                          |\r\n| \u003cspan id=\"Diaeresis\"\u003e[Diaeresis](Diaeresis.dyalog)\u003c/span\u003e                     |  `¨`   |  🔵   | allows constant operand                                      |\r\n| \u003cspan id=\"Divide\"\u003e[Divide](Divide.dyalog)\u003c/span\u003e                           |  `÷`   |  🔵   | monadic converts letters to title case when possible         |\r\n| \u003cspan id=\"DollarSign\"\u003e[DollarSign](DollarSign.dyalog)\u003c/span\u003e                   |  `$`   |  🔺   | string enhancement \u003ccode\u003e${1}\u003c/code\u003e:`1⊃⍺`, \u003ccode\u003e${expr}\u003c/code\u003e:`⍎expr`, `\\n`:JSON |\r\n| \u003cspan id=\"DownArrow\"\u003e[DownArrow](DownArrow.dyalog)\u003c/span\u003e                     |  `↓`   |  🔵   | allows long `⍺`                                              |\r\n| \u003cspan id=\"DownShoe\"\u003e[DownShoe](DownShoe.dyalog)\u003c/span\u003e                       |  `∪`   |  🔵   | allows rank\u003e1                                                |\r\n| \u003cspan id=\"Downstile\"\u003e[Downstile](Downstile.dyalog)\u003c/span\u003e                     |  `⌊`   |  🔵   | monadic lowercases letters                                   |\r\n| \u003cspan id=\"DownTack\"\u003e[DownTack](DownTack.dyalog)\u003c/span\u003e                       |  `⊤`   |  🔶   | 2s as default left argument                                  |\r\n| \u003cspan id=\"Ellipsis\"\u003e[Ellipsis](Ellipsis.dyalog)\u003c/span\u003e                       |  `…`   |  🔺   | fill sequence gaps ([dfns's `to⍤1`](http://dfns.dyalog.com/n_to.htm)) |\r\n| \u003cspan id=\"EpsilonUnderbar\"\u003e[EpsilonUnderbar](EpsilonUnderbar.dyalog)\u003c/span\u003e         |  `⍷`   |  🔶   | monadic is Type `∊` with `⎕ML←0`                             |\r\n| \u003cspan id=\"Equals\"\u003e[Equals](Equals.dyalog)\u003c/span\u003e                           |  `=`   |  🔶   | with TAO; monad: is-type                                     |\r\n| \u003cspan id=\"GreaterThan\"\u003e[GreaterThan](GreaterThan.dyalog)\u003c/span\u003e                 |  `\u003e`   |  🔶   | with TAO; monad: is-strictly-negative/is-visible             |\r\n| \u003cspan id=\"GreaterThanOrEqualTo\"\u003e[GreaterThanOrEqualTo](GreaterThanOrEqualTo.dyalog)\u003c/span\u003e |  `≥` |  🔶   | with TAO; monad: is non-positive/is-not-control-character    |\r\n| \u003cspan id=\"house\"\u003ehouse\u003c/span\u003e                                             |  `⌂`   |  🔺   | prefix for contents of [dfns](http://dfns.dyalog.com/n_contents.htm)  |\r\n| \u003cspan id=\"infinity\"\u003e[infinity](infinity.dyalog)\u003c/span\u003e                       |  `∞`   |  🔺   | largest integer (for use with `⍤` and `⍣`)                   |\r\n| \u003cspan id=\"Iota\"\u003e[Iota](Iota.dyalog)\u003c/span\u003e                               |  `⍳`   |  🔵   | Unicode version of [dfns's `iotag`](http://dfns.dyalog.com/n_iotag.htm) |\r\n| \u003cspan id=\"IotaUnderbar\"\u003e[IotaUnderbar](IotaUnderbar.dyalog)\u003c/span\u003e               |  `⍸`   |  🔵   | allows duplicates/non-Booleans                               |\r\n| \u003cspan id=\"IotaUnderbarInverse\"\u003e[IotaUnderbarInverse](IotaUnderbarInverse.dyalog)\u003c/span\u003e | `⍸⍣¯1` |  🔵   | given `r`, finds `n` so that `r≡⍸n`                          |\r\n| \u003cspan id=\"JotDiaeresis\"\u003e[JotDiaeresis](JotDiaeresis.dyalog)\u003c/span\u003e               |  `⍤`   |  🔵   | allows constant left operand, Atop with function right operand |\r\n| \u003cspan id=\"JotUnderbar\"\u003e[JotUnderbar](JotUnderbar.dyalog)\u003c/span\u003e               |  `⍛`   |  🔺   | reverse composition `X f⍛g Y` is `(f X) g Y` |\r\n| \u003cspan id=\"LeftShoe\"\u003e[LeftShoe](LeftShoe.dyalog)\u003c/span\u003e                       |  `⊂`   |  🔵   | allows partitioning along multiple trailing axes, with short ⍺s, and inserting/appending empty partitions |\r\n| \u003cspan id=\"LeftShoeStile\"\u003e[LeftShoeStile](LeftShoeStile.dyalog)\u003c/span\u003e             |  `⍧`   |  🔺   | monad: nub-sieve; dyad: count-in                             |\r\n| \u003cspan id=\"LeftShoeWithAxis\"\u003e[LeftShoeWithAxis](LeftShoeWithAxis.dyalog)\u003c/span\u003e       | `⊂[k]` |  🔵   | as `⊂`, but called with left operand                         |\r\n| \u003cspan id=\"LessThan\"\u003e[LessThan](LessThan.dyalog)\u003c/span\u003e                       |  `\u003c`   |  🔶   | with TAO; monad: is-strictly-positive/is-control-character   |\r\n| \u003cspan id=\"LessThanOrEqualTo\"\u003e[LessThanOrEqualTo](LessThanOrEqualTo.dyalog)\u003c/span\u003e     |  `≤`   |  🔶   | with TAO ; monad: is-non-negative/is-invisible               |\r\n| \u003cspan id=\"Minus\"\u003e[Minus](Minus.dyalog)\u003c/span\u003e                             |  `-`   |  🔵   | monadic flips letter case                                    |\r\n| \u003cspan id=\"macron\"\u003e[macron](FIX.dyalog#L79)\u003c/span\u003e                          |  `¯`   |  🔵   | as prefix to name or primitive means its inverse             |\r\n| \u003cspan id=\"negativeInfinity\"\u003e[negativeInfinity](negativeInfinity.dyalog)\u003c/span\u003e       |  `¯∞`  |  🔺   | smallest integer (for use with `⍣`)                          |\r\n| \u003cspan id=\"Nand\"\u003e[Nand](Nand.dyalog)\u003c/span\u003e                               |  `⍲`   |  🔶   | monad: not all equal to type                                 |\r\n| \u003cspan id=\"Nor\"\u003e[Nor](Nor.dyalog)\u003c/span\u003e                                 |  `⍱`   |  🔶   | monad: not any equal to type                                 |\r\n| \u003cspan id=\"NotEqualTo\"\u003e[NotEqualTo](NotEqualTo.dyalog)\u003c/span\u003e                   |  `≠`   |  🔶   | with TAO; monad: is-non-type                                 |\r\n| \u003cspan id=\"Percent\"\u003e[Percent](Percent.dyalog)\u003c/span\u003e                 |  `%`   |  🔺   | `f%` and `A%`: probability-logical function (mapping arrays) |\r\n| \u003cspan id=\"QuadDiamond\"\u003e[QuadDiamond](QuadDiamond.dyalog)\u003c/span\u003e                 |  `⌺`   |  🔶   | auto-extended `⍵⍵`, allows small `⍵`, optional edge spec(s) ([0:Zero; 1:Repl; 2:Rev; 3:Mirror; 4:Wrap](http://web.science.mq.edu.au/~len/preprint/hamey-dicta2015-functional-border.pdf#page=3); -:Twist) with masks as operand's `⍺` |\r\n| \u003cspan id=\"QuestionMark\"\u003e[QuestionMark](QuestionMark.dyalog)\u003c/span\u003e               |  `?`   |  🔵   | `⍺?¯⍵` as norm dist stddev `⍵` and optional mean `⍺←0`|\r\n| \u003cspan id=\"Rho\"\u003e[Rho](Rho.dyalog)\u003c/span\u003e                                 |  `⍴`   |  🔵   | allows omitting one dimension length with `¯1`               |\r\n| \u003cspan id=\"RightShoeUnderbar\"\u003e[RightShoeUnderbar](RightShoeUnderbar.dyalog)\u003c/span\u003e     |  `⊇`   |  🔺   | monadic discloses if scalar, dyadic indexes sanely           |\r\n| \u003cspan id=\"RightShoeUnderbarWithAxis\"\u003e[RightShoeUnderbarWithAxis](RightShoeUnderbarWithAxis.dyalog)\u003c/span\u003e | `⊇[k]` | 🔺 | as above, but called with left operand              |\r\n| \u003cspan id=\"Root\"\u003e[Root](Root.dyalog)\u003c/span\u003e                               |  `√`   |  🔺   | (Square) Root                                                |\r\n| \u003cspan id=\"SemicolonUnderbar\"\u003e[SemicolonUnderbar](SemicolonUnderbar.dyalog)\u003c/span\u003e     |  `⍮`   |  🔺   | (Half) Pair; use `↑⍤⍮` to add axis                           |\r\n| \u003cspan id=\"Slash\"\u003e[Slash](Slash.dyalog)\u003c/span\u003e                             |  `/`   |  🔵   | allows short and/or multiple left args                       |\r\n| \u003cspan id=\"SlashBar\"\u003e[SlashBar](SlashBar.dyalog)\u003c/span\u003e                       |  `⌿`   |  🔵   | allows short and/or multiple left args                       |\r\n| \u003cspan id=\"StarDiaeresis\"\u003e[StarDiaeresis](StarDiaeresis.dyalog)\u003c/span\u003e             |  `⍣`   |  🔵   | allows non-scalar right operand incl. `∞` and `¯∞` and array left operand |\r\n| \u003cspan id=\"Stile\"\u003e[Stile](Stile.dyalog)\u003c/span\u003e                             |  `\\|`  |  🔵   | monadic normalises letters to lowercase (upper then lower)   |\r\n| \u003cspan id=\"StileTilde\"\u003e[StileTilde](StileTilde.dyalog)\u003c/span\u003e                   |  `⍭`   |  🔺   | monadic is factors; dyadic depends on `⍺`: 0=non-prime?, 1=prime?, ¯1=primes less than `⍵`, ¯2=`⍵`th prime, 4=next prime, ¯4=prev prime |\r\n| \u003cspan id=\"Tilde\"\u003e[Tilde](Tilde.dyalog)\u003c/span\u003e                             |  `~`   |  🔵   | monadic allows probabilities, dyadic allows rank\u003e1           |\r\n| \u003cspan id=\"TildeDiaeresis\"\u003e[TildeDiaeresis](TildeDiaeresis.dyalog)\u003c/span\u003e           |  `⍨`   |  🔵   | allows constant operand                                      |\r\n| \u003cspan id=\"Times\"\u003e[Times](Times.dyalog)\u003c/span\u003e                             |  `×`   |  🔵   | set/query letter case (lower: `¯1`, title: `0`, upper: `1`)  |\r\n| \u003cspan id=\"UpArrow\"\u003e[UpArrow](UpArrow.dyalog)\u003c/span\u003e                         |  `↑`   |  🔵   | allows long `⍺`                                              |\r\n| \u003cspan id=\"UpShoe\"\u003e[UpShoe](UpShoe.dyalog)\u003c/span\u003e                           |  `∩`   |  🔶   | monadic is self-classify; dyadic allows rank\u003e1               |\r\n| \u003cspan id=\"Upstile\"\u003e[Upstile](Upstile.dyalog)\u003c/span\u003e                         |  `⌈`   |  🔵   | monadic uppercases letters                                   |\r\n| \u003cspan id=\"UpTack\"\u003e[UpTack](UpTack.dyalog)\u003c/span\u003e                           |  `⊥`   |  🔶   | 2 as default left argument                                   |\r\n| \u003cspan id=\"Vel\"\u003e[Vel](Vel.dyalog)\u003c/span\u003e                                 |  `∨`   |  🔶   | monadic is Descending Sort                                   |\r\n| \u003cspan id=\"Wedge\"\u003e[Wedge](Wedge.dyalog)\u003c/span\u003e                             |  `∧`   |  🔶   | monadic is Ascending Sort                                    |\r\n| \u003cspan id=\"∆C\"\u003e[∆C](∆C.dyalog)\u003c/span\u003e                                   |  `⎕C`  |  🔺   | `fn ⎕C` applies case-insensitively, `array ⎕C` case-folds    |\r\n| \u003cspan id=\"∆EM\"\u003e[∆EM](∆EM.dyalog)\u003c/span\u003e                                   |  `⎕EM` |  🔺   | Self-inverse `⎕EM`                                         |\r\n| \u003cspan id=\"∆NS\"\u003e[∆NS](∆NS.dyalog)\u003c/span\u003e                                 |  `⎕NS` |  🔵   | allows `⎕NS names values` (tries to resolve `⎕OR`s)          |\r\n| \u003cspan id=\"∆NSinverse\"\u003e[∆NSinverse](∆NSinverse.dyalog)\u003c/span\u003e                   |`⎕NS⍣¯1`|  🔺   | allows `(names values)←⎕NS⍣¯1⊢ns` (returns `⎕OR`s for ns/fns) |\r\n| \u003cspan id=\"∆UCS\"\u003e[∆UCS](∆UCS.dyalog)\u003c/span\u003e                               | `⎕UCS` |  🔵   | scalar when monadic                                          |\r\n\r\n\\* 🔺 means new feature 🔶 means added valence 🔵 means expanded domain\r\n\r\n---\r\n\r\n\u003csup\u003e17.0\u003c/sup\u003e Requires Dyalog APL version 17.0  \r\n\u003csup\u003e17.1\u003c/sup\u003e Requires Dyalog APL version 17.1\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabrudz%2Fdyalog-apl-extended","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabrudz%2Fdyalog-apl-extended","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabrudz%2Fdyalog-apl-extended/lists"}