{"id":16411134,"url":"https://github.com/phoe/in-nomine","last_synced_at":"2026-03-05T14:05:13.804Z","repository":{"id":111724214,"uuid":"453363928","full_name":"phoe/in-nomine","owner":"phoe","description":"Utility for creating, accessing, and managing custom namespaces in Common Lisp.","archived":false,"fork":false,"pushed_at":"2023-11-26T08:08:42.000Z","size":147,"stargazers_count":15,"open_issues_count":6,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-24T04:27:04.404Z","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":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phoe.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,"governance":null}},"created_at":"2022-01-29T10:21:22.000Z","updated_at":"2024-10-29T17:37:59.000Z","dependencies_parsed_at":"2023-11-26T09:21:52.898Z","dependency_job_id":null,"html_url":"https://github.com/phoe/in-nomine","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/phoe/in-nomine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phoe%2Fin-nomine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phoe%2Fin-nomine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phoe%2Fin-nomine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phoe%2Fin-nomine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phoe","download_url":"https://codeload.github.com/phoe/in-nomine/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phoe%2Fin-nomine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30130032,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T12:40:50.676Z","status":"ssl_error","status_checked_at":"2026-03-05T12:39:32.209Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":"2024-10-11T06:44:37.212Z","updated_at":"2026-03-05T14:05:13.792Z","avatar_url":"https://github.com/phoe.png","language":"Common Lisp","funding_links":[],"categories":[],"sub_categories":[],"readme":"## In Nomine\n\n\u003e The beginning of wisdom is to call things by their proper name.\n\u003e \n\u003e -- Confucius\n\nThis is a utility for creating, accessing, and managing custom namespaces in Common Lisp. Originally started as a fork of [`LISP-NAMESPACE`](https://github.com/guicho271828/lisp-namespace), it became its own piece of software that is *somewhat* backwards compatible with it.\n\n## Syntax differences from `LISP-NAMESPACE`\n\n* Removed macros `NAMESPACE-LET` and `NSLET`,\n* Removed the `DEFINE-NAMESPACE` option to automatically generate `NAMESPACE-LET`-based binding macros,\n* Added boundp and makunbound functions for namespace names,\n* Moved hash tables for bindings and documentation from being implicitly created as variables to slots of the namespaces objects themselves (unless requested otherwise),\n* Added long form of `DEFINE-NAMESPACE` to customize behavior of generated namespaces,\n* Exported namespace objects and their readers.\n\n## Manual\n\nA namespace is a second-class concept in Common Lisp and refers to concept that allows to associate names of some sort with objects of some sort.\n\nCommon Lisp has a lot of namespaces whose keys can come in various shapes:\n\n* interned symbols (package-and-string tuples),\n* variables and symbol macros (symbols),\n* functions and macros (symbols),\n* compiler macros (symbols),\n* `SETF` expansions (Lisp forms),\n* classes, conditions, and types (symbols),\n* slot names (symbols),\n* method combinations (symbols),\n* block names (symbols),\n* tagbody tags (symbols and integers),\n* declarations (symbols),\n* lambda list keywords (symbols),\n* catch tags (any Lisp objects),\n* restarts (symbols),\n* packages (strings),\n* modules (strings),\n* logical pathname hosts (strings),\n* reader macros (characters),\n* character codes (characters),\n* character names (strings),\n* characters *(only true on some implementations)* (integers),\n* ...\n* ASDF systems (lowercase strings),\n* ... (people can make new ones!)\n\nThis system is a utility to bring a first-class implementation of the concept of namespaces along with utilities to customize and manage them.\n\nThe heart of the facility is the `DEFINE-NAMESPACE` macro, which comes in two forms: short (syntax-compatible with [`LISP-NAMESPACE:DEFINE-NAMESPACE`](https://github.com/guicho271828/lisp-namespace) and with mostly compatible effects) and long form (allowing for greater behavior customization).\n\n`DEFINE-NAMESPACE`, by default, generates functions for accessing the namespace, a condition signaled whenever an access to an unbound name is attempted, a type which denotes the values permissible in a namespace, and documentation types.\n\nBy default, names are symbols and compared via `EQ`. This behavior is consistent with the way Common Lisp names variables and classes.\n\n```lisp\nIN-NOMINE\u003e (define-namespace thing)\n#\u003cNAMESPACE THING (0 bindings)\u003e\n\nIN-NOMINE\u003e (setf (symbol-thing 'foo) 42\n                 (symbol-thing 'bar) :keyword \n                 (symbol-thing 'baz) *readtable*)\n#\u003cREADTABLE {1000022CA3}\u003e\n\nIN-NOMINE\u003e (mapcar #'symbol-thing '(foo bar baz))\n(42 :KEYWORD #\u003cREADTABLE {1000022CA3}\u003e)\n```\n\nIt is possible to customize this behavior, though, and get e.g. a namespace in which names are non-negative numbers.\n\n```lisp\nIN-NOMINE\u003e (define-namespace player\n             ;; Use numbers as hash table keys\n             :name-type unsigned-byte\n             ;; Numbers are EQL-comparable\n             :hash-table-test eql\n             :accessor player-no)\n#\u003cNAMESPACE PLAYER (0 bindings)\u003e\n\nIN-NOMINE\u003e (setf (player-no 8) :jerry \n                 (player-no 0) :thomas \n                 (player-no 2) :michael)\n:MICHAEL\n\nIN-NOMINE\u003e (player-no 8)\n:JERRY\n\nIN-NOMINE\u003e (player-no 1)\n;; Error: Name 1 is unbound in namespace PLAYER.\n;;     [Condition of type UNBOUND-PLAYER]\n```\n\nIt is possible to utilize different name types along with all four standard hash table keys and produce namespaces with different possible name values. Examples:\n* `EQ` for symbols,\n* `EQL` for numbers and characters,\n* `EQUAL` for strings or lists,\n* `EQUALP` for strings without case sensitivity.\n\nIt is possible to define a definer macro for the namespace.\n\n```lisp\nIN-NOMINE\u003e (define-namespace game\n             :definer-name defgame\n             :definer cons)\n#\u003cNAMESPACE GAME (0 bindings)\u003e\n\nIN-NOMINE\u003e (defgame some-game 8 3)\n(8 . 3)\n\nIN-NOMINE\u003e (symbol-game 'some-game)\n(8 . 3)\n```\n\nIn Nomine by default provides documentation types with the same names as namespace names.\n\n```lisp\nIN-NOMINE\u003e (setf (documentation 8 'player) \"The best player ever.\")\n\"The best player ever.\"\n\nIN-NOMINE\u003e (documentation 8 'player)\n\"The best player ever.\"\n```\n\nIn addition, In Nomine hooks into implementation-defined `CL:DESCRIBE` in order to provide information about namespace bindings.\n\n```lisp\nIN-NOMINE\u003e (describe 'foo)\nIN-NOMINE::FOO\n  [symbol]\n\nSymbol FOO is bound in namespace THING:\n  Value: 42\n  (undocumented)\n; No value\n\nIN-NOMINE\u003e (describe 8)\n8\n  [fixnum]\n\n8 is bound in namespace PLAYER:\n  Value: :JERRY\n  Documentation:\n    The best player ever.\n; No value\n```\n\n## API\n\n### Packages\n\n#### Package `IN-NOMINE`\n\nLoaded via `(asdf:load-system :in-nomine)`.\n\nUtilities for defining additional namespaces in Common Lisp.\n\nCommon Lisp is a Lisp-N, which means that it has a different namespaces for variables, functions, types, and so on. Users can also define their own namespaces, and In Nomine is a toolkit for making that process easier.\n\n### Namespace definition and management\n\n#### Macro `DEFINE-NAMESPACE`\n\nDefines a new namespace object in the global namespace namespace along with\na series of functions, types, conditions, and type proclamations for accessing\nthis namespace.\n\nTwo forms of this macro are provided:\n* short form:\n  * `(DEFINE-NAMESPACE NAME \u0026OPTIONAL VALUE-TYPE BINDING DOCUMENTATION)`\n    * `NAME` - a symbol naming the namespace,\n    * `VALUE-TYPE` - a type specifier for values bound in this namespace,\n    * `BINDING` - deprecated, only present for syntax compatibility with [`LISP-NAMESPACE`](https://github.com/guicho271828/lisp-namespace); must be `NIL` when provided,\n    * `DOCUMENTATION` - documentation string for the namespace object.\n  * For name `FOO`, the following are generated:\n    * Accessor functions `SYMBOL-FOO` and `(SETF SYMBOL-FOO)`,\n    * Makunbound function `FOO-MAKUNBOUND`,\n    * Boundp function `FOO-BOUNDP`,\n    * Type proclamations for the four functions above,\n    * Condition type `UNBOUND-FOO`,\n    * Type `FOO-TYPE` denoting the specified `VALUE-TYPE`,\n    * Documentation methods with documentation type specialized on `(EQL 'FOO)`.\n* long form:\n  * `(DEFINE-NAMESPACE NAME \u0026KEY NAME-TYPE VALUE-TYPE ACCESSOR CONDITION-NAME TYPE-NAME MAKUNBOUND-SYMBOL BOUNDP-SYMBOL DOCUMENTATION-TYPE ERROR-WHEN-NOT-FOUND-P ERRORP-ARG-IN-ACCESSOR-P DEFAULT-ARG-IN-ACCESSOR-P HASH-TABLE-TEST BINDING-TABLE-VAR DOCUMENTATION-TABLE-VAR DOCUMENTATION DEFINER-NAME DEFINER)`\n    * `NAME` - a symbol naming the namespace,\n    * `NAME-TYPE` - a type specifiers for keys bound in this namespace,\n    * `VALUE-TYPE` - a type specifier for values bound in this namespace,\n    * `ACCESSOR` - a symbol naming the accessor functions, or `NIL` if no such accessor should be defined,\n    * `CONDITION-NAME` - a symbol naming the condition type signaled when an attempt is made to access an unbound name, or `NIL` if no such accessor should be defined,\n    * `TYPE-NAME` - a symbol naming the type for the namespace values, or `NIL` if no such type should be defined,\n    * `MAKUNBOUND-SYMBOL` - symbol naming the namespace makunbound function, or `NIL` if no such function should be defined,\n    * `BOUNDP-SYMBOL` - a symbol naming the namespace boundp function, or `NIL` if no such function should be defined,\n    * `DOCUMENTATION-TYPE` - a symbol naming the documentation type for the namespace values, or `NIL` if no such documentation should be defined,\n    * `ERROR-WHEN-NOT-FOUND-P` - a boolean stating whether a reader function should signal an error if it attempts to access an unbound name,\n    * `ERRORP-ARG-IN-ACCESSOR-P` - a boolean stating whether accessor functions should have an optional `ERRORP` argument for stating whether an unbound condition should be signaled when an attempt is made to access an unbound name,\n    * `DEFAULT-ARG-IN-ACCESSOR-P` - a boolean stating whether accessor functions should have an optional `DEFAULT` argument for automatic setting of unbound values,\n    * `HASH-TABLE-TEST` - a symbol naming the hash table test of the binding and documentation hash tables of the namespace,\n    * `BINDING-TABLE-VAR` - a symbol naming the variable whose value shall be the binding table of the namespace, or `NIL` if no such variable should be defined,\n    * `DOCUMENTATION-TABLE-VAR` - a symbol naming the variable whose value shall be the documentation table of the namespace, or `NIL` if no such variable should be defined,\n    * `DOCUMENTATION` - documentation string for the namespace object.\n    * `DEFINER-NAME` - name of the definer for a definition in the namespace; defaults to `DEFINE-[NAME]` if a definer is to be defined\n    * `DEFINER` - can have one of several forms, defines a macro with name `[DEFINER-NAME]` whose lambda list always starts with a gensymed argument `BINDING-NAME` for the name of the defined binding\n      * `NIL` - if no `DEFINER-NAME` is given, don't define a definer, otherwise define a standard definer with argument list `BINDING-NAME OBJECT` that binds `BINDING-NAME` to the result of evaluating `OBJECT`\n      * `T` - like `NIL`, but also defines a definer if `DEFINER-NAME` has not been supplied\n      * `[FUNCTION]`, `'[FUNCTION]`, `#'[FUNCTION]` - define a definer with argument-list `BINDING-NAME [LAMBDA-LIST-OF-FUNCTION]`, which binds `BINDING-NAME` to the result of calling `[FUNCTION]` on the rest of the arguments\n      * `(LAMBDA (ARGS) BODY*)` - same as with named functions, but with the given anonymous function\n      * `(LAMBDA-LIST BODY*)` - the lambda list can be a generalized lambda list; body should evaluate to the code executed to produce the object to bind `BINDING-NAME` to\n\nThe consequences are undefined if a namespace is redefined in an incompatible\nway with the previous one.\n\n#### Function `SYMBOL-NAMESPACE`\n\nReturns a namespace object with the given global name. Signals `UNBOUND-NAMESPACE` unless `ERRORP` is set.\n\n#### Function `CLEAR-NAMESPACE`\n\nRemoves all bindings in the namespace with the given name.\n\n#### Function `NAMESPACE-MAKUNBOUND`\n\nMakes the name globally unbound as a namespace regardless of whether the name was previously bound.\n\n#### Function `NAMESPACE-BOUNDP`\n\nReturns true if a namespace object with the provided name is globally bound, false otherwise.\n\n#### Condition Type `UNBOUND-NAMESPACE`\n\nA subtype of `CELL-ERROR` signaled when there is an attempt to access a namespace object that does not exist.\n\n### Namespace class and accessors\n\n#### Class `NAMESPACE`\n\nA class of namespace objects which represent a Common Lisp namespace.\n\n#### Function `NAMESPACE-NAME`\n\nReturns the symbol naming a namespace.\n\n#### Function `NAMESPACE-NAME-TYPE`\n\nReturns the type of names that are possible to bind in a namespace.\n\n#### Function `NAMESPACE-VALUE-TYPE`\n\nReturns the type of values that are possible to bind in a namespace.\n\n#### Function `NAMESPACE-ACCESSOR`\n\nReturns the symbol naming the namespace accessor, or `NIL` if no such accessor is defined.\n\n#### Function `NAMESPACE-CONDITION-NAME`\n\nReturns the symbol naming the condition type signaled when an attempt is made to access an unbound name, or `NIL` if no such condition type is defined\n\n#### Function `NAMESPACE-TYPE-NAME`\nReturns the symbol naming the type for the namespace values, or `NIL` if no such type is defined.\n\n#### Function `NAMESPACE-MAKUNBOUND-SYMBOL`\nReturns the symbol naming the namespace makunbound function, or `NIL` if no such function exists.\n\n#### Function `NAMESPACE-BOUNDP-SYMBOL`\nReturns the symbol naming the namespace boundp function, or `NIL` if no such function exists.\n\n#### Function `NAMESPACE-DOCUMENTATION-TYPE`\n\nReturns the symbol naming the documentation type for the namespace values, or `NIL` if no such documentation type exists.\n\n#### Function `NAMESPACE-ERROR-WHEN-NOT-FOUND-P`\n\nReturns a boolean stating whether a reader function should signal an error if it attempts to access an unbound name.\n\n#### Function `NAMESPACE-ERRORP-ARG-IN-ACCESSOR-P`\n\nReturns a boolean stating whether accessor functions should have an optional `ERRORP` argument for stating whether an unbound condition should be signaled when an attempt is made to access an unbound name.\n\n#### Function `NAMESPACE-DEFAULT-ARG-IN-ACCESSOR-P`\n\nReturns a boolean stating whether accessor functions should have an optional `DEFAULT` argument for automatic setting of unbound values.\n\n#### Function `NAMESPACE-HASH-TABLE-TEST`\n\nReturns the symbol naming the hash table test of the binding and documentation hash tables of the namespace.\n\n#### Function `NAMESPACE-BINDING-TABLE`\n\nReturns the binding hash table, or `NIL` if `BINDING-TABLE-VAR` is defined or no binding mechanism is defined.\n\n#### Function `NAMESPACE-DOCUMENTATION-TABLE`\n\nReturns the documentation hash table, or `NIL` if no documentation type is defined.\n\n#### Function `NAMESPACE-BINDING-TABLE-VAR`\n\nReturns the symbol naming the variable whose value is the binding table of the namespace, or `NIL` if no such variable is defined. Changing the value or dynamically binding this variable will affect the global environment of the namespace.\n\n#### Function `NAMESPACE-DOCUMENTATION-TABLE-VAR`\n\nReturns the symbol naming the variable whose value is the documentation table of the namespace, or `NIL` if no such variable is defined.\n\n### Namespaces\n\n#### Namespace `NAMESPACE`\n\nA namespace for managing namespaces.\n\n## License\n\n* Copyright (c) 2015 [Masataro Asai](guicho2.71828@gmail.com)\n* Copyright (c) 2022 [Michał \"phoe\" Herda](phoe@disroot.org)\n\nLicensed under the LLGPL License.\n\n\u003e A man that should call everything by its right name, would hardly pass the streets without being knocked down as a common enemy.\n\u003e\n\u003e -- Lord Halifax\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphoe%2Fin-nomine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphoe%2Fin-nomine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphoe%2Fin-nomine/lists"}