Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I went through several iterations on the internal representation. It felt correct once the serialized
form
of a polymorphic schema was human readable and ergonomic (doesn't require quoting to evaluate correctly, so no symbols allowed). The tradeoff is that we need to implement capture-avoiding substitution, and that's very error-prone. I tested a few cases.The identity schema's
form
is[:all [:X] [:=> [:cat :X] :X]]
. It's introduced with them/all
macro by(m/all [X] [:=> [:cat X] X])
.To instantiate it, you perform a
walk/postwalk-replace
with{:X this-to-instantiate}
.The extra
:schema
's make sure regex's don't splice. By default, variables are single schemas.This representation is delicate, but works and is serializable if a few rules are followed:
It's a leaf schema, and it's essential that its body is not manipulated by users before instantiating it.
For example, variables are renamed if they clash with any keywords in the body:
m/inst
also does renaming to avoid capture. A variable can be "captured" by any schema, not just another variable, since variables are keywords and so are schemas.The following renames to
:y0
because if it was:y
, then instantiation would destroy the body via(postwalk-replace {:y ...})
.I don't know how to generate polymorphic functions, but there's some ideas in my deterministic function PR #1042
The
mg/check
implementation is pretty simple and can be improved. It just instantiates variables to very small schemas of a single value.