{"id":16260175,"url":"https://github.com/twolodzko/schemero","last_synced_at":"2025-10-05T06:51:16.516Z","repository":{"id":63174390,"uuid":"565270018","full_name":"twolodzko/schemero","owner":"twolodzko","description":"Minimal Scheme implementation in Erlang/OTP ","archived":false,"fork":false,"pushed_at":"2022-11-14T21:11:08.000Z","size":25,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-14T10:18:38.598Z","etag":null,"topics":["erlang","erlang-otp","lisp","lisp-interpreter","scheme","scheme-interpreter"],"latest_commit_sha":null,"homepage":"","language":"Erlang","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/twolodzko.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}},"created_at":"2022-11-12T21:27:18.000Z","updated_at":"2022-12-14T15:05:27.000Z","dependencies_parsed_at":"2022-11-14T10:47:56.173Z","dependency_job_id":null,"html_url":"https://github.com/twolodzko/schemero","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/twolodzko%2Fschemero","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twolodzko%2Fschemero/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twolodzko%2Fschemero/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twolodzko%2Fschemero/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twolodzko","download_url":"https://codeload.github.com/twolodzko/schemero/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247855147,"owners_count":21007505,"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":["erlang","erlang-otp","lisp","lisp-interpreter","scheme","scheme-interpreter"],"created_at":"2024-10-10T16:06:37.440Z","updated_at":"2025-10-05T06:51:11.473Z","avatar_url":"https://github.com/twolodzko.png","language":"Erlang","funding_links":[],"categories":[],"sub_categories":[],"readme":"# El Schemero Pequeño\n\n\u003e *Do It, Do It Again, and Again, and Again ...*  \n\u003e \u0026emsp; — *The Little Schemer* by Friedmann and Felleisen\n\n![Lisp cycles XKCD #297: \"Those are your father's parentheses. Elegant weapons for a more... civilized age.\"](https://imgs.xkcd.com/comics/lisp_cycles.png)\n\n(source \u003chttps://xkcd.com/297/\u003e)\n\n**Schemero** is a minimal Scheme implementation in [Erlang]/[OTP]. Erlang is a functional programming language, with\nnative support of lists and uses recursion as the basic execution mode, the same as Scheme. It also has its quirks.\nIt is dynamically typed and doesn't have user-defined types, so the way of imitating them is to create tuples like\n`{symbol, Name}` to define a `symbol` type.\nThe core concept of Erlang is [message passing], the programs are built of processes that communicate\nwith each other by passing messages to each other. This is how the code is parsed in Schemero: there's a `reader`\nprocess that is connected to a file or standard input, to read a character you need to send it a message asking for\nthe next character and get an answer with the character back.\nSince [everything] is immutable, the only way to preserve a state is by playing [hot potato] and [passing it along]\nto other functions. The environments in Schemero are servers that keep the saved objects and support the `find`\n(return the value of) and `store` (save) requests.\n\n## Limitations\n\nThe biggest limitation of this implementation is the lack of garbage collector for the environments. Some functions\nin Scheme (`lambda`, `let`, `let*`, etc) create closures, in Schemero this means spawning new `envir` servers. Those\nservers need to be kept alive as long as they are referenced by anything returned by the functions. With a garbage\ncollector, the servers would be terminated as soon as they are not needed, but it is not implemented.\n\n\n [Erlang]: https://www.erlang.org/\n [everything]: https://learnyousomeerlang.com/starting-out-for-real#invariable-variables\n [hot potato]: https://en.wikipedia.org/wiki/Hot_potato\n [passing it along]: https://learnyousomeerlang.com/more-on-multiprocessing#state-your-state\n [message passing]: https://www.erlang.org/blog/message-passing/\n [OTP]: https://www.oreilly.com/library/view/designing-for-scalability/9781449361556/ch04.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwolodzko%2Fschemero","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwolodzko%2Fschemero","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwolodzko%2Fschemero/lists"}