From debd6026f39d10306187477514ce93f0c4eaa45e Mon Sep 17 00:00:00 2001 From: Jay McCarthy Date: Thu, 12 Aug 2010 14:54:48 -0600 Subject: [PATCH] Fixing a few bugs from drdr --- collects/racket/list.rkt | 10 +++++++++- collects/racket/private/list.rkt | 17 +---------------- collects/racket/private/sequence.rkt | 5 +++-- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/collects/racket/list.rkt b/collects/racket/list.rkt index 1571f28478..9265380c1e 100644 --- a/collects/racket/list.rkt +++ b/collects/racket/list.rkt @@ -1,5 +1,5 @@ #lang scheme/base -(require (only-in "private/list.rkt" split-at)) + (provide first second third fourth fifth sixth seventh eighth ninth tenth last-pair last rest @@ -107,6 +107,14 @@ [(pair? list) (cons (car list) (loop (cdr list) (sub1 n)))] [else (too-large 'take list0 n0)]))) +(define (split-at list0 n0) + (unless (exact-nonnegative-integer? n0) + (raise-type-error 'split-at "non-negative exact integer" n0)) + (let loop ([list list0] [n n0] [pfx '()]) + (cond [(zero? n) (values (reverse pfx) list)] + [(pair? list) (loop (cdr list) (sub1 n) (cons (car list) pfx))] + [else (too-large 'split-at list0 n0)]))) + (define (drop list n) ;; could be defined as `list-tail', but this is better for errors anyway (unless (exact-nonnegative-integer? n) diff --git a/collects/racket/private/list.rkt b/collects/racket/private/list.rkt index c22b59dd70..a943d07e07 100644 --- a/collects/racket/private/list.rkt +++ b/collects/racket/private/list.rkt @@ -1,9 +1,7 @@ (module list "pre-base.rkt" - (provide split-at - - foldl + (provide foldl foldr remv @@ -26,19 +24,6 @@ build-list compose) - - (define (split-at list0 n0) - (unless (exact-nonnegative-integer? n0) - (raise-type-error 'split-at "non-negative exact integer" n0)) - (let loop ([list list0] [n n0] [pfx '()]) - (cond [(zero? n) (values (reverse pfx) list)] - [(pair? list) (loop (cdr list) (sub1 n) (cons (car list) pfx))] - [else - (raise-mismatch-error - 'split-at - (format "index ~e too large for list~a: " - n0 (if (list? list0) "" " (not a proper list)")) - list0)]))) (#%require (rename "sort.rkt" raw-sort sort) (for-syntax "stxcase-scheme.rkt")) diff --git a/collects/racket/private/sequence.rkt b/collects/racket/private/sequence.rkt index eeb1c40028..972f0d2258 100644 --- a/collects/racket/private/sequence.rkt +++ b/collects/racket/private/sequence.rkt @@ -39,8 +39,9 @@ [(v s) (-seqn-cons (values v) s)] [vs*s - (define-values (vs sl) (split-at vs*s (sub1 (length vs*s)))) - (-seqn-cons (apply values vs) (car sl))])) + ; XXX double reverse is bad but moving split-at causes a problem I can't figure + (define s*vs (reverse vs*s)) + (-seqn-cons (apply values (reverse (cdr s*vs))) (car s*vs))])) (define (seqn-first s) (define-values (more? next) (sequence-generate s))