| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
| |
The evaluator is currently very slow because it is substituting all free
variables at define-time. Should change to a custom weak-normal-form evaluator.
|
| | |
|
| |
|
|
|
|
| |
weak head normal form
Also evaluates identifiers when they are looked up
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The previous implementation used what amounted to dynamic binding. This
is now used for global state (for instance, what the top-level `lambda` is
bound to) only.
When a location is bound (either through a syntax or variable binder), its
lexical location is given a value that describes what the location "is".
For variable bindings it is just the special symbol 'variable, but for
syntax transformers the value in the lexical location is the syntax transformer
(in the examples case, either a syntax-rules expander or a builtin like `lambda`).
TODO: replace all instances of `empty-wrap` with an identifier that is
bound with a lexical location whose value is the empty wrap value.
|
| | |
|
| | |
|
| |
|
|
|
|
| |
A lot of multisyntax was written to use `unwrap-syntax` deliberately, which I
now see as a mistake. Implict unwrapping using `syntax-cxr` (and maybe variants
like `syntax-vector-ref`) is probably less error prone.
|
| |
|
|
|
|
|
|
|
|
| |
bound identifier comparators
NOTE: location comparators are a non-standard thing equivalent to a free
identifier comparator. Should replace later.
The previous code would fail when attempting to process identifiers that
came from the output of a macro transformer, because those are marked.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
| |
`(... <template>)` in R6RS+ will escape a single form of ellipses in
the production. I personally do not recommend this: overriding the
ellipsis with a new identifier is the better approach in all circumstances.
|
| |
|
|
|
|
|
|
|
|
| |
Adopts behavior such that
x ... ... => {append ((x ...) ...}
x ... ... ... => {append {append (((x ...) ...) ...)}}
where `{append ...}` occurs at the meta-level after expanding the
patterns. (In the code this is done with an accumulator.)
|
| |
|
|
|
|
|
| |
Previous PNL calculations calculated the PNL against the entire
pattern. This is not useful, because the PNL at each ellipsis pattern
is what is useful. This is also nice because it does not require a
parameter: the PNL can always be calculated locally.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
| |
The compiler now returns a DAG implemented as a hash table. The keys
are ellipsis group IDs and the values are lists of ellipsis group IDS.
When a producer encounters a repeated form, it uses the information in
this DAG to confirm that the production is valid.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add precise definitions, with examples, for concepts like the ellipsis
nesting level. This should clarify what the matcher is doing. They
should apply to any implementation of the Macrological Fascicle's
description of patterns.
This also adds ellipsis grouping. This is used to determine which
identifiers are allowed to be repeated with each other in output.
TODO: The concept of group needs to encompass nested identifiers.
For instance
(let-values (((name ...) value) ...) body ...)
does not allow
((name ...) body ...)
but the current system does not handle this.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Expander now uses dynamically scoped variables. The old lexical scope
variable implementation was getting to four nested lambdas, which was
unreadable.
The dynamic variables are clearly labeled and segregated from the rest
of the code. The actual compiler interacts with the dynamic variables
through an API.
The previous compiler did not handle empty ellipses match properly.
This has some more work to fix that.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|