LoginSignup
2
1

More than 5 years have passed since last update.

Scheme手習いメモ (3章 - 偉大なるCons)

Last updated at Posted at 2012-12-26

rember

アトム a と ラット lat を引数にとり、ラットに含まれる最初の a を取り除いたラットを返す関数 rember を定義する。

復習すると、アトムはリストではないなんらかの要素で、ラットは、アトムからなるリストだった。ちなみに、

「rember」とは remember a member (メンバーを除く) という意味

らしいです。

rember.scm
(define rember
  (lambda (a lat)
    (cond
      ((null? lat) (quote ()))
      ((eq? (car lat) a) (cdr lat))
      (else (cons (car lat)
                  (rember a (cdr lat)))))))

(define a 'and)
(define lat '(bacon and potatos))
(print (rember a lat))

出力は (bacon potatos)cons を使った再帰のしかたが分かった。

firsts

リストのリストを受け取り、各々のリストの最初の要素からなるリストを生成する関数 firsts を定義する。

firsts.scm
(define firsts
  (lambda (l)
    (cond
      ((null? l) quote ())
      (else (cons (car (car l))
                  (firsts (cdr l)))))))

(print (firsts '((a b) (b c) (d e))))

出力は (a b d) 。再帰は自然にしろと言われた。では、不自然な再帰というのはどういうものなのだろう。

insertR

アトム new, アトム old, ラット lat を引数にとり、ラットに出てくる最初の old の右に new を挿入したラットを返す関数 insertR を定義する。

insertR.scm
(define insertR
  (lambda (new old lat)
    (cond
      ((null? lat) (quote ()))
      (else (cond
              ((eq? (car lat) old)
               (cons old
                     (cons new (cdr lat))))
              (else (cons (car lat)
                          (insertR new old
                                   (cdr lat)))))))))

(define new 'topping)
(define old 'fudge)
(define lat '(ice cream with fudge for dessert))
(print (insertR new old lat))

出力は (ice cream with fudge topping for dessert)

multirember

rember はラットから特定の要素をひとつだけ削除する関数であった。ラットから特定の要素を全部削除する関数 multilember を定義する。

(define multirember
  (lambda (a lat)
    (cond
      ((null? lat) (quote ()))
      (else
        (cond
          ((eq? (car lat) a)
           (multirember a (cdr lat)))
          (else (cons (car lat)
                      (multirember a
                                   (cdr lat)))))))))

(define a 'cup)
(define lat '(coddee cup tea cup and hick cup))
(print (multirember a lat))

出力は (coddee tea and hick)

multisubset

3章最後。アトム new, old とラット lat を引数にとり、ラットに含まれる old全て new に置き換える関数を定義する。

multisubset.scm
(define multisubset
  (lambda (new old lat)
    (cond
      ((null? lat) (quote ()))
      (else
        (cond
          ((eq? (car lat) old)
           (cons new
                 (multisubset new old
                              (cdr lat))))
          (else (cons (car lat)
                      (multisubset new old
                                   (cdr lat)))))))))


(define old 'fudge)
(define new 'topping)
(define lat '(fudge cream with fudge for dessert))
(print (multisubset new old lat))

出力は (topping cream with topping for dessert)

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1