再帰きた再帰! ヒャッハー!
lat?の定義について
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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?を残りのリストで呼びだす。 |
微妙な考えの違いが。本のがnotとかしてない分無駄がないように見えたり。
とりあえず本のコードはコメントアウトして自分で書いたのを使うようにしてみました。
p.23のmember?について
member?の定義の最初の質問の答えがnilとなっていたけどこれは偽かな?と思ったので修正して書きました。
非公式サポート情報の正誤表
があるようなので、なんか違うと思ったら見るようにします。
テストケースについて
再帰的に関数を呼びだしてる時、現在の値は?というのがいっぱい続いていて1つのケースの切れ目がわかりづらいかも。
再帰的な関数のデバッグの方法
本だと毎回呼び出した時の引数を書いてくれてる。
実際に実行する際も引数を見れた方がイメージつきやすい。
なのでデバッグの方法を調べてhigeponさんのところを参考にすると4つほどあるらしい
Gauche(Scheme) でデバッグをする4つの方法 - ひげぽん OSとか作っちゃうかMona-
- printデバッグ
- エラーポートに出力
- リーダーマクロ#?=を使う
- slibのtraceを使う
このどれかを使って呼び出される時の内容を見てみようと思います。
- とりあえず読んでる時はソースに入れてしまって確認したら取り除いてコミット仕直しがいいかな?
- trace等デバッグ用のコードは入れない方がいい?
- デバッグ用のブランチを切る方がいいのかな?
名前に関する疑問
atomの略でa, latは何の略?、list of atomでList of ATomをとってるのかな?
;; lat?の引数がlなのはlistの略でしょうね、lat?に渡される引数がlatとは限らないためlat?の引数はlってことか!
関数定義について
func.scmに全部入れちゃうとだんだんでっかくなっちゃうかかな、という不安
0 件のコメント:
コメントを投稿