6章の練習問題とか

今回はappend2、reverse、find、length、filterを。
それぞれ名前をMyAppend、MyReverse、MyFind、MyLength、MyFilterに変更してます。

(define MyAppend
  (lambda (a b)
    (cond
     ((null? a) b)
     (else (cons (car a) (MyAppend (cdr a) b))))))

(define MyReverse
  (lambda (l)
    (cond
     ((pair? (cdr l)) (MyAppend (MyReverse (cdr l)) (list (car l))))
     (else (list (car l))))))

(define MyFind
  (lambda (pred l)
    (cond
     ((null? l) #f)
     ((pred (car l)) (car l))
     (else (MyFind pred (cdr l))))))

(define MyLength
  (lambda (l)
    (cond
     ((null? l) 0)
     (else (+ 1 (MyLength (cdr l)))))))

(define MyFilter
  (lambda (pred l)
    (cond
     ((null? l) l)
     ((pred (car l)) (cons (car l) (MyFilter pred (cdr l))))
     (else (MyFilter pred (cdr l))))))

なんか、本書の通りだと、Gauche組込みのappend、reverseと違う値になったから、ちょっといじってみた。

再帰の終了条件が

  • (null? l)
  • (null? (cdr l))
  • (pair? l)
  • (pair? (cdr l))

のどれなのか混乱する><