トップ «前の日記(2013-04-14(Sun)) 最新 次の日記(2013-04-16(Tue))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2013-04-15(Mon) 昨日の予報に反し、実によく晴れている。みたい

cdr の繰り返し

循環リストを手繰るために、 指定した回数 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や内容が変った場合はあしからず。

index.htmlは ここから。