{"id":23194751,"url":"https://github.com/abrudz/dyalog_vision","last_synced_at":"2026-01-18T01:36:09.114Z","repository":{"id":90728608,"uuid":"455054705","full_name":"abrudz/dyalog_vision","owner":"abrudz","description":"A realistic future development for the core language of Dyalog APL","archived":false,"fork":false,"pushed_at":"2024-04-15T08:45:32.000Z","size":138,"stargazers_count":12,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2024-05-02T02:17:51.689Z","etag":null,"topics":["dyalog","dyalog-apl","language-extensions","polyfills"],"latest_commit_sha":null,"homepage":"","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}},"created_at":"2022-02-03T06:30:19.000Z","updated_at":"2024-03-11T02:59:17.000Z","dependencies_parsed_at":null,"dependency_job_id":"f1de5182-74a0-496b-8799-7d04f53da5f1","html_url":"https://github.com/abrudz/dyalog_vision","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abrudz%2Fdyalog_vision","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abrudz%2Fdyalog_vision/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abrudz%2Fdyalog_vision/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abrudz%2Fdyalog_vision/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abrudz","download_url":"https://codeload.github.com/abrudz/dyalog_vision/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247305895,"owners_count":20917202,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["dyalog","dyalog-apl","language-extensions","polyfills"],"created_at":"2024-12-18T13:15:25.093Z","updated_at":"2026-01-18T01:36:09.067Z","avatar_url":"https://github.com/abrudz.png","language":"APL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [Dyalog APL](https://www.dyalog.com/) Vision\n\nThis is [my](https://apl.wiki/Adám_Brudzewsky) vision for a realistic development of core Dyalog APL, including extending the domains of existing primitives/quad-names, and adding a few new ones. Requires and extends Dyalog APL version 18.2. If Dyalog APL moves forward in ways that are incompatible with what is found here, the vision will be updated accordingly. This project should therefore not be relied on as stable.\n\n### How to use\n\nYou can easily play with these almost like you use normal Dyalog APL in a session:\n\n#### Initialisation\n\nFrom within Dyalog APL 18.2 or higher, enter `]get path/dyalog_vision` or to import directly from GitHub `]get https://github.com/abrudz/dyalog_vision`\n\n#### Running code\n\nYou have three options:\n\n1. Use the extensions directly with the glyph names, e.g. `4 1 dyalog_vision.RightShoeUnderbar ⎕A`.\n2. Use `dyalog_vision.∆FIX` as a drop in for `⎕FIX`.\n3. Use `dyalog_vision.⍙REPL #` to start a (limited) session where the glyphs work. Enter `→` to exit.\n\n### Content\n\n* All scalar functions support [leading axis agreement](https://aplwiki.com/wiki/Leading_axis_agreement).\n\n* All set functions support arguments of any rank.\n\n* `⎕C` and monadic `⎕UCS` are scalar functions.\n\n* In addition, the following is included:\n\n| Name                                        | Symbol    | Type* | Extension                                                                                                                                                                                                                             | Examples                                                                                                       |\n| ------------------------------------------- |:---------:|:-----:| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |\n| \u003cspan id=\"CircleDiaeresis\"\u003e[CircleDiaeresis](CircleDiaeresis.aplo)\u003c/span\u003e     | `⍥`       | 🔵  | ✅ Depth when right operand is array. This is similar to Rank (`⍤`) but applies at nesting level.                                                                                                                                        | `f⍥0` applies `f` like a scalar function and `f⍥1` applies to flat subarrays. `f⍤1⍥1` applies to flat vectors. |\n| \u003cspan id=\"DelDiaeresis\"\u003e[DelDiaeresis](DelDiaeresis.aplo)\u003c/span\u003e           | `⍢`       | 🔺    | Under (a.k.a. Dual). Like `f⍥g` but conceptually inverts the right operand when done. If `g` is a selection function, it puts the data back where it came from                                                                        | `-⍢(2 3∘⊃)` negates the 2nd element's 3rd element.                                                             |\n| \u003cspan id=\"DelTilde\"\u003e[DelTilde](DelTilde.aplo)\u003c/span\u003e                   | `⍫`       | 🔺    | Obverse; `⍺⍺` but with inverse `⍵⍵`                                                                                                                                                                                                   | `×⍢(FFT⍫iFFT)`                                                                                                 |\n| \u003cspan id=\"DollarSign\"\u003e[DollarSign](DollarSign.aplf)\u003c/span\u003e               | `$`       | 🔺    | string enhancement \u003ccode\u003e${1}\u003c/code\u003e:`1⊃⍺`, \u003ccode\u003e${expr}\u003c/code\u003e:`⍎expr`, `\\n`:JSON                                                                                                                                                   | `'Dyer' 'Bob'$'Hi, ${2} ${1}!`\u003cbr/\u003e`$'Hi, ${first} ${last}!`\u003cbr/\u003e`$'2×3=${2×3}'`                               |\n| \u003cspan id=\"DownArrow\"\u003e[DownArrow](DownArrow.aplf)\u003c/span\u003e                 | `↓`       | 🔵    | dyad allows long `⍺`                                                                                                                                                                                                                  | `0 1↓'abc'` gives `1 2⍴'bc'`                                                                                   |\n| \u003cspan id=\"DownTack\"\u003e[DownTack](DownTack.aplf)\u003c/span\u003e                   | `⊤`       | ⚠     | `⊥⍣¯1` when left argument is scalar                                                                                                                                                                                                   | `2⊤123` gives `1 1 1 1 0 1 1`                                                                                  |\n| \u003cspan id=\"EpsilonUnderbar\"\u003e[EpsilonUnderbar](EpsilonUnderbar.aplf)\u003c/span\u003e     | `⍷`       | 🔶    | monad: Type (like `∊` with `⎕ML←0`)                                                                                                                                                                                                   | `⍷1'a'#` gives `0' '#`'                                                                                        |\n| \u003cspan id=\"Equal\"\u003e[Equal](Equal.aplf)\u003c/span\u003e                         | `=`       | 🔶    | monad: Rank (`≢⍴`)                                                                                                                                                                                                                     | `=10 20 30` gives `1`'                                                                                        |\n| \u003cspan id=\"GreaterOrEqual\"\u003e[GreaterOrEqual](GreaterOrEqual.aplf)\u003c/span\u003e       | `≥`       | 🔵    | monad: sort descending                                                                                                                                                                                                                 | `≥3 1 4 1 5` gives `5 4 3 1 1`                                                                                |\n| \u003cspan id=\"GreaterThan\"\u003e[GreaterThan](GreaterThan.aplf)\u003c/span\u003e             | `\u003e`       | 🔵    | monad: Join                                                                                                                                                                                                                           | `\u003e2 2⍴⍪¨1 2 3 4` gives `2 2⍴1 2 3 4`                                                                           |\n| \u003cspan id=\"JotUnderbar\"\u003e[JotUnderbar](JotUnderbar.aplo)\u003c/span\u003e             | `⍛`       | 🔺  | ✅ reverse composition `X f⍛g Y` is `(f X) g Y` and default argument                                                                                                                                                                     | `⌽⍛≡` checks for palindromes.\u003cbr/\u003e`a-⍛↑b` takes the last `a` from `b`.                                         |\n| \u003cspan id=\"LeftShoe\"\u003e[LeftShoe](LeftShoe.aplf)\u003c/span\u003e                   | `⊂`       | 🔵    | dyad allows partitioning along multiple leading axes                                                                                                                                                                                  | `(⊂1 1)⊂matrix` separates out the first row and column.                                                        |\n| \u003cspan id=\"LeftShoeUnderbar\"\u003e[LeftShoeUnderbar](LeftShoeUnderbar.aplf)\u003c/span\u003e   | `⊆`       | 🔵    | dyad allows partitioning along multiple leading axes                                                                                                                                                                                  | `(⊂1 0 1 1)⊆4 4⍴⎕A` splits off the first row and column, and removes the second.                               |\n| \u003cspan id=\"LessOrEqual\"\u003e[LessOrEqual](LessOrEqual.aplf)\u003c/span\u003e             | `≤`       | 🔵    | monad: sort ascending                                                                                                                                                                                                                  | `≤3 1 4 1 5` gives `1 1 3 4 5`                                                                                 |\n| \u003cspan id=\"LessThan\"\u003e[LessThan](LessOrEqual.aplf)\u003c/span\u003e                | `\u003c`       | 🔵    | monad: Major Cells                                                                                                                                                                                                                    | `\u003c2 2 2⍴⎕A` gives `(2 2⍴'ABCD')(2 2⍴'EFGH')`                                                                   |\n| \u003cspan id=\"QuadEqual\"\u003e[QuadEqual](QuadEqual.aplo)\u003c/span\u003e                 | `⌸`       | 🔵    | allow array operand to be vocabulary (then uses `{⊂⍵}` as internal operand)                                                                                                                                                           | `≢¨'ACGT'⌸'ATT-ACA'` gives `3 1 0 2`                                                                           |\n| \u003cspan id=\"QuadDiamond\"\u003e[QuadDiamond](QuadDiamond.aplo)\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](https://web.archive.org/web/20220709033454/http://web.science.mq.edu.au/~len/preprint/hamey-dicta2015-functional-border.pdf#page=3)); -:Twist) with masks as operand's `⍺` | Life on a cylinder: `0 4 Life⌺3 3`                                                                             |\n| \u003cspan id=\"QuestionMark\"\u003e[QuestionMark](QuestionMark.aplf)\u003c/span\u003e           | `?`       | 🔵    | dyadic allows `⍺` to be any shape (not just vector shape) and `⍵` is shape of array to select indices from                                                                                                                             | `3 5?4 13` deals 3 hands of 5 cards from deck of 4 suits from A to K                                            |\n| \u003cspan id=\"Rho\"\u003e[Rho](Rho.aplf)\u003c/span\u003e                             | `⍴`       | 🔵    | dyad: negatives reverse axis, `0.5` auto-size rounding down, `1.5` auto-size rounding up, `2.5` auto-size with padding                                                                                                       | Reshape into two columns: `0.5 2⍴data`                                                                         |\n| \u003cspan id=\"RightShoeUnderbar\"\u003e[RightShoeUnderbar](RightShoeUnderbar.aplf)\u003c/span\u003e | `⊇`       | 🔺  | monad: last (`⊃⌽,⍵`)\u003cbr/\u003e✅ dyad: select (`⌷⍨∘⊃⍨⍤0 99`)                                                                                                                                                                                  | `3 1 2⊇'abc'` gives `'cab'`                                                                                    |\n| \u003cspan id=\"Root\"\u003e[Root](Root.dyalog)\u003c/span\u003e                         | `√`       | 🔺    | (Square) Root                                                                                                                                                                                                                         | `√25` gives `5`\u003cbr/\u003e`3√27 gives 3`                                                                             |\n| \u003cspan id=\"UpArrow\"\u003e[UpArrow](UpArrow.aplf)\u003c/span\u003e                     | `↑`       | 🔵    | allows long `⍺`                                                                                                                                                                                                                       | `2 3↑4 5` gives `2 3⍴4 5 0 0 0 0`                                                                              |\n| \u003cspan id=\"Vel\"\u003e[Vel](Vel.aplf)\u003c/span\u003e                             | `∨`       | 🔶    | monad: demote (`,[⍳2]`)                                                                                                                                                                                                               | `∨2 3 4⍴⎕A` gives `6 4⍴⎕A`                                                                                     |\n| \u003cspan id=\"Wedge\"\u003e[Wedge](Wedge.aplf)\u003c/span\u003e                         | `∧`       | 🔶    | monad: promote (`⍵⍴⍨1,⍴⍵`)                                                                                                                                                                                                            | `'ABC'⍪⍥∧'DEF'` gives `2 3⍴⎕A`                                                                                 |\n| \u003cspan id=\"∆EM\"\u003e[∆EM](∆EM.aplf)\u003c/span\u003e                             | `⎕EM`     | 🔵    | Self-inverse `⎕EM`                                                                                                                                                                                                                    | `⎕EM'RANK ERROR' 'WS FULL'` gives `4 1`                                                                        |\n| \u003cspan id=\"∆NG\"\u003e[∆NG](∆NG.aplf)\u003c/span\u003e                             | `⎕NG`     | 🔺    | Name Get                                                                                                                                                                                                                              | `ref⎕NG'Bea' 'Abe'`                                                                                            |\n| \u003cspan id=\"∆NS\"\u003e[∆NS](∆NS.aplf)\u003c/span\u003e                             | `⎕NS`     | 🔵    | Accepts ref left arg. Name Set: The list of values to copy into the new/target namespace can have 2-element name-value vectors, setting the name to the given value                                                                   | `ref←⎕NS('Abe' 10)('Bea' 12)`\u003cbr/\u003e`ref⎕NS⊂'Carl' 8`                                                            |\n| \u003cspan id=\"∆NV\"\u003e[∆NV](∆NV.aplf)\u003c/span\u003e                             | `⎕NV`     | 🔺    | Names and Values                                                                                                                                                                                                                      | `ref⎕NV -2 9                                                                                                   |\n| \u003cspan id=\"∆SIGNAL\"\u003e[∆SIGNAL](∆signal.aplf)\u003c/span\u003e                     | `⎕SIGNAL` | 🔵    | Allows `⎕DMX`-style ref argument                                                                                                                                                                                                      | `⎕SIGNAL ⎕DMX`                                                                                                 |\n\n\\* 🔺 new feature 🔶 added valence 🔵 expanded domain ⚠ breaking change ✅ scheduled for 20.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabrudz%2Fdyalog_vision","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabrudz%2Fdyalog_vision","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabrudz%2Fdyalog_vision/lists"}