>From f66efec38cb6b7ebf34d70cfabafe9552807c9bd Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Fri, 17 Oct 2014 20:46:15 +0200 Subject: [PATCH] Fix incorrect optimization in cond expansion. When a constant is used as the condition, the consequence would be simply taken as-is (or wrapped in a "begin" if it's multiple statements). However, if there's a => following the constant, it should expand to a call of the procedure with the constant as argument. Reported by Michele La Monaca --- NEWS | 2 ++ expand.scm | 9 ++++++--- tests/syntax-tests.scm | 5 +++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 70b68fa..00b1475 100644 --- a/NEWS +++ b/NEWS @@ -49,6 +49,8 @@ - Syntax expander - define-values, set!-values and letrec-values now support full lambda lists as binding forms + - cond expands correctly when a constant is used in combination with => + (thanks to Michele La Monaca) - C API - Removed deprecated C_get_argument[_2] and diff --git a/expand.scm b/expand.scm index 16a1370..966d4ba 100644 --- a/expand.scm +++ b/expand.scm @@ -1174,9 +1174,12 @@ (and (pair? (car clause)) (c (r 'quote) (caar clause)))) (expand rclauses (strip-syntax (car clause))) - (if (null? (cdr clause)) - (car clause) - `(##core#begin ,@(cdr clause)))) + (cond ((and (fx= (length clause) 3) + (c %=> (cadr clause))) + `(,(caddr clause) ,(car clause))) + ((null? (cdr clause)) + (car clause)) + (else `(##core#begin ,@(cdr clause))))) ((null? (cdr clause)) `(,%or ,(car clause) ,(expand rclauses #f))) ((and (fx= (length clause) 3) diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm index df0f607..ba9b3fc 100644 --- a/tests/syntax-tests.scm +++ b/tests/syntax-tests.scm @@ -196,6 +196,11 @@ (let ((baz 100)) (t "no baz" (kw baz))) +;; Optimisation to rewrite constants with =>, reported by Michele La Monaca +(t 2 (cond (1 2))) +(f (cond (1 => string-length))) +(t #t (cond (1 => odd?))) + (t 'ok (let ((=> #f)) (cond (#t => 'ok))) -- 1.7.10.4