GNU bug report logs - #38263
Bug in srfi-11 (?)

Previous Next

Package: guile;

Reported by: Tim Gesthuizen <tim.gesthuizen <at> yahoo.de>

Date: Mon, 18 Nov 2019 20:02:02 UTC

Severity: normal

Done: Andy Wingo <wingo <at> pobox.com>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Tim Gesthuizen <tim.gesthuizen <at> yahoo.de>
To: Mark H Weaver <mhw <at> netris.org>
Cc: 38263 <at> debbugs.gnu.org
Subject: bug#38263: Bug in srfi-11
Date: Tue, 03 Dec 2019 19:15:29 +0100
[Message part 1 (text/plain, inline)]
Hello again,

the attached patch also adds a unit test.
I am not into how Guile is organized: Is there anything keeping us from
adding the change?

Tim.

[0001-srfi-11-Do-not-expose-variables-to-later-clauses.patch (text/x-patch, inline)]
From 99d8fb795932eb92b7d5fb09115b6691f4bfe66d Mon Sep 17 00:00:00 2001
From: Tim Gesthuizen <tim.gesthuizen <at> yahoo.de>
Date: Tue, 3 Dec 2019 18:50:37 +0100
Subject: [PATCH] srfi-11: Do not expose variables to later clauses

The current implementation of srfi-11s let-values allows later clauses
to access and modify variables bound in earlier clauses when the clause
is not a proper list.

* module/srfi/srfi-11.scm (let-values): Fix switched variable names.
* test-suite/tests/srfi-11.test (let-values): Add test checking that the
  variable cannot be changed in later clauses.
---
 module/srfi/srfi-11.scm       | 2 +-
 test-suite/tests/srfi-11.test | 9 ++++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/module/srfi/srfi-11.scm b/module/srfi/srfi-11.scm
index 22bda21a2..7afac9c5f 100644
--- a/module/srfi/srfi-11.scm
+++ b/module/srfi/srfi-11.scm
@@ -91,7 +91,7 @@
                     (syntax (call-with-values (lambda () exp)
                               (lambda (new-tmp ...) inner))))))
                ((vars exp)
-                (with-syntax ((((new-tmp . new-var) ...)
+                (with-syntax ((((new-var . new-tmp) ...)
                                (let lp ((vars (syntax vars)))
                                  (syntax-case vars ()
                                    ((id . rest)
diff --git a/test-suite/tests/srfi-11.test b/test-suite/tests/srfi-11.test
index 40563dc18..9bfaa4300 100644
--- a/test-suite/tests/srfi-11.test
+++ b/test-suite/tests/srfi-11.test
@@ -74,7 +74,14 @@
 	'(unbound-variable . ".*")
       (let-values (((x) (values 1))
 		   ((y) (values (1+ x))))
-	#f))))
+	#f))
+
+    (pass-if "first binding with rest invisible to second expr"
+      (let* ((a 1)
+             (b (let-values (((a . b) (values 2 3))
+                             (c (begin (set! a 9) 4)))
+                  (list a b c))))
+        (equal? (cons a b) '(9 2 (3) (4)))))))
 
 ;;
 ;; let*-values
-- 
2.24.0


This bug report was last modified 5 years and 133 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.