Hatena::Groupsicp

a666666の日記 このページをアンテナに追加 RSSフィード

2009-12-26

L-99 はじめました

| 00:45 | L-99 はじめました - a666666の日記 を含むブックマーク はてなブックマーク - L-99 はじめました - a666666の日記 L-99 はじめました - a666666の日記 のブックマークコメント

g000001 さんにすすめられて、 L-99 を Scheme (Gauche) ではじめてみます。一日一問、パズルを楽しむ感じで。

L-99: Ninety-Nine Lisp Problems

P01 (*) Find the last box of a list.

| 00:45 | P01 (*) Find the last box of a list. - a666666の日記 を含むブックマーク はてなブックマーク - P01 (*) Find the last box of a list. - a666666の日記 P01 (*) Find the last box of a list. - a666666の日記 のブックマークコメント

問題

    Example:
    * (my-last '(a b c d))
    (D)

解答

(define (my-last l)
  (cond ((null? (cdr l)) l)
        (else (my-last (cdr l)))))

(my-last '(a b c d))
;; => (d)

(use gauche.test)
(test* "L-99 P01" '(d) (my-last '(a b c d)))
;; test L-99 P01, expects (d) ==> ok

さいしょ、

((null? (cdr l)) (car l)

って書いてしまって d だけかえってきて、なんか違うような?って思った。 (d) と d の差がいまいちピンとこない。あ、あとこれ空リスト渡すとうごかないな。


g000001 さんにコメントをもらって、 srfi-1 に last (last-pair) なんてのがあることを知ったのでソースを読んでみようと思って /opt/local/share/gauche/0.8.13/lib/srfi-1.scm をひらいたら残念な感じだった。。

g000001g0000012009/12/27 01:03伝統的なLISPだとlastは最後のコンスを返すんですよね。何故なのかはわからないのですが… (use srfi-1)(last '(a b c d));=>dだったりしますね、Schemeだと。
あと、()のcdrはエラーになるというのも伝統的なLISPとSchemeの主な違いですね。

a666666a6666662009/12/30 03:13なるほどー > 伝統的な LISP
srfi-1 に last ありましたか!そして last-pair なんてのもありました。