{"id":16419681,"url":"https://github.com/nshafer/elispir","last_synced_at":"2026-05-12T20:35:21.407Z","repository":{"id":67278529,"uuid":"43166309","full_name":"nshafer/Elispir","owner":"nshafer","description":"Lisp-like run-time in Elixir","archived":false,"fork":false,"pushed_at":"2015-09-25T19:20:53.000Z","size":140,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-06T21:49:01.375Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Elixir","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/nshafer.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":"2015-09-25T17:57:09.000Z","updated_at":"2021-12-11T11:12:14.000Z","dependencies_parsed_at":"2023-03-13T20:28:56.595Z","dependency_job_id":null,"html_url":"https://github.com/nshafer/Elispir","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/nshafer%2FElispir","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nshafer%2FElispir/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nshafer%2FElispir/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nshafer%2FElispir/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nshafer","download_url":"https://codeload.github.com/nshafer/Elispir/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240491610,"owners_count":19809977,"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-11T07:25:35.093Z","updated_at":"2026-05-12T20:35:16.379Z","avatar_url":"https://github.com/nshafer.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"Elispir\n=======\n\nLisp-like parser/evaluator in Elixir.  Supports variables, conditionals, functions, closures, recursion.\n\nInspired by [this blog post](http://itsbarakyo.com/projects/2015/09/17/elisper-lisp-in-elixir.html) by barakyo\n\n### Anonymous functions\n\n    iex\u003e sum = fn (a, b) -\u003e a + b end\n    #Function\u003c12.54118792/2 in :erl_eval.expr/5\u003e\n    iex\u003e Elispir.eval([sum, 1, 2])\n    3\n\n\n### Function capture\n\nUse any function available with Elixir's capture operator `\u0026`\n\n    iex\u003e Elispir.eval([\u0026+/2, 1, 1])\n    2\n\n    iex\u003e Elispir.eval([\u0026+/2, [\u0026+/2, 2, 2], [\u0026+/2, 2, 3]])\n    9\n\n## Do clauses\n\nEvaluate multiple expressions with a `:do` clause.  The value of the last expression is returned\n\n    iex\u003e Elispir.eval([:do, [\u0026IO.puts/1, \"Hello\"], [\u0026IO.puts/1, \"World\"]])\n    Hello\n    World\n    :ok\n\n### If statements\n\n    iex\u003e Elispir.eval([:if, [\u0026==/2, 1, 1], [\u0026+/2, 1, 1], [\u0026+/2, 2, 2]])\n    2\n\n### Define variables inside a `:do` block\n\n    iex\u003e Elispir.eval([:do, [:def, :a, 5]])\n    5\n\n    iex\u003e Elispir.eval([:do,\n    ...\u003e   [:def, :a, 5],\n    ...\u003e   [\u0026+/2, :a, :a]\n    ...\u003e ])\n    10\n\n### Define a named function\n\n    iex\u003e Elispir.eval(\n    ...\u003e   [:do,\n    ...\u003e     [:def, :square,\n    ...\u003e       [:fn, [:x],\n    ...\u003e         [\u0026*/2, :x, :x]\n    ...\u003e       ]\n    ...\u003e     ]\n    ...\u003e   ]\n    ...\u003e )\n    \"\u0026:square/1\"\n\n### Call the function (within the same `:do` block)\n\n    iex\u003e Elispir.eval(\n    ...\u003e   [:do,\n    ...\u003e     [:def, :square,\n    ...\u003e       [:fn, [:x], [\u0026*/2, :x, :x]]\n    ...\u003e     ],\n    ...\u003e     [:square, 5],\n    ...\u003e   ]\n    ...\u003e )\n    25\n\n### The value of variables is captured at the time that the function is defined (closures)\n\n    iex\u003e Elispir.eval(\n    ...\u003e   [:do,\n    ...\u003e     [:def, :outside, 2],\n    ...\u003e     [:def, :square,\n    ...\u003e       [:fn, [], [\u0026*/2, :outside, :outside]]\n    ...\u003e     ],\n    ...\u003e     [:def, :outside, 3],\n    ...\u003e     [:square]\n    ...\u003e   ]\n    ...\u003e )\n    4\n\n\n### Call a function recursively\n\n    iex\u003e Elispir.eval(\n    ...\u003e   [:do,\n    ...\u003e     [:def, :factorial,\n    ...\u003e       [:fn, [:n], \n    ...\u003e         [:if, [\u0026==/2, :n, 0],\n    ...\u003e           1,\n    ...\u003e           [\u0026*/2, :n, [:factorial, [\u0026-/2, :n, 1]]]\n    ...\u003e         ]\n    ...\u003e       ]\n    ...\u003e     ],\n    ...\u003e     [:factorial, 4]\n    ...\u003e   ]\n    ...\u003e )\n    24\n\n\nSee [tests](test/elispir_test.exs) for more examples.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnshafer%2Felispir","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnshafer%2Felispir","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnshafer%2Felispir/lists"}