From 1161556e4feab4b845f30eb81a90d8a2461f5347 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Sat, 14 Jan 2023 12:24:22 -0500 Subject: Allow + and * to be n-ary. --- chickadee/graphics/seagull.scm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/chickadee/graphics/seagull.scm b/chickadee/graphics/seagull.scm index c7f8ee9..50ac1e8 100644 --- a/chickadee/graphics/seagull.scm +++ b/chickadee/graphics/seagull.scm @@ -215,6 +215,20 @@ (define params* (lookup-all params env*)) `(lambda ,params* ,(expand body env*))) +(define (expand:+ args env) + (match args + (() 0) + ((n) (expand n env)) + ((n . rest) + `(primcall + ,(expand n env) ,(expand:+ rest env))))) + +(define (expand:* args env) + (match args + (() 1) + ((n) (expand n env)) + ((n . rest) + `(primcall * ,(expand n env) ,(expand:* rest env))))) + (define (expand:primitive-call operator operands env) `(primcall ,operator ,@(expand:list operands env))) @@ -248,6 +262,10 @@ ;; Macros: (('let* (bindings ...) body) (expand:let* bindings body env)) + (('+ args ...) + (expand:+ args env)) + (('* args ...) + (expand:* args env)) ;; Primitive calls: (((? primitive-call? operator) args ...) (expand:primitive-call operator args env)) -- cgit v1.2.3