On 9/9/25 22:46, Marc Feeley wrote:
a much better way is to use `syntax-rules`
OK, here are the macros I use over and over. Can you offer some guidance about how to rewrite them?
Brad
(define-macro (computable-lambda arg . body) (let ((result `(computable-memoize (lambda ,arg ,@body)))) result))
(define-macro (table-memoize arg . body) (let ((table-name (gensym 'table)) (result-name (gensym 'result))) (let ((result `(let ((,table-name (make-table weak-keys: #t weak-values: #t test: eqv?))) (lambda ,arg (cond ((table-ref ,table-name ,(car arg) #f)) (else (let ((,result-name (let () ,@body))) (table-set! ,table-name ,(car arg) ,result-name) ,result-name))))))) result)))
(define-macro (macro-make-incremental-power-series x ;; name of argument partial-term ;; (lambda (m n) ...) common-factor-ratio ;; (lambda (m n) ...) k*->terms ;; (lambda (k*) ...)
multiply-series-by-x? ;; if #f, multiply by computable-one debug-name ;; name to print in debug messages ) (let ((result `(table-memoize (,x) (letrec* ((partial-term ,partial-term) (common-factor-ratio ,common-factor-ratio) (k*->terms ,k*->terms) (multiply-series-by-x? ,multiply-series-by-x?) (number-of-terms #f) (sum-of-terms #f) (k* #f) (v* #f))
(define (reset-k*) (if *strict-testing* (set! k* #f)))
(define (result k) (cond ((not k*) (if (*debug*) (pp (list ,debug-name new-power-series: arg: ,x k: k))) (set! k* (k->k* k)) (set! number-of-terms (k*->terms k*)) (set! sum-of-terms (computable-* (if multiply-series-by-x? ,x computable-one)
(computable-binary-splitting-partial-sum 0 number-of-terms partial-term common-factor-ratio))) (set! v* (sum-of-terms k*)) (result k)) ((<= k k*) (if (*debug*) (pp (list ,debug-name found-existing-value: arg: ,x k*: k* k: k number-of-terms: number-of-terms))) (let ((result (arithmetic-shift v* (- k k*)))) (reset-k*) result)) (else (if (*debug*) (pp (list ,debug-name extending-power-series: arg: ,x k*: k* k: k))) (let* ((new-k* (k->k* k)) (new-number-of-terms (max number-of-terms (k*->terms new-k*))) (new-sum-of-terms (computable-+ sum-of-terms (computable-* (if multiply-series-by-x? ,x computable-one) (computable-* (computable-binary-splitting-partial-sum number-of-terms new-number-of-terms partial-term common-factor-ratio) (common-factor-ratio 0 number-of-terms))))) (new-v* (new-sum-of-terms new-k*))) (set! k* new-k*) (set! v* new-v*) (set! number-of-terms new-number-of-terms) (set! sum-of-terms new-sum-of-terms) (result k)))))
result))))
result))