mes: Evaluate test of COND only once.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 5 Jan 2018 09:01:50 +0000 (10:01 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 5 Jan 2018 09:01:50 +0000 (10:01 +0100)
* module/mes/base-0.mes (cond): Evaluate test of COND only once.
  Fixes cond tests with side effects (Nyacc).
* tests/base.test ("cond side effect"): Test it.

module/mes/base-0.mes
tests/base.test

index 7db153e508e1c8f7a773f93817234afc68600f64..727522e6b9f67af84516c8a3be32ac0f20ec888c 100644 (file)
@@ -63,8 +63,8 @@
                             (if (pair? (cdr (car clauses)))
                                 (if (eq? (car (cdr (car clauses))) '=>)
                                     (append2 (cdr (cdr (car clauses))) '(test))
-                                    (list (cons 'lambda (cons '() (car clauses)))))
-                                (list (cons 'lambda (cons '() (car clauses)))))
+                                    (list (cons 'lambda (cons '() (cons 'test (cdar clauses))))))
+                                (list (cons 'lambda (cons '() (cons 'test (cdar clauses))))))
                             (if (pair? (cdr clauses))
                                 (cons 'cond (cdr clauses)))))))
               (car (car clauses)))))
index 784fe9c4a799ab27c67a8ecb134eac37282fa552..3ac1e1305288d8a9cbcbfbb8609345e26157767c 100755 (executable)
@@ -61,6 +61,10 @@ exit $?
       (pass-if "cond 2" (seq? (cond (#f)) *unspecified*))
       (pass-if "cond 3" (seq? (cond (#t 0)) 0))
       (pass-if "cond 3" (seq? (cond (#f 1) (#t 0)) 0))
+      (pass-if-equal "cond side effect"
+                     1
+                     (let ((i 0))
+                       (cond ((set! i (1+ i)) i))))
       (pass-if-equal "cond => "
           0 (let ((lst '(0 1 2)))
               (define (next)