{"id":13608674,"url":"https://github.com/joes-esolangs/cassette","last_synced_at":"2026-02-20T18:43:09.457Z","repository":{"id":45510183,"uuid":"513327079","full_name":"joes-esolangs/cassette","owner":"joes-esolangs","description":"a new evolutionary highlevel and readable tape language (unlike brainf)","archived":false,"fork":false,"pushed_at":"2022-12-29T13:45:22.000Z","size":610,"stargazers_count":15,"open_issues_count":1,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2024-05-16T22:24:22.520Z","etag":null,"topics":["concatenative","functional-programming","homoiconic","interpreter","metaprogramming","programming-language","programming-languages","prolog","tape-based","untyped"],"latest_commit_sha":null,"homepage":"","language":"Prolog","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/joes-esolangs.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}},"created_at":"2022-07-13T00:09:59.000Z","updated_at":"2024-05-03T03:04:51.000Z","dependencies_parsed_at":"2023-01-31T09:00:55.083Z","dependency_job_id":null,"html_url":"https://github.com/joes-esolangs/cassette","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/joes-esolangs%2Fcassette","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joes-esolangs%2Fcassette/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joes-esolangs%2Fcassette/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joes-esolangs%2Fcassette/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joes-esolangs","download_url":"https://codeload.github.com/joes-esolangs/cassette/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248605261,"owners_count":21132136,"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":["concatenative","functional-programming","homoiconic","interpreter","metaprogramming","programming-language","programming-languages","prolog","tape-based","untyped"],"created_at":"2024-08-01T19:01:29.122Z","updated_at":"2026-02-20T18:43:09.392Z","avatar_url":"https://github.com/joes-esolangs.png","language":"Prolog","funding_links":[],"categories":["Uncategorized"],"sub_categories":["Uncategorized"],"readme":"# Cassette (WIP UNFINISHED)\nCassette is a new programming based off of the languages metatape, elixir, and joy, evolving syntax and semantics from each. Cassette is \n- Untyped\n- Interpreted (for now)\n- Homoiconic \n- Functional\n- Concatenive\n- Tape Based\n- Metaprogrammable (in the future).\n \n# how does it work? \nIf you are familier with stack langs, such as Forth, Joy, or Factor, it is common knowledge that the whole program is a stack. In Cassette it's very similar, but instead it uses a tape, which is a [Circular Doubly Linked List](https://en.wikipedia.org/wiki/Doubly_linked_list#Circular_doubly_linked_lists). Internally, Cassette represents it with two stacks (look into [tape.pl](backend/tape.pl) for more details).\n \nThis means that we can shift a tape `left` or `right`. Take for instance this tape:\n \n`1 2 3 4 5`\n\nIf we shift the tape left, we get this new tape.\n \n`2 3 4 5 1`\n \nSimilarly, we can move it right.\n \n`5 1 2 3 4`\n\nIn Cassette you have this functionality for the whole program, quotes, and first class tapes. \n\nEven though its a tape language, it works very much like a stack lang, using the left list as the main stack. All the pushing and popping happens there. \n \n# examples\n\nreversing a tape:\n```erlang\nfn [] reverse -\u003e [] \nfn [x \u003c: xs] reverse -\u003e [xs reverse :\u003e x] % examples of cons and snoc for pattern matching\n\nfn main ::\n    [1, 2, 3] reverse out\nend\n```\n\ncommon stack functions:\n```erlang\nfn x dup :: x x end\nfn x y swap :: y x end\nfn x y pop -\u003e x\n\n21 dup\n5 6 swap\n7 8 9 pop\n```\nor as quotes\n```erlang\n(as x -\u003e x x) as dup -\u003e\n(as x y -\u003e y x) as swap -\u003e\n(as x y -\u003e x) as pop -\u003e\n\n21 dup ~\u003e % ~\u003e evaluates a quote on the tape\n5 6 swap ~\u003e\n7 8 9 pop ~\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoes-esolangs%2Fcassette","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoes-esolangs%2Fcassette","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoes-esolangs%2Fcassette/lists"}