{"id":13393449,"url":"https://github.com/clojerl/clojerl","last_synced_at":"2025-10-08T15:05:36.967Z","repository":{"id":35331309,"uuid":"39593397","full_name":"clojerl/clojerl","owner":"clojerl","description":"Clojure for the Erlang VM (unofficial)","archived":false,"fork":false,"pushed_at":"2025-01-07T22:23:02.000Z","size":4767,"stargazers_count":1686,"open_issues_count":8,"forks_count":42,"subscribers_count":49,"default_branch":"master","last_synced_at":"2025-09-21T17:22:19.581Z","etag":null,"topics":["beam","clojure","erlang","erlang-vm","programming-language"],"latest_commit_sha":null,"homepage":"http://try.clojerl.io/","language":"Erlang","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/clojerl.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","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,"zenodo":null},"funding":{"buy_me_a_coffee":"jfacorro"}},"created_at":"2015-07-23T21:16:14.000Z","updated_at":"2025-09-14T17:11:04.000Z","dependencies_parsed_at":"2023-11-07T00:18:39.882Z","dependency_job_id":"dd209892-a4e8-4fd6-88fa-1c6ff0abbeee","html_url":"https://github.com/clojerl/clojerl","commit_stats":{"total_commits":1737,"total_committers":12,"mean_commits":144.75,"dds":0.5002878526194589,"last_synced_commit":"5b412b87de13811b5a6ee4d82329d6a44dc499f0"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/clojerl/clojerl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clojerl%2Fclojerl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clojerl%2Fclojerl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clojerl%2Fclojerl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clojerl%2Fclojerl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/clojerl","download_url":"https://codeload.github.com/clojerl/clojerl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clojerl%2Fclojerl/sbom","scorecard":{"id":292012,"data":{"date":"2025-08-11","repo":{"name":"github.com/clojerl/clojerl","commit":"4ad14e57df85d30cc3332308f861f4e174383483"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.9,"checks":[{"name":"Code-Review","score":1,"reason":"Found 1/8 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Eclipse Public License 1.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/clojerl/clojerl/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/clojerl/clojerl/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/clojerl/clojerl/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/clojerl/clojerl/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/clojerl/clojerl/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/clojerl/clojerl/build.yml/master?enable=pin","Warn: containerImage not pinned by hash: .gitpod.Dockerfile:1: pin your Docker image by updating erlang:24 to erlang:24@sha256:9a515b0c918e41d816b29a6afd2d6450d1b9fffad6fa6e1fe0c05e9c797fb92e","Warn: containerImage not pinned by hash: scripts/Dockerfile:1: pin your Docker image by updating erlang:22.2.3 to erlang:22.2.3@sha256:e26349d15e13e7f216c630f4ad45615c11c9358f8e024ad7975e2cc8ce02ad21","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T18:29:48.796Z","repository_id":35331309,"created_at":"2025-08-17T18:29:48.796Z","updated_at":"2025-08-17T18:29:48.796Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278963850,"owners_count":26076549,"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","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["beam","clojure","erlang","erlang-vm","programming-language"],"created_at":"2024-07-30T17:00:53.017Z","updated_at":"2025-10-08T15:05:36.933Z","avatar_url":"https://github.com/clojerl.png","language":"Erlang","funding_links":["https://buymeacoffee.com/jfacorro"],"categories":["Erlang","Languages","Clojure-likes"],"sub_categories":["Erlang","[Clojerl](https://clojerl.org/)"],"readme":"# clojerl\n\n![Build](https://github.com/clojerl/clojerl/workflows/Build/badge.svg)\n[![Hex.pm](https://img.shields.io/hexpm/v/clojerl.svg)](https://hex.pm/packages/clojerl)\n\nClojure implemented on the Erlang VM.\n\n## Building\n\nBuilding `clojerl` requires *Erlang/OTP 21+* and [*rebar3*][rebar3].\n\n    git clone https://github.com/clojerl/clojerl\n    cd clojerl\n    make\n\nOn Windows:\n\n    git clone https://github.com/clojerl/clojerl\n    cd clojerl\n    rebar3 clojerl compile\n\n## Getting Started\n\n### Documentation and Resources\n\nThere is more information regarding Clojerl in [clojerl.io][clojerl], where you\ncan find what [features][features] does Clojerl include and [how it differs from\nClojure][diff-with-clojure].\n\n### Online REPL\n\nTo try it out and get a sense of what you can do, you can visit\n[Try Clojerl][try-clojerl].\n\n## Docker REPL\n\nTo quickly try out `clojerl` via docker you can make use of the docker\nimage like so:\n\n```\ndocker pull clojerl/clojerl\ndocker run -it clojerl/clojerl\n```\n\nThen you should be able to see the prompt:\n\n```clojure\nClojure 0.6.0\nclje.user=\u003e\n```\n\n\n### Local REPL\n\nRunning `make repl` (on Windows first run `rebar3 clojerl compile` and\nthen `bin/clje.bat`) will start the REPL and show its prompt:\n\n    Clojure 0.6.0\n    clje.user=\u003e\n\nFrom the REPL it's possible to start evaluating Clojure expressions:\n\n    clje.user=\u003e (map inc (range 10))\n    (1 2 3 4 5 6 7 8 9 10)\n    clje.user=\u003e (doc map)\n    -------------------------\n    clojure.core/map\n    ([f] [f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 \u0026 colls])\n      Returns a lazy sequence consisting of the result of applying f to\n      the set of first items of each coll, followed by applying f to the\n      set of second items in each coll, until any one of the colls is\n      exhausted.  Any remaining items in other colls are ignored. Function\n      f should accept number-of-colls arguments. Returns a transducer when\n      no collection is provided.\n    nil\n    clje.user=\u003e (doc inc)\n    -------------------------\n    clojure.core/inc\n    ([x])\n      Returns a number one greater than num.\n    nil\n    clje.user=\u003e\n\n### Code Examples\n\nThere are some very basic examples in the [scripts/examples][examples]\ndirectory. These are meant to be references on how special forms in\nClojure on the BEAM are used and how they sometimes differ from Clojure\nJVM.\n\n### Web Application Example\n\nFor a very basic example of a web project please check the\n[example-web-app][example-web-app] repository.\n\n### Building Your Own App\n\nThe build tool for Clojerl is the [`rebar3_clojerl`][rebar3_clojerl]\nplugin. [`rebar3`][rebar3] is the official build tool in the Erlang\ncommunity.\n\nThe plugin provides helpful commands to:\n\n- Build a basic directory scaffolding for a new project\n- Compile\n- Run tests\n- Start a REPL\n\nFor more information on how to use this plugin please check the\ndocumentation in [`rebar3_clojerl`][rebar3_clojerl].\n\n## Rationale\n\nErlang is a great language for building safe, reliable and scalable\nsystems. It provides immutable, persistent data structures\nout of the box and its concurrency semantics are unequalled by any\nother language.\n\nClojure is a Lisp and as such comes with all the goodies Lisps\nprovide. Apart from these Clojure also introduces powerful\nabstractions such as protocols, multimethods and seqs, to name a few.\n\nClojure was built to simplify the development of concurrent programs\nand some of its concurrency abstractions could be adapted to Erlang.\nIt is fair to say that combining the power of the Erlang VM with the\nexpressiveness of Clojure could provide an interesting, useful result\nto make the lives of many programmers simpler and make the world a\nhappier place.\n\n## Goals\n\n- Interoperability as smooth as possible, just like Clojure proper and\n  ClojureScript do.\n- Provide most Clojure abstractions.\n- Provide all Erlang abstractions and toolset.\n- Include a default OTP library in Clojerl.\n\n### Personal Goal\n\nLearn more about Erlang (and its VM), Clojure and language\nimplementation.\n\nThis project is an experiment that I hope others will find useful.\nRegardless of whether it becomes a fully functional implementation of\nClojure or not, I will have learned a lot along the way.\n\n## QAs\n\n### What is Clojerl?\n\nClojerl is an experimental implementation of Clojure on the Erlang VM.\nIts goal is to leverage the features and abstractions of Clojure that\nwe love (macros, collections, seq, protocols, multimethods, metadata,\netc.), with the robustness the Erlang VM provides for building\n(distributed) systems.\n\n### Have you heard about LFE and Joxa?\n\nYes. LFE and Joxa were each created with very specific and different\ngoals in mind. LFE was born to provide a LISP syntax for Erlang. Joxa\nwas mainly created as a platform for creating DSLs that could take\nadvantage of the Erlang VM. Its syntax was inspired by Clojure but the\ncreators weren't interested in implementing all of Clojure's features.\n\n### Aren't the language constructs for concurrency very different between Clojure and Erlang?\n\nYes, they are. On one hand Clojure provides tools to handle mutable\nstate in a sane way, while making a clear distinction between identity\nand state through reference types. On the other, concurrency in the\nErlang VM is implemented through processes and message passing. The\nidea in Clojerl is to encourage the Erlang/OTP concurrency model, but\nsupport as many Clojure constructs as possible and as far as they make\nsense in the Erlang VM.\n\n### But... but... Rich Hickey lists [here](https://clojure.org/about/state#actors) some of the reasons why he chose not to use the actor model in Clojure.\n\nThat is not a question, but I see what you mean :). The points he\nmakes are of course very good. For example, when no state is shared\nbetween processes there is some communication overhead, but this\nisolation is also an advantage under a lot of circumstances. He also\nmentions\n[here](https://groups.google.com/forum/#!msg/clojure/Kisk_-9dFjE/_2WxSxyd1SoJ) that\nbuilding for the distributed case (a.k.a processes and message\npassing) is more complex and not always necessary, so he decided to\noptimise for the non-distributed case and add distribution to the\nparts of the system that need it. Rich Hickey calls Erlang \"quite\nimpressive\", so my interpretation of these writings is that they are\nmore about exposing the rationale behind the decisions and the\ntrade-offs he made when designing Clojure (on the JVM), than about\ndisregarding the actor model.\n\n### Will Clojerl support every single Clojure feature?\n\nNo. Some of Clojure's features are implemented by relying on the\nunderlying mutability of the JVM and its object system. The Erlang VM\nprovides very few mutability constructs and no support for defining\nnew types. This makes it very hard or nearly impossible to port some\nfeatures into Clojerl's implementation.\n\n### Can I reuse existing Clojure(Script) libraries?\n\nYes, but they will need to be ported, just like for ClojureScript. In\nfact, most of Clojure's core namespaces were ported from the original\n.clj files in the Clojure JVM repository.\n\n## Discussion\n\nJoin the conversation in the [Clojerl][clojerl-mailing-list] mailing\nlist or in the [`#clojerl` Slack channel][clojerl-slack]!\n\nYou can also find news and updates through [@clojerl][clojerl-twitter].\nOr if you have any questions you can find me [@jfacorro][jfacorro-twitter] or lurking\non [Clojure](https://groups.google.com/forum/?hl=en#!forum/clojure)'s\nand\n[Erlang](https://groups.google.com/forum/?hl=en#!forum/erlang-programming)'s\nmailing lists.\n\nAny feedback, comment and/or suggestion is welcome!\n\n[rebar3]: https://github.com/erlang/rebar3\n[try-clojerl]: http://try.clojerl.io/\n[examples]: scripts/examples\n[example-web-app]: https://github.com/clojerl/example-web-app/\n[rebar3_clojerl]:https://github.com/clojerl/rebar3_clojerl\n[clojerl]: http://clojerl.io/\n[features]: http://clojerl.io/available-features\n[diff-with-clojure]: http://clojerl.io/differences-with-clojure\n[clojerl-mailing-list]: https://groups.google.com/forum/#!forum/clojerl\n[clojerl-slack]: https://erlanger.slack.com\n[clojerl-twitter]: https://twitter.com/clojerl\n[jfacorro-twitter]: https://twitter.com/jfacorro\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclojerl%2Fclojerl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclojerl%2Fclojerl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclojerl%2Fclojerl/lists"}