2011年4月26日火曜日

Scheme手習い Chapter 2 自分なりの理解、疑問点



再帰きた再帰! ヒャッハー!

lat?の定義について

;; p.16の定義
(define lat?
(lambda (l)
(cond ((null? l) #t) ;; もしも空リストなら真を返す。
((atom? (car l)) (lat? (cdr l))) ;; リストの最初の要素がアトムだったらlat?を残りのリストで呼びだす。
(else #f)))) ;; いずれでもでない場合、偽を返す。
;; 自分の定義
(define lat?
(lambda (l)
(cond ((null? l) #t) ;; もしも空リストなら真を返す。
((not (atom? (car l))) #f) ;; リストの最初の要素がアトムでなかったら偽を返す。
(else (lat? (cdr l)))))) ;; いずれでもない場合、lat?を残りのリストで呼びだす。
view raw latp.scm hosted with ❤ by GitHub

微妙な考えの違いが。本のがnotとかしてない分無駄がないように見えたり。
とりあえず本のコードはコメントアウトして自分で書いたのを使うようにしてみました。

p.23のmember?について
member?の定義の最初の質問の答えがnilとなっていたけどこれは偽かな?と思ったので修正して書きました。
非公式サポート情報の正誤表
があるようなので、なんか違うと思ったら見るようにします。

テストケースについて
再帰的に関数を呼びだしてる時、現在の値は?というのがいっぱい続いていて1つのケースの切れ目がわかりづらいかも。

再帰的な関数のデバッグの方法
本だと毎回呼び出した時の引数を書いてくれてる。
実際に実行する際も引数を見れた方がイメージつきやすい。
なのでデバッグの方法を調べてhigeponさんのところを参考にすると4つほどあるらしい
Gauche(Scheme) でデバッグをする4つの方法 - ひげぽん OSとか作っちゃうかMona-
  1. printデバッグ
  2. エラーポートに出力
  3. リーダーマクロ#?=を使う
  4. slibのtraceを使う

このどれかを使って呼び出される時の内容を見てみようと思います。
  • とりあえず読んでる時はソースに入れてしまって確認したら取り除いてコミット仕直しがいいかな?
  • trace等デバッグ用のコードは入れない方がいい?
  • デバッグ用のブランチを切る方がいいのかな?

名前に関する疑問
atomの略でa, latは何の略?、list of atomでList of ATomをとってるのかな?
;; lat?の引数がlなのはlistの略でしょうね、lat?に渡される引数がlatとは限らないためlat?の引数はlってことか!

関数定義について
func.scmに全部入れちゃうとだんだんでっかくなっちゃうかかな、という不安





0 件のコメント:

コメントを投稿