From 938f8c023c496d60011235c2dfee23544ac4ed72 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Tue, 30 Apr 2019 22:52:12 +0100 Subject: [PATCH] bbc-basic: Define 'cond' and 'or' macros at startup, completing step 8. --- bbc-basic/step8_macros.bbc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bbc-basic/step8_macros.bbc b/bbc-basic/step8_macros.bbc index da546c44..e53a6e6b 100644 --- a/bbc-basic/step8_macros.bbc +++ b/bbc-basic/step8_macros.bbc @@ -21,6 +21,8 @@ REM Initial forms to evaluate RESTORE +0 DATA (def! not (fn* (a) (if a false true))) DATA (def! load-file (fn* (f) (eval (read-string (str "(do " (slurp f) ")"))))) +DATA (defmacro! cond (fn* (& xs) (if (> (count xs) 0) (list 'if (first xs) (if (> (count xs) 1) (nth xs 1) (throw "odd number of forms to cond")) (cons 'cond (rest (rest xs))))))) +DATA (defmacro! or (fn* (& xs) (if (empty? xs) nil (if (= 1 (count xs)) (first xs) `(let* (or_FIXME ~(first xs)) (if or_FIXME or_FIXME (or ~@(rest xs)))))))) DATA "" REPEAT READ form$