From 532487d7137e5216aec842e07fb176a144bd3fbd Mon Sep 17 00:00:00 2001 From: alex-eg Date: Fri, 26 Sep 2025 14:33:23 +0300 Subject: [PATCH] implement semantic code walking framework --- semen.scm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/semen.scm b/semen.scm index 92e3919..2462819 100644 --- a/semen.scm +++ b/semen.scm @@ -79,6 +79,23 @@ (cons (car module-public-forms) acc)))))) +;;; TODO: for greater inspiration, see SBCL's walk.lisp +(define (semen-walk-form form walk-fn) + (if (atom? form) form + (let ((new-form (walk-fn form))) + (cond ((not (eq? form new-form)) + (semen-walk-form new-form walk-fn)) + (else (recons + new-form + (semen-walk-form (car new-form) walk-fn) + (semen-walk-form (cdr new-form) walk-fn))))))) + +(define (recons old-cons new-car new-cdr) + (if (and (eq? new-car (car old-cons)) + (eq? new-cdr (cdr old-cons))) + old-cons + (cons new-car new-cdr))) + (define (process-fn sex-fn acc) (cons sex-fn acc))