From 1648a04cc0e92c0583c9d283ed6b6108120f820f Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Thu, 6 May 2021 17:29:51 -0700 Subject: [PATCH] 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 --- shell/evaluate.mu | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/shell/evaluate.mu b/shell/evaluate.mu index 0763dd07..1bccfbfe 100644 --- a/shell/evaluate.mu +++ b/shell/evaluate.mu @@ -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