僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
特定のalistを消す。
(define rm_car
(lambda (num alist)
(cond
((null? alist) '())
((eq? num (car (car alist)))
(rm_car num (cdr alist)))
(else
(cons (car alist)
(rm_car num (cdr alist)))))))
(rm_car 3 '((1 . 3) (3 . 7) (2 . 5) (3 . 1))) ((1 . 3) (2 . 5))
alist の cdr を消すなら、 5行目 を ((eq? num (cdr (car alist))) にして s/_car/_cdr/g といったところか。
部分一致でなく完全一致。
コピペのためか、括弧の位置を間違えて
なかなか動かず、ひとしきり迷う。
(define rm_alist (lambda (anum dnum alist) (cond ((null? alist) '()) ((and (eq? anum (car (car alist))) (eq? dnum (cdr (car alist))) (rm_alist anum dnum (cdr alist)))) (else (cons (car alist) (rm_alist anum dnum (cdr alist)))))))
(rm_alist 3 5 '((3 . 5) (3 . 2) (5 . 5) (3 . 7) (5 . 3) (3 . 5) (3 . 3))) ((3 . 2) (5 . 5) (3 . 7) (5 . 3) (3 . 3))
and を or に変えると、
alist が根こそぎになって #t だけが返る。はてさてどうしたものか。
7行めと
9,10行めを
すげかえると、一致したものだけが返るようになった。
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。