diff --git a/collects/scheme/mpair.ss b/collects/scheme/mpair.ss index 01c0d41..2051d7c 100644 --- a/collects/scheme/mpair.ss +++ b/collects/scheme/mpair.ss @@ -8,6 +8,7 @@ mappend mappend! mreverse + mreverse! mlist-tail mlist-ref mmemq @@ -103,10 +104,11 @@ (case-lambda [() null] [(a) a] - [(a b) (let loop ([atail a]) - (cond [(null? atail) b] - [(null? (mcdr atail)) (set-mcdr! atail b) a] - [else (loop (mcdr atail))]))] + [(a b) (if (null? a) + b + (let loop ([atail a]) + (cond [(null? (mcdr atail)) (set-mcdr! atail b) a] + [else (loop (mcdr atail))])))] [(a . l) (mappend! a (apply mappend! l))])) (define (mreverse l) @@ -115,6 +117,14 @@ [(null? l) a] [else (loop (mcdr l) (mcons (mcar l) a))]))) +(define (mreverse! l) + (let loop ([l l][prev null]) + (cond + [(null? l) prev] + [else (let ([next (mcdr l)]) + (set-mcdr! l prev) + (loop next l))]))) + (define (mlist-tail l n) (cond [(zero? n) l]