{"id":16983991,"url":"https://github.com/ratfactor/meow5","last_synced_at":"2026-02-28T09:30:15.271Z","repository":{"id":145254673,"uuid":"541216842","full_name":"ratfactor/meow5","owner":"ratfactor","description":"An extremely concatenative programming language","archived":true,"fork":false,"pushed_at":"2023-09-27T22:45:45.000Z","size":227,"stargazers_count":22,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-02-11T14:51:15.254Z","etag":null,"topics":["assembly","concatenative","concatenative-language","nasm"],"latest_commit_sha":null,"homepage":"","language":"Assembly","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ratfactor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-09-25T15:29:16.000Z","updated_at":"2024-04-19T01:22:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"88230a15-37d7-4f56-b50f-a2efbd19cc6f","html_url":"https://github.com/ratfactor/meow5","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/ratfactor%2Fmeow5","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ratfactor%2Fmeow5/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ratfactor%2Fmeow5/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ratfactor%2Fmeow5/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ratfactor","download_url":"https://codeload.github.com/ratfactor/meow5/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239872608,"owners_count":19711098,"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":["assembly","concatenative","concatenative-language","nasm"],"created_at":"2024-10-14T02:29:49.871Z","updated_at":"2026-02-28T09:30:15.204Z","avatar_url":"https://github.com/ratfactor.png","language":"Assembly","readme":"# Meow5: \"Meow. Meow. Meow. Meow. Meow.\"\n\n**MOVED!** Hello, I am moving my repos to http://ratfactor.com/repos/\nand setting them to read-only (\"archived\") on GitHub. Thank you, _-Dave_\n\n\u003cimg src=\"meow5cat.svg\" alt=\"SVG meow5 kitty cat logo\" align=\"right\"\u003e\n\nThis is a work in progress. Check the `log*.txt` files to\nsee where I'm currently at! Also take a look at\n`design-notes.txt` for more ongoing thoughts (also kinda\nfunctions as a vague todo/done list).\n\nThe language is now fully interactive!\n\n```\n\"Hello world!\" say\nHello world!\n\n: meow \"Meow. \" print ;\nmeow\nMeow.\n\n: meow5 meow meow meow meow meow ;\nMeow. Meow. Meow. Meow. Meow.\n```\n\nNote that this is Linux-only and is assembled with NASM.\n\nSee also:\n\n* http://ratfactor.com/meow5/ - Meow5's page on the World Wide Web\n* http://ratfactor.com/assembly-nights2 - If you want to know what this is _really_ about\n\nOh, and check out the \"Progress\" section in this README below.\n\n## What is Meow5?\n\nA Forth-like language that is conCATenative in two ways:\n\n1. \"Point free\" data flow\n2. Inlined functions\n\nIn the **point free data flow sense**: Instead of being\ncalled with explicit named parameters (\"points\"), functions\nare \"composed\" so that each one takes as input what the\nprevious one left behind. JavaScript programmers will\nrecognize this style:\n\n    people.map(get_names).filter(is_long).sort() // get sorted long names\n\nWhich might look like this in Forth:\n\n    PEOPLE GETNAMES LONGNAMES SORT\n\nIn the **inlined function** sense: all functions (and entire\nprograms) are concatenated copies of other functions.\n\nThe first \"point-free\" sense is true of any Forth-like\n(\"stack-based\") language.\n\nThe second sense is what's unique about Meow5. Using Forth\nnotation and nomenclature, the following word \"meow5\"...:\n\n    : meow5 meow meow meow meow meow ;\n\n...will be literally composed of five copies\nof the machine code that makes the word \"meow\". Crazy, right?\n\n\n## Why?\n\nI want to see how **simple** a Forth-like language can be.\n\nMy idea came about while studying Forth. A traditional\n\"threaded interpreted\" Forth goes to some pretty extreme\nlengths to conserve memory. The execution model is not only\ncomplicated, but seems also likely to not be all that great\nfor efficiency on modern machines where memory is much more\nabundant and the bottleneck oftenseems to be getting data\ninto the CPU fast enough.\n\nIn particular, the old Forth literature I have been reading\nis full of statements about needing to conserve the **few\nkilobytes of core memory** on a late 1960s machine.  But\neven my most modest low-powered Celeron and Atom-based\ncomputers have **L1 CPU caches** that dwarf those\nquantities!\n\nSo, given the tiny size of the programs I was writing with\nmy JONESFORTH port, I kept thinking, \"how far could I get if\nI just inlined _everything_?\" As in, actually made a copy of\nevery word's machine instructions every time it is\n\"compiled\".\n\nIn the name of simplicity, I'm also avoiding too many\nassembly tricks or any attempt at optimization (that stuff is\nreally fun, but I find it too distracting from making this\nproof-of-concept). So, for example, I'll use:\n\n    mov eax, 0\n\ninstead of the shorter (when assembled)  instruction:\n\n    xor eax, eax\n\nbecause the intent is clearer at a glance.\n\n\n## Psuedocode examples\n\nGiven these pseudo machine code definitions:\n\n    foo:\n        00A 00B\n        00C 00D\n\n    bar:\n        FFA FFB\n        FFC FFD\n\nthis Forth-like word definition:\n\n    : 2foo foo foo ;\n\nwould compile as:\n\n    2foo: \n        00A 00B\n        00C 00D\n        00A 00B\n        00C 00D\n\nand this Forth-like:\n\n    : bar2foo bar 2foo ;\n\nwould simply concatenate the entire contents of bar and 2foo:\n\n    bar2foo:\n        FFA FFB\n        FFC FFD\n        00A 00B\n        00C 00D\n        00A 00B\n        00C 00D\n\nand ultimately an entire program would be just a single\ncontinuous stream of concatenated instructions.\n\nI expect this will be silly but fun and educational.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fratfactor%2Fmeow5","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fratfactor%2Fmeow5","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fratfactor%2Fmeow5/lists"}