<commit_before>Low-level Cene tasks, in roughly the order of the Sphinx documentation table of contents:


Add a `follow-heart` operation, and implement `err` in terms of it. More details about this are already described in a TODO.
Rename `make-tuple-tag` to `make-struct-tag`, have it take a table instead of a list, and perhaps just make it a constructor instead of a function.
Rename `def-type` to `def-struct`.
Change the definition namespace layout so it doesn't use strings, but instead uses built-in names. Sure, the names are accessed by calling functions that have their own string names, but another API (e.g. in another language) may expose the same names by way of differently named functions.
Consider changing `contributing-only-to` to accept a collection (e.g. a table) of namespaces-with-holes-in-them, rather than a single namespace.

In the following, "identifier" means any valid dexable. Each operation validates the identifiers it receives to be sure they're valid dexables.

Update the various built-in macros that accept names of the form `(istring-nil <string>)` or `(foreign <name>)` to also accept `(foreign <identifier>)`. Consider discontinuing support for `(foreign <name>)`.

Implement a non-macro version of `case`: Given a constructor tag, a one-to-one table from projection names to valid identifiers, a "then" compiled expression, and an "else" compiled expression, obtain another compiled expression with all the free identifiers of "else" and all but the given identifiers out of the free identifiers of "then."
Implement a non-macro version of `def-type` construction: Given a constructor tag and an ordered association list from mutually unique projection names to compiled expressions, obtain another compiled expression with the union of their free identifiers.
Implement a non-macro version of `c`: Given a "func" compiled expression and an "arg" compiled expression, obtain another compiled expression with the union of their free identifiers.
Implement a non-macro version of `compile-expression` on a variable access: Given an identifier, obtain a compiled expression with just that identifier in its free identifiers.
Implement a non-second-class version of `function-implementation-opaque`: Given any value, obtain a compiled expression with no free identifiers.
Implement a non-macro version of `defn`: Given an identifier and a compiled expression with no free identifiers other than that one, obtain a "native definition" value. This value should not be directly callable (to prevent reflection at run time), but it can be installed in the namespace.
Implement a non-macro version of `let`: Given a "bindings" ordered association list from mutually unique projection names to compiled expressions, and given a "body" compiled expression, obtain another compiled expression with the union of the "bindings" free identifiers and all but the given identifiers out of the free identifiers of "body."
Specify how `fn` determines a unique constructor name, and programmatically enforce the illusion that it does work that way. Ideally, `fn` looks up a sub-namespace by a standard key from the unique namespace it's expanded in, and that namespace's name is the constructor name it uses. The standard key is consistent in every `fn` invocation, but it is not directly available to Cene progams.

Make `join-effects` into a merge, or at least a fuse. We might want it to be a fuse just because the performance of joining an effect to itself is inequal to the performance of the original effect.
Rename `assert-current-modality` to `assert-current-mode`.<commit_msg>In the roadmap, changed the meaning of "identifier" to be a singleton table instead of a dexable.<commit_after>Low-level Cene tasks, in roughly the order of the Sphinx documentation table of contents:


Add a `follow-heart` operation, and implement `err` in terms of it. More details about this are already described in a TODO.
Rename `make-tuple-tag` to `make-struct-tag`, have it take a table instead of a list, and perhaps just make it a constructor instead of a function.
Rename `def-type` to `def-struct`.
Change the definition namespace layout so it doesn't use strings, but instead uses built-in names. Sure, the names are accessed by calling functions that have their own string names, but another API (e.g. in another language) may expose the same names by way of differently named functions.
Consider changing `contributing-only-to` to accept a collection (e.g. a table) of namespaces-with-holes-in-them, rather than a single namespace.

In the following, "identifier" means a singleton table containing nil. Each operation validates the identifiers it receives to be sure it's a singleton and contains `(nil)`.

Change `table-get` to take an identifier instead of a dexable key.

Update the various built-in macros that accept names of the form `(istring-nil <string>)` or `(foreign <name>)` to also accept `(foreign <identifier>)`. Consider discontinuing support for `(foreign <name>)`.

Implement a non-macro version of `case`: Given a constructor tag, a "subject" compiled expression, a one-to-one table from projection names to valid identifiers, a "then" compiled expression, and an "else" compiled expression, obtain another compiled expression with all the free identifiers of "subject" and "else" and all but the given identifiers out of the free identifiers of "then."
Implement a non-macro version of `def-type` construction: Given a constructor tag and an ordered association list from mutually unique projection names to compiled expressions, obtain another compiled expression with the union of their free identifiers.
Implement a non-macro version of `c`: Given a "func" compiled expression and an "arg" compiled expression, obtain another compiled expression with the union of their free identifiers.
Implement a non-macro version of `compile-expression` on a variable access: Given an identifier, obtain a compiled expression with just that identifier in its free identifiers.
Implement a non-second-class version of `function-implementation-opaque`: Given any value, obtain a compiled expression with no free identifiers.
Implement a non-macro version of `defn`: Given an identifier and a compiled expression with no free identifiers other than that one, obtain a "native definition" value. This value should not be directly callable (to prevent reflection at run time), but it can be installed in the namespace.
Implement a non-macro version of `let`: Given a "bindings" ordered association list from mutually unique projection names to compiled expressions, and given a "body" compiled expression, obtain another compiled expression with the union of the "bindings" free identifiers and all but the given identifiers out of the free identifiers of "body."
Specify how `fn` determines a unique constructor name, and programmatically enforce the illusion that it does work that way. Ideally, `fn` looks up a sub-namespace by a standard key from the unique namespace it's expanded in, and that namespace's name is the constructor name it uses. The standard key is consistent in every `fn` invocation, but it is not directly available to Cene progams.

Make `join-effects` into a merge, or at least a fuse. We might want it to be a fuse just because the performance of joining an effect to itself is inequal to the performance of the original effect.
Rename `assert-current-modality` to `assert-current-mode`.
{'fraction_non_alphanumeric': 0.056309635801639564, 'fraction_numerical': 0.0, 'mean_word_length': 4.939345570630487, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6841121', 'n_tokens_mistral': 1777, 'n_tokens_neox': 1689, 'n_words': 1105}