mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 11:40:18 +02:00
Avoid quadratic expansion time in 'and' and 'or' macros.
Fixes <http://bugs.gnu.org/17147>. Reported by David Kastrup <dak@gnu.org>. * module/ice-9/boot-9.scm (and, or): Use dotted tail instead of ellipsis in patterns.
This commit is contained in:
parent
2da97f1c7c
commit
1ea8954814
1 changed files with 5 additions and 5 deletions
|
@ -1,8 +1,6 @@
|
||||||
;;; -*- mode: scheme; coding: utf-8; -*-
|
;;; -*- mode: scheme; coding: utf-8; -*-
|
||||||
|
|
||||||
;;;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
|
;;;; Copyright (C) 1995-2014 Free Software Foundation, Inc.
|
||||||
;;;; 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014
|
|
||||||
;;;; Free Software Foundation, Inc.
|
|
||||||
;;;;
|
;;;;
|
||||||
;;;; This library is free software; you can redistribute it and/or
|
;;;; This library is free software; you can redistribute it and/or
|
||||||
;;;; modify it under the terms of the GNU Lesser General Public
|
;;;; modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -409,13 +407,15 @@ If there is no handler at all, Guile prints an error and then exits."
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
((_) #t)
|
((_) #t)
|
||||||
((_ x) x)
|
((_ x) x)
|
||||||
((_ x y ...) (if x (and y ...) #f))))
|
;; Avoid ellipsis, which would lead to quadratic expansion time.
|
||||||
|
((_ x . y) (if x (and . y) #f))))
|
||||||
|
|
||||||
(define-syntax or
|
(define-syntax or
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
((_) #f)
|
((_) #f)
|
||||||
((_ x) x)
|
((_ x) x)
|
||||||
((_ x y ...) (let ((t x)) (if t t (or y ...))))))
|
;; Avoid ellipsis, which would lead to quadratic expansion time.
|
||||||
|
((_ x . y) (let ((t x)) (if t t (or . y))))))
|
||||||
|
|
||||||
(include-from-path "ice-9/quasisyntax")
|
(include-from-path "ice-9/quasisyntax")
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue