From e9de3409ec2a0ead82c9f8563c79668e57b6bccb Mon Sep 17 00:00:00 2001 From: alex-eg Date: Thu, 30 Oct 2025 12:22:18 +0300 Subject: [PATCH] optimize fmt-c-writer type unwrapping --- fmt-c-writer.scm | 20 +++++++++----------- tests/fmt-c-writer.scm | 16 ++++++++-------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/fmt-c-writer.scm b/fmt-c-writer.scm index f84d65d..fa8c230 100644 --- a/fmt-c-writer.scm +++ b/fmt-c-writer.scm @@ -46,6 +46,12 @@ (unkebabify atom) atom)))) +(define (maybe-unwrap-type type) + (if (and (list? type) + (= 1 (length type))) + (car type) + type)) + (define (make-field-access form) (assert (= 2 (length form)) "Wrong field access format") @@ -111,19 +117,13 @@ (if (integer? (last array-type)) ;; sized array (let* ((type-list (drop-right array-type 1)) - (type (if (and (list? (car type-list)) - (= 1 (length type-list))) - (car type-list) - type-list)) + (type (maybe-unwrap-type type-list)) (size (last array-type))) `(%array ,(walk-type type) ,size)) ;; sugar for pointer... Do we really need it? Guess why not, ;; it's a strong semantic cue - `(%array ,(walk-type (if (and (list? (car array-type)) - (= 1 (length array-type))) - (car array-type) - array-type))))) + `(%array ,(walk-type (maybe-unwrap-type array-type))))) (('fn arglist ret-type) `(%fun ,(walk-type ret-type) ,(walk-arglist arglist))) @@ -179,9 +179,7 @@ ;; 1 element args are always type ((_) (walk-type x)) - ((var . type) (append (list (walk-type (if (= 1 (length type)) - (car type) - type))) + ((var . type) (append (list (walk-type (maybe-unwrap-type type))) (list (walk-type var)))))) form)) diff --git a/tests/fmt-c-writer.scm b/tests/fmt-c-writer.scm index a9384b1..f606276 100644 --- a/tests/fmt-c-writer.scm +++ b/tests/fmt-c-writer.scm @@ -26,7 +26,7 @@ (walk-type '(¤ (const char)))) (test - '(%array (float) 8) + '(%array float 8) (walk-type '(¤ float 8))) (test @@ -40,16 +40,16 @@ (walk-type '(const * const char))) (test - '(%fun void ((int) (float) (struct what *))) - (walk-type '(fn ((int) (float) (* struct what)) void))) + '(%fun void ((int) (float) (%array (struct what * const)))) + (walk-type '(fn ((int) (float) (¤ (const * struct what))) void))) (test - '(%fun void ((int) (%array (float)) (struct what *))) - (walk-type '(fn ((int) (¤ float) (* struct what)) void))) + '(%fun void ((int) (%array float) (%array (struct what * const)))) + (walk-type '(fn ((int) (¤ float) (¤ (const * struct what))) void))) ;;; Variable defs (test - '(%var (%array (float) 8) a) + '(%var (%array float 8) a) (walk-var '(var a (¤ float 8)))) (test @@ -82,7 +82,7 @@ ;;; Fn defs (test - '(%fun void puk ((int) (%array (float) 8))) + '(%fun void puk ((int) (%array float 8))) (walk-fn-def '(fn puk ((int) (¤ float 8)) void))) (test @@ -129,7 +129,7 @@ (test '(struct mega_kebab ((int a) ((struct ((int year) (int month) (int day))) dob) - ((%fun int ((int) (%array (int)))) min))) + ((%fun int ((int) (%array int))) min))) (walk-struct '(struct mega-kebab ((a int) (dob (struct ((year int)