chicken-hackers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Chicken-hackers] [PATCH] warn if var is bound multiple times in the sam


From: Felix
Subject: [Chicken-hackers] [PATCH] warn if var is bound multiple times in the same binding form
Date: Fri, 01 Feb 2013 00:14:33 +0100 (CET)

The attached patch emits a warning at expansion time if the same variable
in a let[rec][-syntax] form is bound more than once.


cheers,
felix
>From 127859a3a1d8e013483da779101bfd0a89092d90 Mon Sep 17 00:00:00 2001
From: felix <address@hidden>
Date: Fri, 1 Feb 2013 00:13:23 +0100
Subject: [PATCH] warn if the same variable is bound multiple times in a let, 
letrec, let-syntax or letrec-syntax form

---
 expand.scm |   43 ++++++++++++++++++-------------------------
 1 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/expand.scm b/expand.scm
index 09d0c3d..bca979a 100644
--- a/expand.scm
+++ b/expand.scm
@@ -33,6 +33,7 @@
   (fixnum)
   (hide match-expression
        macro-alias
+       check-for-multiple-bindings
        d dd dm dx map-se
        lookup check-for-redef) 
   (not inline ##sys#syntax-error-hook ##sys#compiler-syntax-hook
@@ -1022,35 +1023,30 @@
                 ,(car head)
                 (##sys#er-transformer (##core#lambda ,(cdr head) 
,@body))))))))))
 
-(define (##sys#check-for-multiple-bindings bindings form loc)
+(define (check-for-multiple-bindings bindings form loc)
   ;; assumes correct syntax
   (let loop ((bs bindings) (done '()))
-    (cond ((null? bs) '())
+    (cond ((null? bs))
          ((memq (caar bs) done)
           (##sys#warn 
            (string-append "variable bound multiple times in " loc " construct")
            (caar bs)
            form)
-          (cons (car bs) (loop (cdr bs) done)))
-         (else 
-          (cons (car bs) (loop (cdr bs) (cons (caar bs) done)))))))
+          (loop (cdr bs) done))
+         (else (loop (cdr bs) (cons (caar bs) done))))))
 
 (##sys#extend-macro-environment
  'let
  '()
  (##sys#er-transformer
   (lambda (x r c)
-    (if (and (pair? (cdr x)) (symbol? (cadr x)))
-       (##sys#check-syntax 'let x '(_ symbol #((symbol _) 0) . #(_ 1)))
-       (##sys#check-syntax 'let x '(_ #((symbol _) 0) . #(_ 1))))
-    (if (symbol? (cadr x))
-        `(##core#let
-           ,(cadr x)
-           ,(##sys#check-for-multiple-bindings (caddr x) x "let")
-           ,@(cdddr x)))))
-        `(##core#let
-           ,(##sys#check-for-multiple-bindings (cadr x) x "let")
-           ,@(cddr x))))))
+    (cond ((and (pair? (cdr x)) (symbol? (cadr x)))
+          (##sys#check-syntax 'let x '(_ symbol #((symbol _) 0) . #(_ 1)))
+           (check-for-multiple-bindings (caddr x) x "let"))
+         (else
+          (##sys#check-syntax 'let x '(_ #((symbol _) 0) . #(_ 1)))
+           (check-for-multiple-bindings (cadr x) x "let")))
+    `(##core#let ,@(cdr x)))))
 
 (##sys#extend-macro-environment
  'letrec
@@ -1058,9 +1054,8 @@
  (##sys#er-transformer
   (lambda (x r c)
     (##sys#check-syntax 'letrec x '(_ #((symbol _) 0) . #(_ 1)))
-    `(##core#letrec
-      ,(##sys#check-for-multiple-bindings (cadr x) x "letrec")      
-      ,@(cddr x)))))
+    (check-for-multiple-bindings (cadr x) x "letrec")
+    `(##core#letrec ,@(cdr x)))))
 
 (##sys#extend-macro-environment
  'let-syntax
@@ -1068,9 +1063,8 @@
  (##sys#er-transformer
   (lambda (x r c)
     (##sys#check-syntax 'let-syntax x '(_ #((symbol _) 0) . #(_ 1)))
-    `(##core#let-syntax
-      ,(##sys#check-for-multiple-bindings (cadr x) x "let-syntax")
-      ,@(cddr x)))))
+    (check-for-multiple-bindings (cadr x) x "let-syntax")
+    `(##core#let-syntax ,@(cdr x)))))
 
 (##sys#extend-macro-environment
  'letrec-syntax
@@ -1078,9 +1072,8 @@
  (##sys#er-transformer
   (lambda (x r c)
     (##sys#check-syntax 'letrec-syntax x '(_ #((symbol _) 0) . #(_ 1)))
-    `(##core#letrec-syntax
-      ,(##sys#check-for-multiple-bindings (cadr x) x "letrec-syntax")
-      ,@(cddr x)))))
+    (check-for-multiple-bindings (cadr x) x "letrec-syntax")
+    `(##core#letrec-syntax ,@(cdr x)))))
 
 (##sys#extend-macro-environment
  'set!
-- 
1.7.0.4


reply via email to

[Prev in Thread] Current Thread [Next in Thread]