僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
循環リストを手繰るために、 指定した回数 cdr する関数を 書いてみた。
(define cdnum (lambda (num list) (cond ((null? list) '()) ((zero? num) list) (#t (cdnum (- num 1) (cdr list))))))
gosh> (cdnum 0 '(1 2 3 4)) (1 2 3 4) gosh> (cdnum 1 '(1 2 3 4)) (2 3 4) gosh> (cdnum 3 '(1 2 3 4)) (4) gosh> (cdnum 8 '(1 2 3 4)) ()
scheme の循環リストの作り方は、 common lisp と少し違っていた。
gosh> (define foo (list 1 2 3 4)) gosh> (set! (cdr (cdr (cdr foo))) foo) #<undef>
ここでは cdnum が使えなかった。なぜか。
gosh> (set! (cdnum 4 foo) foo) *** ERROR: invalid application: (#f 4 #0=(1 2 3 4) #0#) Stack Trace:
gosh> foo #0=(1 2 3 4 . #0#)
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。