literal macros

Current plan:
- some way to define macros. For now:
    (def f (litmac litfn () (a b) `(+ ,a , b)))
- macroexpand will expand calls by passing them through the cdr
    (f 3 4)
    macroexpand: ((litfn () (a b) `(+ ,a ,b)) 3 4)
      => (+ 3 4)
    eval: (+ 3 4) => 7
This commit is contained in:
Kartik K. Agaram 2021-05-06 17:29:51 -07:00
parent e9981404da
commit 1648a04cc0
1 changed files with 28 additions and 0 deletions

View File

@ -135,6 +135,20 @@ fn evaluate _in-ah: (addr handle cell), _out-ah: (addr handle cell), env-h: (han
trace-higher trace
return
}
$evaluate:literal-macro: {
# trees starting with "litmac" are literals
var expr/esi: (addr cell) <- copy in
var in/edx: (addr cell) <- copy in
var first-ah/ecx: (addr handle cell) <- get in, left
var first/eax: (addr cell) <- lookup *first-ah
var litmac?/eax: boolean <- litmac? first
compare litmac?, 0/false
break-if-=
trace-text trace, "eval", "literal macro"
copy-object _in-ah, _out-ah
trace-higher trace
return
}
$evaluate:anonymous-function: {
# trees starting with "fn" are anonymous functions
var expr/esi: (addr cell) <- copy in
@ -1205,6 +1219,20 @@ fn litfn? _x: (addr cell) -> _/eax: boolean {
return result
}
fn litmac? _x: (addr cell) -> _/eax: boolean {
var x/esi: (addr cell) <- copy _x
var type/eax: (addr int) <- get x, type
compare *type, 2/symbol
{
break-if-=
return 0/false
}
var contents-ah/eax: (addr handle stream byte) <- get x, text-data
var contents/eax: (addr stream byte) <- lookup *contents-ah
var result/eax: boolean <- stream-data-equal? contents, "litmac"
return result
}
fn test-evaluate-is-well-behaved {
var t-storage: trace
var t/esi: (addr trace) <- address t-storage