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; -*-
|
||||
|
||||
;;;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
|
||||
;;;; 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014
|
||||
;;;; Free Software Foundation, Inc.
|
||||
;;;; Copyright (C) 1995-2014 Free Software Foundation, Inc.
|
||||
;;;;
|
||||
;;;; This library is free software; you can redistribute it and/or
|
||||
;;;; 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 ()
|
||||
((_) #t)
|
||||
((_ 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
|
||||
(syntax-rules ()
|
||||
((_) #f)
|
||||
((_ 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")
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue