From a6348b7b5a780e4825da054f6f0114b34f66d740 Mon Sep 17 00:00:00 2001 From: alex-eg Date: Wed, 22 Oct 2025 22:30:52 +0300 Subject: [PATCH] add enum support --- fmt-c-writer.scm | 10 ++++++++++ semen.scm | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fmt-c-writer.scm b/fmt-c-writer.scm index 6734d86..0b1fed7 100644 --- a/fmt-c-writer.scm +++ b/fmt-c-writer.scm @@ -75,6 +75,7 @@ (('cast expr type) (list '%cast (walk-type type) (walk-expr expr))) + (('enum . _) (walk-enum form)) ;; | is problematic... And c-or/bit-or/etc are actually ;; procedures, so we have to call the procedure itself (('c-or . rest) (apply c-or (map walk-expr rest))) @@ -130,6 +131,7 @@ ((or ('struct . _) ('union . _)) (walk-struct form)) + (('enum . _) (walk-enum form)) (else (type-convert-to-c form)))) @@ -208,6 +210,13 @@ . ,(tree-map atom-to-fmt-c attrs))) (else (error "Malformed aggregate definition " form)))) +(define (walk-enum form) + (match form + (('enum (values ...)) + `(enum ,(map atom-to-fmt-c values))) + (('enum name (values ...)) + `(enum ,(atom-to-fmt-c name) ,(map atom-to-fmt-c values))))) + (define (walk-extern form) (match form (('fn . _) @@ -246,6 +255,7 @@ (('pub . rest) (walk-public rest)) ((or ('struct . _) ('union . _)) (walk-struct form)) + (('enum . _) (walk-enum form)) (else (walk-expr form)))) (define (emit-c sex-forms) diff --git a/semen.scm b/semen.scm index ed46f73..b891d64 100644 --- a/semen.scm +++ b/semen.scm @@ -56,6 +56,8 @@ ('pub 'struct . _)) (process-struct sex-form acc)) ((or ('union . _) ('pub 'union . _)) (process-struct sex-form acc)) + ((or ('enum . _) + ('pub 'enum . _)) (process-struct sex-form acc)) ((or ('var . _) ('pub 'var . _) ('extern 'var . _)) (process-global-var sex-form acc)) @@ -162,7 +164,7 @@ (process-fn `(fn ,ret-type ,name ,arglist ,@body) (list))) (else (assert #f (fmt #f "Malformed lambda " form))))) -;;; Struct +;;; Structs (define (process-struct sex-struct acc) (cons sex-struct acc))