From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Ian Price Newsgroups: gmane.lisp.guile.bugs Subject: bug#9883: R6RS fold-left Date: Wed, 26 Oct 2011 21:43:16 +0100 Message-ID: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: dough.gmane.org 1319661993 2043 80.91.229.12 (26 Oct 2011 20:46:33 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Wed, 26 Oct 2011 20:46:33 +0000 (UTC) To: 9883@debbugs.gnu.org Original-X-From: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Wed Oct 26 22:46:29 2011 Return-path: Envelope-to: guile-bugs@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1RJAMi-0003je-ED for guile-bugs@m.gmane.org; Wed, 26 Oct 2011 22:46:24 +0200 Original-Received: from localhost ([::1]:52442 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJAMh-0004yA-Qa for guile-bugs@m.gmane.org; Wed, 26 Oct 2011 16:46:23 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]:43112) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJAMe-0004xu-Au for bug-guile@gnu.org; Wed, 26 Oct 2011 16:46:21 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RJAMc-0006QK-SQ for bug-guile@gnu.org; Wed, 26 Oct 2011 16:46:20 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:56810) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJAMc-0006QE-OY for bug-guile@gnu.org; Wed, 26 Oct 2011 16:46:18 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.69) (envelope-from ) id 1RJAOI-0006Nh-PL for bug-guile@gnu.org; Wed, 26 Oct 2011 16:48:03 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Ian Price Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-guile@gnu.org Resent-Date: Wed, 26 Oct 2011 20:48:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 9883 X-GNU-PR-Package: guile X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-guile@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.131966204024462 (code B ref -1); Wed, 26 Oct 2011 20:48:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 26 Oct 2011 20:47:20 +0000 Original-Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1RJANb-0006MU-4Y for submit@debbugs.gnu.org; Wed, 26 Oct 2011 16:47:19 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1RJANV-0006ME-Pr for submit@debbugs.gnu.org; Wed, 26 Oct 2011 16:47:17 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RJALi-0006IR-Jj for submit@debbugs.gnu.org; Wed, 26 Oct 2011 16:45:24 -0400 Original-Received: from lists.gnu.org ([140.186.70.17]:41647) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJALi-0006IN-HS for submit@debbugs.gnu.org; Wed, 26 Oct 2011 16:45:22 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]:34968) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJALh-0004qG-At for bug-guile@gnu.org; Wed, 26 Oct 2011 16:45:22 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RJALf-0006I2-Vd for bug-guile@gnu.org; Wed, 26 Oct 2011 16:45:21 -0400 Original-Received: from lo.gmane.org ([80.91.229.12]:53496) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJALf-0006Hj-EM for bug-guile@gnu.org; Wed, 26 Oct 2011 16:45:19 -0400 Original-Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1RJALa-0003CY-6B for bug-guile@gnu.org; Wed, 26 Oct 2011 22:45:14 +0200 Original-Received: from host31-53-23-37.range31-53.btcentralplus.com ([31.53.23.37]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 26 Oct 2011 22:45:14 +0200 Original-Received: from ianprice90 by host31-53-23-37.range31-53.btcentralplus.com with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 26 Oct 2011 22:45:14 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 144 Original-X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: host31-53-23-37.range31-53.btcentralplus.com User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) Cancel-Lock: sha1:08xH9JUEOD7XWYadVsbs3nkhKb0= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list Resent-Date: Wed, 26 Oct 2011 16:48:02 -0400 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 140.186.70.43 X-BeenThere: bug-guile@gnu.org List-Id: "Bug reports for GUILE, GNU's Ubiquitous Extension Language" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Original-Sender: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.bugs:5893 Archived-At: --=-=-= Hi guilers, According to the R6RS the accumulator should be the first argument of the combiner[0], not the last as in SRFI 1[1]. I've attached a patch to fix this, and the use of fold-left in define-record-type. Currently, it terminates on the first null (as in SRFI 1). If you would prefer, I can change it to check the lengths of the lists before-hand, and do the same for fold-right. Cheers. 0. http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-4.html#node_idx_212 1. http://srfi.schemers.org/srfi-1/srfi-1.html#fold -- Ian Price "Programming is like pinball. The reward for doing it well is the opportunity to do it again" - from "The Wizardy Compiled" --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-Fix-R6RS-fold-left.patch Content-Description: fold-left fix >From 31b964c85ba45d72e4ec047e7d0420146a12941c Mon Sep 17 00:00:00 2001 From: Ian Price Date: Wed, 26 Oct 2011 20:24:05 +0100 Subject: [PATCH] Fix R6RS `fold-left' * module/rnrs/lists.scm (fold-left) : Wrote R6RS compliant version with accumulator as first argument to the combiner. * module/rnrs/records/syntactic.scm (define-record-type): Fix to use corrected fold-left. * test-suite/tests/r6rs-lists.test: Add tests. --- module/rnrs/lists.scm | 12 +++++++++--- module/rnrs/records/syntactic.scm | 4 ++-- test-suite/tests/r6rs-lists.test | 26 ++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/module/rnrs/lists.scm b/module/rnrs/lists.scm index 812ce5f..0671e77 100644 --- a/module/rnrs/lists.scm +++ b/module/rnrs/lists.scm @@ -22,8 +22,7 @@ remv remq memp member memv memq assp assoc assv assq cons*) (import (rnrs base (6)) (only (guile) filter member memv memq assoc assv assq cons*) - (rename (only (srfi srfi-1) fold - any + (rename (only (srfi srfi-1) any every remove member @@ -32,7 +31,6 @@ partition fold-right filter-map) - (fold fold-left) (any exists) (every for-all) (remove remp) @@ -40,6 +38,14 @@ (member memp-internal) (assoc assp-internal))) + (define (fold-left combine nil list . lists) + (define (fold nil lists) + (if (exists null? lists) + nil + (fold (apply combine nil (map car lists)) + (map cdr lists)))) + (fold nil (cons list lists))) + (define (remove obj list) (remp (lambda (elt) (equal? obj elt)) list)) (define (remv obj list) (remp (lambda (elt) (eqv? obj elt)) list)) (define (remq obj list) (remp (lambda (elt) (eq? obj elt)) list)) diff --git a/module/rnrs/records/syntactic.scm b/module/rnrs/records/syntactic.scm index a497b90..bde6f93 100644 --- a/module/rnrs/records/syntactic.scm +++ b/module/rnrs/records/syntactic.scm @@ -134,13 +134,13 @@ (let* ((fields (if (unspecified? _fields) '() _fields)) (field-names (list->vector (map car fields))) (field-accessors - (fold-left (lambda (x c lst) + (fold-left (lambda (lst x c) (cons #`(define #,(cadr x) (record-accessor record-name #,c)) lst)) '() fields (sequence (length fields)))) (field-mutators - (fold-left (lambda (x c lst) + (fold-left (lambda (lst x c) (if (caddr x) (cons #`(define #,(caddr x) (record-mutator record-name diff --git a/test-suite/tests/r6rs-lists.test b/test-suite/tests/r6rs-lists.test index ba645ed..030091f 100644 --- a/test-suite/tests/r6rs-lists.test +++ b/test-suite/tests/r6rs-lists.test @@ -30,3 +30,29 @@ (let ((d '((3 a) (1 b) (4 c)))) (equal? (assp even? d) '(4 c))))) +(with-test-prefix "fold-left" + (pass-if "fold-left sum" + (equal? (fold-left + 0 '(1 2 3 4 5)) + 15)) + (pass-if "fold-left reverse" + (equal? (fold-left (lambda (a e) (cons e a)) '() '(1 2 3 4 5)) + '(5 4 3 2 1))) + (pass-if "fold-left max-length" + (equal? (fold-left (lambda (max-len s) + (max max-len (string-length s))) + 0 + '("longest" "long" "longer")) + 7)) + (pass-if "fold-left with-cons" + (equal? (fold-left cons '(q) '(a b c)) + '((((q) . a) . b) . c))) + (pass-if "fold-left sum-multiple" + (equal? (fold-left + 0 '(1 2 3) '(4 5 6)) + 21)) + (pass-if "fold-left pairlis" + (equal? (fold-left (lambda (accum e1 e2) + (cons (cons e1 e2) accum)) + '((d . 4)) + '(a b c) + '(1 2 3)) + '((c . 3) (b . 2) (a . 1) (d . 4))))) -- 1.7.6.4 --=-=-=--