{"id":15482901,"url":"https://github.com/brandonbloom/eclj","last_synced_at":"2025-04-22T15:42:02.965Z","repository":{"id":14851440,"uuid":"17574590","full_name":"brandonbloom/eclj","owner":"brandonbloom","description":"Extensible Clojure","archived":false,"fork":false,"pushed_at":"2016-01-18T02:42:51.000Z","size":224,"stargazers_count":106,"open_issues_count":0,"forks_count":0,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-03-29T16:34:14.324Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"epl-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brandonbloom.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":"2014-03-09T21:52:21.000Z","updated_at":"2024-06-29T13:48:43.000Z","dependencies_parsed_at":"2022-09-23T23:50:57.695Z","dependency_job_id":null,"html_url":"https://github.com/brandonbloom/eclj","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/brandonbloom%2Feclj","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brandonbloom%2Feclj/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brandonbloom%2Feclj/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brandonbloom%2Feclj/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brandonbloom","download_url":"https://codeload.github.com/brandonbloom/eclj/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249273947,"owners_count":21242000,"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":[],"created_at":"2024-10-02T05:10:17.698Z","updated_at":"2025-04-16T20:32:06.896Z","avatar_url":"https://github.com/brandonbloom.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Extensible Clojure\n\nAn extensible, symbolic, functionally-pure Clojure interpreter.\n\nExtensible Clojure aims to completely virtualize the Clojure language, such\nthat portable Clojure code can be run within a precisely controlled\nenvironment.  Proper tail calls are supported via delimited continuations,\nwhich enables all effects to be modeled as pure data. Effects, including\nbidirectional interop, are processed at the top-level of the interpreter loop,\nso they too are fully programmable.\n\nThis project's ambitious goals are based on a vast academic foundation.  Oleg\nKiselyov's [Extensible Effects \u0026 Interpreters][1] page provides an excellent\nentry point. I'm also interested in building an evaluator that includes an\nextensible abstract interpreter and extensible JIT compiler. See [Lancet][2].\n\n\n## Status\n\nExperimental and unstable!\n\nDevelopment temporarily halted because I couldn't wrap my head around how to\nwrite a compiler for this thing. In the interim, I've developed\n[Meta-Clojure][3], which may get me over the hump.\n\n### Platform\n\nRuns on the JVM with Clojure 1.6.0.\n\nStandalone deployment and cross-compilation to alternative platforms are goals.\n\n### Evaluator\n\nThe base interpreter is written in a trampolined continuation-passing style. It\nis complete enough to be self-applicable. There is also a meta-circular\ninterpreter written in a direct style, utilizing constant space tail calls and\nthe effect system. This meta-interpreter is *highly* experimental and will form\nthe foundation of the forthcoming JIT compiler.\n\n### Libraries\n\nThe core libraries are currently a hybrid of compiled functions borrowed from\n`clojure.core` and symbolic EClj ports. Borrowed functions are actively being\nported and abstracted to facilitate partial evaluation, utilize the effect\nsystem, and ease future targeting of non-JVM platforms.\n\n### Types\n\nClojure's primary data structures (those defined in Java) are the primary data\nstructures used throughout EClj as well. Ultimately, EClj will provide\nadditional implementations of these data structures wherever possible, but\nwill maintain interop via the existing Java interfaces. The goal is for EClj\nto use the most appropriate data structures for the host.\n\nType defining forms (`reify`, `deftype`, and `defrecord`) delegate to the\nClojure compiler to create the JVM type, but methods are interpreted by EClj.\nEffects cannot (yet) propagate across JVM method call boundaries.\n\n### Not In Scope\n\n* monitor-enter\n* monitor-exit\n\n\n## Usage\n\nOnly `eclj.core` provides a stable(-ish) public API at this time. It exports\nthe same functionality as `clojure.core` with some to-be-documented extensions.\n\nYou can evaluate individual forms with `eclj.core/eval` and load `.eclj` files\nwith `eclj.core/require` or related namespace \u0026 code loading functions. EClj\ncan interop with normal Clojure code seamlessly, but `clojure.core/ns` can't\nload EClj. Of course, `eclj.core/ns` can require either file type.\n\nVarious caveats apply, but the list is too volatile to justify enumerating now.\n\n\n## License\n\nPortions of this project derived from Clojure:  \nCopyright © 2006-2014 Rich Hickey\n\nOriginal code and Clojure modifications:  \nCopyright © 2014 Brandon Bloom\n\nBoth are distributed under the Eclipse Public License either version 1.0 or\n(at your option) any later version.\n\n\n[1]: http://okmij.org/ftp/Haskell/extensible/\n[2]: https://github.com/TiarkRompf/lancet\n[3]: https://github.com/brandonbloom/metaclj\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrandonbloom%2Feclj","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrandonbloom%2Feclj","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrandonbloom%2Feclj/lists"}