Path: utzoo!attcan!uunet!spool.mu.edu!sdd.hp.com!zaphod.mps.ohio-state.edu!ub!uhura.cc.rochester.edu!rochester!pt.cs.cmu.edu!o.gp.cs.cmu.edu!andrew.cmu.edu!bobg+ From: bobg+@andrew.cmu.edu (Robert Steven Glickstein) Newsgroups: comp.lang.scheme Subject: Re: Scheme recursive procedures Message-ID: Date: 1 Feb 91 16:40:14 GMT References: <11739@darkstar.ucsc.edu> Organization: Information Technology Center, Carnegie Mellon, Pittsburgh, PA Lines: 57 In-Reply-To: <11739@darkstar.ucsc.edu> Excerpts from netnews.comp.lang.scheme: 31-Jan-91 Scheme recursive procedures 60766000@ucscb.UCSC.EDU (321) > Can one of you scheme hackers out there help me with a prog. problem ? > the version of scheme at my school doesn't have the function "reverse" > I am trying to write one but so far have only come up with one that is > recursive but needs to take in two arguments.. CAn someone show me a way > to do it with only one ?.. Here's one implementation of reverse and reverse!. In general, if you want a one-parameter procedure but can't think of how to do it in less than two parameters, write a one-parameter *interface* to a "hidden" two-parameter procedure, like so: (define one-param (letrec ((two-param (lambda (a b) ...))) ; two-param is a ; private procedure ; taking 2 args (lambda (only-one) ; this is one-param (two-param only-one ; it calls two-param (some other expr))))) ; with some initial values ;;; Now for reverse and reverse! (define reverse (letrec ((reverse-aux (lambda (result remaining) (if (null? remaining) result (reverse-aux (cons (car remaining) result) (cdr remaining)))))) (lambda (l) (reverse-aux '() l)))) (define (reverse! l) (cond ((null? l) l) ((not (pair? (cdr l))) l) (else (let ((cl (cdr l))) (set-cdr! l '()) (let loop ((a l) (b cl)) (cond ((not (pair? b)) a) (else (let ((c (cdr b))) (set-cdr! b a) (loop b c))))))))) ______________ _____________________________ Bob Glickstein | Internet: bobg@andrew.cmu.edu Information Technology Center | Bitnet: bobg%andrew@cmuccvma.bitnet Carnegie Mellon University | UUCP: ...!harvard!andrew.cmu.edu!bobg Pittsburgh, PA 15213-3890 | (412) 268-6743 | Sinners can repent, but stupid is forever