{"id":25195873,"url":"https://github.com/s-expressionists/extrinsicl","last_synced_at":"2026-02-15T01:06:11.199Z","repository":{"id":201025292,"uuid":"706475334","full_name":"s-expressionists/Extrinsicl","owner":"s-expressionists","description":"Extrinsic Common Lisp environment","archived":false,"fork":false,"pushed_at":"2025-12-10T19:14:17.000Z","size":169,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-12-11T06:26:54.447Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Common Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/s-expressionists.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-10-18T03:00:41.000Z","updated_at":"2025-07-23T17:25:52.000Z","dependencies_parsed_at":"2025-07-22T18:22:57.017Z","dependency_job_id":null,"html_url":"https://github.com/s-expressionists/Extrinsicl","commit_stats":null,"previous_names":["s-expressionists/extrinsicl"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/s-expressionists/Extrinsicl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s-expressionists%2FExtrinsicl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s-expressionists%2FExtrinsicl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s-expressionists%2FExtrinsicl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s-expressionists%2FExtrinsicl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/s-expressionists","download_url":"https://codeload.github.com/s-expressionists/Extrinsicl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s-expressionists%2FExtrinsicl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29463621,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T01:01:38.065Z","status":"ssl_error","status_checked_at":"2026-02-15T01:01:23.809Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2025-02-10T01:38:58.530Z","updated_at":"2026-02-15T01:06:11.183Z","avatar_url":"https://github.com/s-expressionists.png","language":"Common Lisp","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Overview\n\nThis system defines functions, variables, packages, and classes to fill a [Clostrum](https://github.com/s-expressionists/Clostrum) environment with a mostly complete Common Lisp. The contents of this environment refer to this environment properly rather than the host Lisp's environment, so for example `(funcall 'foo ...)` will look up FOO in the Clostrum environment and not the host. This kind of \"extrinsic\" environment is useful for cross-compilation type operations and may be useful for sandboxing.\n\n# Use\n\nLoad the `extrinsicl` ASDF system. `(extrinsicl:install-cl client environment compilation-environment)` installs CL into the given Clostrum environment, using the given client. This is the main entry point. The compilation environment is optional, but required to install `cl:proclaim`.\n\nThere is also `(extrinsicl:install-compilation-cl client environment)` to fill up a compilation environment rather than a runtime environment.\n\nThe `extrinsicl/maclina` subsystem can optionally be loaded. This provides `(extrinsicl:install-eval client environment compilation-environment)` which defines `cl:eval`, etc. This subsystem is optional because you may want to use Extrinsicl with some other evaluator.\n\nIf anything Extrinsicl installs doesn't work for your purposes, you can of course swap out function definitions etc. out of the resulting environment. Extrinsicl does not impose any kind of package locks.\n\n## Dependencies\n\nBesides [Trucler](https://github.com/s-expressionists/Trucler/), [Closer to MOP](https://github.com/pcostanza/closer-mop), and [Khazern (extrinsic)](https://github.com/s-expressionists/Khazern) which are all in Quicklisp, Extrinsicl has a few dependencies you'll have to clone yourself. These are:\n\n* [Clostrum](https://github.com/s-expressionists/Clostrum) for global environment access.\n* [Common Macro Definitions](https://github.com/robert-strandh/Common-macros/) for many macros.\n* [Invistra (extrinsic)](https://github.com/s-expressionists/Invistra/) for `format`. Invistra additionally depends on [Inravina](https://github.com/s-expressionists/Inravina), which itself depends on [Incless](https://github.com/s-expressionists/Incless) and [nontrivial-gray-streams](https://github.com/yitzchak/nontrivial-gray-streams).\n* The optional `extrinsicl/maclina` system depends on [Maclina](https://github.com/s-expressionists/maclina).\n\n# Ethos\n\nWherever possible, the host Lisp and host objects are used. This system therefore does not reimplement CL as a whole, though a few parts do necessitate some reimplementation.\n\nMacros are defined only if they expand into entirely standard code. This is so that code compiled in an Extrinsicl environment can be loaded in any standard environment.\n\n# Limitations and quirks\n\nThe following functions are missing:\n\n* `load`, `compile-file`, `compile-file-pathname`, `symbol-value`, `boundp`, `set`, `disassemble`, `eval`, `compile`, `makunbound`: These are part of the evaluator and you are expected to know what you want to define here. As mentioned above, you can load `extrinsicl/maclina` which can install definitions for all of these except `load`.\n* `ed`, `require`: These have implementation defined behavior.\n* `documentation`: There is no reasonable way to use the host `documentation`, so it would require reimplementation.\n* `apropos`, `apropos-list`, `inspect`: These use the environment heavily and are supposed to be at best marginally useful for uses of Extrinsicl.\n* `make-synonym-stream`: Synonym streams store a symbol and get its value from the host environment. Extrinsicl would have to implement its own stream class to implement this.\n* `make-package`: Lisp packages cannot be anonymous, so Extrinsicl can't make packages that are anonymous in the host environment but available in its environment.\n\nThe following macros are missing:\n\n* `untrace`, `trace`, `with-hash-table-iterator`, `time`, `step`, `with-package-iterator`: These operators necessarily must expand into implementation defined code (or into nothing useful).\n* `pprint-logical-block` and local macros: Cannot be defined without totally reimplementing the pretty printer, which would in turn make it impossible to use host streams. Might be done in the future with Gray streams.\n* `formatter`: Can't reasonably be implemented without expanding into implementation defined code.\n* `with-standard-io-syntax`: Needs a standard pprint dispatch table which there is no standard way to get.\n* `handler-bind`, `assert`, `restart-bind`, `with-condition-restarts`: See \"Condition System\" below.\n* `define-symbol-macro`, `defconstant`, `define-method-combination`, `define-modify-macro`, `defstruct`, `print-unreadable-object`, `with-output-to-string`: TODO, possibly.\n\nThe following constants are missing:\n\n* `call-arguments-limit`, `lambda-list-keywords`, `lambda-parameters-limit`, `multiple-values-limit`: These are determined by the evaluator. `extrinsicl/maclina` does define them appropriately.\n\n## Defining Macros\n\nMost of the defining macros (e.g. `defun`) are imported from [Common Macros](https://github.com/robert-strandh/Common-macros/). Common Macros defines a few interface functions that are helpful or required for using them. Presently the required ones are:\n\n* `wrap-in-method-lambda`, `wrap-in-make-method-lambda`, `wrap-in-ensure-method` for `defmethod`\n* `defclass-compile-time-action`, `ensure-class-name` for `defclass`\n* `defgeneric-compile-time-action`, `ensure-generic-function` for `defgeneric`\n* `wrap-in-setf-type-function` for `deftype`\n* `wrap-in-setf-setf-expander` for `define-setf-expander`\n\n`defun-compile-time-action` can optionally be specialized to make toplevel `defun` do something in the compiler. `proclaim` can be specialized to have `declaim` expand into something other than the obvious `cl:proclaim` calls.\n\n(Also, as of this writing, the changes I've made to Common Macros to facilitate some of this haven't yet been upstreamed.)\n\n## Condition System\n\nFirst off, the Extrinsicl environment's `*break-on-signals*` will not work, at all. `*break-on-signals*` can be (indirectly) referenced by essentially any function in the standard, and using the environment's variable instead of the host's would be prohibitively complicated, especially given that `*break-on-signals*` is just a debugging tool.\n\nSecondly, there is no portable way to expand `handler-bind`, etc. It would be possible to reimplement the condition system portably, but this would entail using ersatz condition and restart objects rather than the host's, which would in turn cripple the debugging experience, etc. As a matter of pragmatism, Extrinsicl does import the condition system _functions_, e.g. `error`. These properly refer to the Extrinsicl environment as far as types go, but otherwise use the host condition system.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fs-expressionists%2Fextrinsicl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fs-expressionists%2Fextrinsicl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fs-expressionists%2Fextrinsicl/lists"}