ENOSIG Discussie (threads)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scheme vraagje: is (accumulate cons nil sequence) zinvol? (was: Re: talks at meetings)


On Thu, Jan 15, 2004 at 05:14:24PM +0100, Jan Nieuwenhuizen wrote:
> Joost van Baal writes:
> 
> > I am interested in learning guile.  Anybody willing to help me get
> > started?
> 
> I would not consider it `help', but I can recommend SICP:
> 
>     http://mitpress.mit.edu/sicp/
> 
> You learn basic programming techniques, and get scheme knowledge for
> free ;-)

Heb dat inmiddels maar aangeschaft: van papier leest t toch wat
makkelijker.  Geweldig boek inderdaad.

Tot nog toe snap ik 1 ding niet.  Voor degenen die niet bekend zijn met
scheme (of lisp of guile of varianten) zal ik hier proberen een
scheme-in-5-minuten te geven, zodat ook zij het probleem misschien
kunnen snappen.

-----------------------------------------------------------------------

null? tests wether its argument is the empty list
nil is the empty list

car selects the first item in the list
cdr selects the sublist consisting of all but the first item
cons vormt een paar van zijn 2 elementen

list bouwt lists:
 (list a1 a2 a3 ... an)
is
 (cons a1 (cons a2 (cons ... (cons an nil) ...)))

cond is als een case-statement:
 (cond (predicate1 expression1)
       (predicate2 expression2)
       ...
       (predicaten expressionn))

(define nil '())

Nu kunnen we het onderstaande wellicht snappen:

(define (map proc items)
  (if (null? items)
      nil
      (cons (proc (car items))
            (map proc (cdr items)))))

[2.2.1 p 105]

(define (filter predicate sequence)
  (cond ((null? sequence) nil)
        ((predicate (car sequence))
         (cons (car sequence)
               (filter predicate (cdr sequence))))
        (else (filter predicate (cdr sequence)))))
[2.2.3 p 115]

(define (enumerate-interval low high)
  (if (> low high)
      nil
      (cons low (enumarate-interval (+ low 1) high))))

[2.2.3 p 116]

(define (accumulate op initial sequence)
  (if (null? sequence)
      initial
      (op (car sequence)
          (accumulate op initial (cdr sequence)))))


(accumulate cons nil (list 1 2 3 4 5))
 geeft
(1 2 3 4 5)

(define (even-fibs n)
  (accumulate cons
              nil
              (filter even?
                      (map fib
                           (enumerate-interval 0 n)))))

[2.2.3, p 116]

(define (flatmap proc seq)
  (accumulate append nil (map proc seq)))

[2.2.3, p 123]

-----------------------------------------------------------------------

En nu de vraag: is

(define (even-fibs n)
  (accumulate cons
              nil
              (filter even?
                      (map fib
                           (enumerate-interval 0 n)))))

hetzelfde als

(define (even-fibs n)
  (filter even?
          (map fib
          (enumerate-interval 0 n))))

?

Groeten,

Joost

<<inline: signature.asc>>


Follow-ups:

Gerelateerd:


[ Date Index] [ Thread Index]