A problem with renaming variables in macros

Tommi Höynälänmaa <[email protected]> Thu, 9 Oct 2025 09:24:10 +0300
Newsgroups gmane.lisp.guile.user
Message-ID <[email protected]>
I'm trying to make a Guile macro taking the argument list (x0 x1 ...) 
and the
body expressions as parameters and generating the following code:

---
(lambda args
   (let ((x0 (list-ref args 0))
         (x1 (list-ref args 1))
         ...)
      body1 ...))
---

I have tried the following implementation:

---
(define (get-integer-sequence start count)
   (assert (>= count 0))
   (if (= count 0)
       '()
       (cons start (get-integer-sequence (+ start 1) (- count 1)))))

(define-syntax gen-proc
   (lambda (x)
     (syntax-case x ()
                  ((_ vars body1 ...)
                   (let* ((i-count (length (syntax->datum #'vars)))
                          (l-seq (get-integer-sequence 0 i-count))
                          (l-defs (map (lambda (i var)
                                         (list (datum->syntax #f var) 
#`(list-ref args #,i)))
                                       l-seq (syntax->datum #'vars))))
                     #`(lambda args (let #,(datum->syntax #f l-defs) 
body1 ...)))))))
---

I have a problem with renaming the arguments xn. For example, command
(tree-il->scheme (macroexpand '(gen-proc (x1) x1))) displays
(lambda args (let ((x1-1 (list-ref args 0))) x1)).
How can I prevent renaming the variables in the let bindings?

      - Tommi Höynälänmaa

-- 
Kotisivu / Homepage:http://www.iki.fi/tohoyn/
Sähköposti / E-Mail:[email protected]
GPG-sormenjälki / GPG fingerprint:
55F4 2477 7155 3528 5CB2 2B7A BB86 1FDE 4046 0F83
FT, Debian-ylläpitäjä / PhD, Debian Maintainer