shithub: martian9

ref: 2b66d7d69e8f6da6f2f211c7fd3636b586588053
dir: /notes.org/

View raw version
* First things:
** DONE Remove kw_macro
We determine what's a macro based on "syntax-rules" (so we need to make sure that's always there)
** DONE (let) doesn't work at all
** Should (let) include an implicit (begin)?
s9fes seems to do it
** TODO need an "unspecified" type?
** TODO (display) should return unspecified
** TODO implement (pair)
Pairs should be preserved, I think
Also, it should _only_ be pairs, nothing more.
** PROGRESSING (define) needs to support function definitions
Right now you need to use lambda
** DONE (cons) doesn't work
This appears to work, now, but not with a pair
* Read
** macro "transformers" should be "clauses"
Which themselves consist of "pattern" -> "template"
** DONE "quote" and "quasiquote" symbols not supported
The shortcuts work, but not the keywords
** TODO switch "define-syntax" to "let-syntax" format
I think 'let-syntax' is the better building block
* Eval
* Print
* Things to watch for
** fold-case directives (2.1)
They affect the port for all remaining activity on that port.
** bar identifiers (2.2)
How do they work? |some id|?
** yet another comment? (2.2)
How to handle #;
* Macro expansion
** Workflow
- Take pattern
- substitute args for non-literals (in order)
- compare result with ast - if it's a match, return a lamba with the matching args and the transformer
...but what about ellipsis??
** Thoughts
Eval seems too late to handle it, so maybe try to do expansion at read?

So, at read, do an expansion and store the macro variants with unique names
* Macros
** and
(define-syntax and (syntax-rules ()
  ((and) #t)
  ((and test) test) ((and test1 test2 ...)
    (if test1 (and test2 ...) #f))))