[plt-scheme] sicp exercise 2.23

From: Benjamin L. Russell (dekudekuplex at yahoo.com)
Date: Wed Apr 30 22:59:53 EDT 2008

Indeed; thank you for pointing that out.

After further thought, I came up with the following alternative solution last night (posted together with the evaluation result):

--
(define nil '())
;Value: nil

(define (for-each proc items)
  (if (null? items)
      nil
      (cond ((or (proc (car items)) #t) (for-each proc (cdr items))))))
;Value: for-each

(for-each (lambda (x) (newline) (display x) nil) (list 1 2 3))

1
2
3
;Value: ()

--

This doesn't use "begin", captures "for-each" in a single procedure, ignores the result of "(proc (car items))", and uses side-effects.

Benjamin L. Russell

--- On Wed, 4/30/08, Jos Koot <jos.koot at telefonica.net> wrote:

> Try your for-each as in:
> (for-each (lambda (x) (newline) (display x) nil) (list 1 2
> 3))
> But you are close. Do you need 'if' in
> for-each-helper?
> Jos
> ----- Original Message ----- 
> From: "Benjamin L. Russell"
> <dekudekuplex at yahoo.com>
> To: "Jason Wang" <randomtalk at gmail.com>;
> "John Clements" 
> <clements at brinckerhoff.org>
> Cc: "PLT Scheme List"
> <plt-scheme at list.cs.brown.edu>
> Sent: Wednesday, April 30, 2008 5:35 AM
> Subject: Re: [plt-scheme] sicp exercise 2.23
> 
> 
> > No, don't use "begin"!  One of the main
> points of this exercise is to 
> > learn to use side-effects.
> >
> > Here is my solution and the results of a sample run:
> >
> > --
> > (define nil '())
> > ;Value: nil
> >
> > (define (for-each proc items)
> >  (if (null? items)
> >      nil
> >      (for-each proc (for-each-helper proc items))))
> > ;Value: for-each
> >
> > (define (for-each-helper proc items)
> >  (if (null? (proc (car items)))
> >      nil
> >      (cdr items)))
> > ;Value: for-each-helper
> >
> > (for-each (lambda (x) (newline) (display x))
> >   (list 57 321 88))
> >
> > 57
> > 321
> > 88
> > ;Value: ()
> > --
> >
> > It's actually quite simple; just use a side-effect
> in the if-clause.  No 
> > need for even a "cond".  Nobody said a
> test-clause couldn't be used for a 
> > side effect!
> >
> > Benjamin L. Russell
> >
> > --- On Wed, 4/30/08, John Clements
> <clements at brinckerhoff.org> wrote:
> >
> >> From: John Clements
> <clements at brinckerhoff.org>
> >> Subject: Re: [plt-scheme] sicp exercise 2.23
> >> To: "Jason Wang"
> <randomtalk at gmail.com>
> >> Cc: "PLT Scheme List"
> <plt-scheme at list.cs.brown.edu>
> >> Date: Wednesday, April 30, 2008, 3:35 AM
> >> On Apr 28, 2008, at 11:04 PM, Jason Wang wrote:
> >>
> >> >
> >> > However, my problem is that SICP hasn't
> introduced
> >> begin yet...
> >>
> >> I don't have a copy of SICP handy (I guess I
> can just
> >> tear up my
> >> Schemer Membership Card right now...), but
> >> "begin" seems to me to be
> >> the natural choice to express what you want;
> it's true
> >> that there are
> >> other constructs that behave in a begin-like way,
> and in
> >> fact you can
> >> write begin as a function (for a fixed number of
> arguments)
> >> quite
> >> easily, but I would suggest just using
> 'begin',
> >> especially as you've
> >> been through HtDP already.
> >>
> >> John
> >>
> Clements_________________________________________________
> >>   For list-related administrative tasks:
> >>  
> http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> > _________________________________________________
> >  For list-related administrative tasks:
> >  http://list.cs.brown.edu/mailman/listinfo/plt-scheme


Posted on the users mailing list.