Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" Newsgroups: comp.lang.lisp,comp.lang.scheme Subject: Re: Confused about Scheme...??? Date: Tue, 6 Aug 2024 15:37:40 -0000 (UTC) Organization: A noiseless patient Spider Lines: 57 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Injection-Date: Tue, 06 Aug 2024 17:37:40 +0200 (CEST) Injection-Info: dont-email.me; posting-host="94b510cfdba61ab92451386f03b599b0"; logging-data="1768254"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18UppO2DgJ+9nd/LRCuEfCb" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:S0XEu/ctc66vLTrpPNh2F2F8c74= Bytes: 2692 B. Pym wrote: > > In short, 'reduce-list', is take a list of variable length, 'b', > > below and reduce it if the (caar ls) and (caadr ls) are equal...this > > is the first atom within the pair of consecutive sublists and if this > > is true contruct a list, (list (caar ls) (+ (cadar ls) (cadadr ls))) > > , and add second atom of the consective pairs. For example, > > (reduce-list b) ==> ((4 3) (3 7) (2 1) (1 2) (0 1)). I can get it to > > work for the first two terms without using recursion, produces (4 3), > > but when I implement recursion it barfs. Could some one tell me what > > I'm doing wrong because I know that I'm trying to do to much at once? > > > > > > -Conrad > > > > > > (define (reduce-list ls) > > (cond ((null? ls) ls) > > (else > > (cond ((null? (cadr ls)) ls) > > (else > > (cond ((eq? (caar ls) (caadr ls)) > > (list (caar ls) (+ (cadar ls) (cadadr ls))) > > (reduce-list (cdr ls))) > > (else (list (car ls) (reduce-list (cdr ls))))))))))) > > > > > > (define b '((4 1) (4 2) (3 3) (3 4) (2 1) (1 2) (0 1))) > > > > (reduce-list b) > > newLISP > > (define b '((4 1) (4 2) (4 80) (3 3) (3 4) (2 6) (9 2) (9 5))) > > (define (meld xs) > (local (K A B) > (if (null? xs) > '() > (let (u (unify '((K A) (K B)) (0 2 xs))) > (if u > (begin (bind u) (meld (cons (list K (+ A B)) (2 xs)))) > (cons (first xs) (meld (rest xs)))))))) > > (meld b) > > ((4 83) (3 7) (2 6) (9 7)) Shorter: (define (meld xs , K A B) (if (null? xs) '() (if (unify '((K A) (K B)) (0 2 xs)) (begin (bind $it) (meld (cons (list K (+ A B)) (2 xs)))) (cons (first xs) (meld (rest xs))))))