ラベル TheLittleSchemer の投稿を表示しています。 すべての投稿を表示
ラベル TheLittleSchemer の投稿を表示しています。 すべての投稿を表示

2011年8月9日火曜日

Scheme手習い Chapter 10



ついに10章まで来てしまった。この章で最後。手習いを終えたら修行が待っている。


いつも通り読みながらの気づき等


読みながらのメモ




  • エントリ(entry)とは(集合のリスト ←と同じ長さの値のリスト)のペア

  • (new-entry setl l)でエントリを作れる

  • lookup-in-entryはnameとentryとentry-fを取る


    • entryの名前の集合からnameを探して対応する値を返す

    • entryの中でnameが見つから無かった時はentry-fにnameを渡して呼び出す

    • entryをnamesとvaluesに分解して、lookup-in-entry-helpを呼んでいる



  • テーブル(table)はエントリ(entry)のリスト


    • 環境ともいう



  • extend-tableはエントリを古いテーブルの先頭に付け加え、新しいテーブルを作る

  • lookup-in-tableはnameとtableとtable-fを取る


    • テーブルの中の先頭のエントリから順にnameの値を探して対応する値を返す

    • tableの中でnameが見つから無かった時はtable-fにnameを渡して呼び出す

    • tableから先頭のエントリを取り出してlookup-in-entryを呼んでいる

    • 先頭のエントリの中でnameが見つからなかった時に次のエントリを探せるように、entry-fにtableへの参照を持ったクロージャを渡している



  • 式(Expression)


    • eはexpressionの略

    • タイプが6つある

    • *const

    • *quote

    • *identifier

    • *lambda

    • *cond

    • *application

    • タイプを関数、actionとして表現する

    • 8章のatom-to-functionのようにexpression-to-actionを定義

    • atomならatom-to-action

    • listならlist-to-action


      • carを見て判断





  • expression-to-actionがきちんと動作するならvalueとmeaningを定義出来る

  • valueはSchemeのevalと同じ。引数で式を取る


    • meaningに式と空の環境を渡して呼び出す



  • meaningは式と環境を引数に取る


    • expression-to-actionでタイプの表現、関数を取り出す

    • 式と環境を渡しその関数を呼び出す



  • タイプを表現するアクション達

  • 非基本関数と基本関数


    • 基本関数は何をするものか知っている関数

    • 非基本関数は引数と関数本体によって定義される関数

    • 仮引数と関数本体を覚えておく必要がある。

    • (lambda (x) x)でいうcdrの((x) x)の部分

    • それに加えテーブルを覚えておく。

    • この3つでクロージャレコード



  • evcon


    • null?の質問がないまま再帰しているのでquestion-ofが真になるlineが無かったらエラーが出るため、少なくとも1つの質問は真である必要がある。



  • evlis


    • listの全ての意味をmeaningで求めて新しいlistにして返す、のかな



  • apply


    • primitiveかそうでないか、でapply-primitiveとapply-closureに処理を振り分けてる。




気づき疑問等




  • extend-tableで新しいエントリを先頭につけるのは、carを使って先頭から探るため?

  • p183のadd1?sub1?はadd1、sub1の間違い?

  • *identifierの中のinitial-tableは…

  • evconはeval-condの略?

  • evlisはeval-list?

  • :atom?をatom?だと思っててハマった orz

  • あと:atom?がキーワードとして認識されちゃったのでmy-atom?に変更

  • ページの順番通りに*applicationを定義した後applyを定義してハマった。


    • 最初に*applicationを定義する時、中でapplyを使ってる

    • 自前applyを定義する前に*applicationを定義するとGaucheに元からあるapplyを見ちゃう

    • 自前applyを定義するのを*applicationの前にもってきて解決



  • defineが出てきてないのに「再帰はYコンビネータによって得られるので、必要はありません。」という答え方は素敵だと思った


    • 全部lambdaで書けばdefine使わなくてok的な

    • でも「Scheme修行も見てください。」とのこと。



  • 「Yコンビネータによる変形を行うとインタプリタ上でインタプリタを走らせる事が可能である」


    • 前の章で出てきたYコンビネータがしっかりとインタプリタで動く事を確認してちょっと感動。動きを追ってみたい。

    • loopはYコンビネータで出来るし、evalは今作った。後はreadとprintだけ用意してやればREPLが出来る!?




感想


最後の章でもapplyのところで処理を分けたり、table関連でうまく抽象化しててすごく分かりやすい。


lookup-in-tableの中でlookup-in-entryに渡すentry-fのクロージャ(cdr table)の部分が好き。



(lambda (name)
(lookup-in-table name (cdr table) table-f))


この10章だけでも何回も読めそう。


冒頭にある読者へのガイドラインでは



急いでこの本を読まないでほしい。注意深く読むこと。有益なヒントがテキスト全体にちりばめてある。この本を2回以下で読み切ろうとしないこと。系統的に読むこと。ある章が完全には理解できなければ、次の章はもっと理解できなくなる。質問はだんだん難しくなるように並べてある。前の方が解けないと、後ろのほうはもっと難しい。

と書いてあるけど、もう一周読んでみても楽しめそうです。


前半部分は何度も読んでるけど8, 9, 10とそこらへんは理解度足りてない感じもするのでもうちょい読み込む予定…


最初にエントリをあげたのが2011年4月14日で、今は8月10だから大体4ヶ月ほど。


特にYコンビネータのところでコミットの感覚が20日以上あいてるのでそこが一番難しかったような。


前の方から後ろに行けばいくほど楽しかったです。





2011年7月3日日曜日

evens-only*&co



ちょっと時間があったのでダラダラと書いてみたのをgistにあげてみました。






2011年6月21日火曜日

Scheme手習い Chapter 7



気付きとか




  • 集合の例として出ているものについて(p.113)


    • (apple peaches apple plum)や(apples peaches pears plums)などリストの中の要素に複数形のものがある。

    • set?がどんな関数か考えさせるために複数形の名詞を入れてるのかなぁ(複数形の名詞だからといってsetなわけではないみたいな)



  • eq?をequal?使って書き直したっけ?


    • p.113とp.115でmember?とかmultirember?の定義をequal?使って書き直したって記述があるんだけど記憶になかった orz



  • makesetのテストケースについて


    • 最初のmakesetの定義だと結果はp.114の最初の質問の答え(apple peach pear plum lemon)と同じ結果にならない。

    • 最初のmakesetの定義だと結果はp.114の最後の質問の答え(pear plum apple lemon peach)になる。

    • 第2のmakesetの定義だとその逆で、最初の質問の答えになるが、最後の質問の答えと同じ結果にならない。

    • とりあえず最後の定義で通るように修正。



  • subset?の2つ目の質問でandと5の間にスペースがあいてないのは間違いかな? (p.115)

  • intersect?の定義のところで、最初の質問の答えが#fじゃなくてnilになってるのが所々ある。間違い?

  • p120のfirst, secondの定義では引数がp(pair)、p121のthirdの定義だとl(list)。引数の名前付けも中身に対応してて分かりやすい。

  • 集合とか、そこらへんの数学出てくるとお手上げ。


    • 情報数学入門でも読むか… orz



  • fullfun?を、最初



(define fullfun?
(lambda (fun)
(and (set? (firsts fun))
(set? (seconds fun)))))


と書いたんだけど、funが渡されてくる前提があるから最初の質問はいらなかった。


感想




  • 前に定義した関数を使って簡潔に書ける


    • makesetでmultirember

    • eqset?の中のsubset?

    • intersectallの中でintersect



  • 表現から部分を取り出す補助関数first, second, buildを使ってすっきり書ける


    • 前章でも表現から部分を取り出す補助関数を定義して抽象化してた。(1st-sub-exp, operatorなど)


      • 読み易くなって変更にも強い!



    • revrelで補助関数を使った定義と使わない定義を見比べると超違う


      • 使わないとき







(define revrel
(lambda (rel)
(cond ((null? rel) '())
(else (cons (cons (car (cdr (car rel)))
(cons (car (car rel))
'()))
(revrel (cdr rel)))))))








      • build, first, second使うと





(define revrel
(lambda (rel)
(cond ((null? rel) '())
(else (cons (build (second (car rel))
(first (car rel)))
(revrel (cdr rel)))))))








      • 更にrevpairを使うとすっきり





(define revrel
(lambda (rel)
(cond ((null? rel) '())
(else (cons (revpair (car rel))
(revrel (cdr rel)))))))




  • fullfun?も


    • (set? (seconds fun))か(fun? (revrel fun))で。




なんというか一行文の補助関数がある/なしで大分読み易さが違うなって印象でした。


前章でも出てきた第8の戒律



表現から抽象化するに際し、補助関数を使用すべし。



はめっちゃ大事ですね。


今までの章で書いたのも補助関数を使うと読み易くなるのだろうか。





2011年5月30日月曜日

Scheme手習い Chapter 6(再)



算術式とは


(数を含む)アトムか、2つの算術式を+か×か↑で結合したもの


算術式の例として




  • 1 (アトム)

  • 3 (アトム)

  • 1 + 3(1と3、2つの算術式を+で結合)

  • 1 + 3 × 4(1と3、2つの算術式を+で結合した算術式と、4を×で結合)

  • cookie(アトム)


算術式の表現


「カッコはそこにないと思えばいいでしょう。」


カッコなんて飾りです。


(n + 3)というS式でn + 3を表現すると次のような利点が。




  • S式なので関数の引数とすることが可能。

  • 構造的にn + 3と似てる。


算術式と算術式が結合したら?



  • 3 + 4 × 5は(3 + (4 × 5))


    • 普通の入れ子だ!




最初に定義したnumbered?


cookieなどのシンボルや"文字列"もアトムなので算術式。


numbered?は、算術式の表現(S式)が+×↑を除いて数だけを含んでいるかどうかを決める。




  1. アトムどうか

  2. 演算子が+×↑かどうか

  3. 第一被演算子と第二被演算子をnumbered?で調べる。


簡素化したnumbered?


aexpが算術式だと分かっているなら+×↑とアトムのみ含まれるという事がわかる。


なので




  1. もしもaexpがアトムなら数かどうか調べる。

  2. 数でないなら、第一被演算子と第二被演算子をnumbered?で調べandを取る。


という風に簡素化出来る。


value


数値式である算術式の自然な値と思われるものを返す。




  • 算術式が数ならその数自身。

  • +や×や↑で結合されているなら、2つの部分式に対してvalueを再帰していけばいい。


    • 性質が同じだから再帰出来る!(2つの部分式はどっちも算術式)




算術式の表現を変える


補助関数を定義する

部分式を取り出す補助関数、1st-sub-expと、2nd-sub-expを定義する。


演算子を取り出す補助関数、operatorも定義する。


補助関数は表現を隠す

実際の算術式の表現を扱うのは補助関数。


なのでvalueで直接表現を触らずに補助関数を使うようにすると、表現の変更の影響が少くなる。(補助関数を書き換えるだけ)


抽象化出来る!


実は数も表現だった


4は4という概念を表す表現。アラビア数字の記号。


別に4を表すなら空リスト4つのリストでもいいんじゃね?


数を抽象化する補助関数

sero? edd1 zub1を定義


それを使って+を書きなおすと数の表現が()のリストで出来る。


感想


表現を直接使わないよう、補助関数を使い抽象化すると表現の変更が楽。


算術式の部分式も算術式だから再帰で処理していける。


補助関数スゴいよぅ





2011年5月20日金曜日

Scheme手習い Chapter 6



この章では抽象化っぽい事をやってるのかな?とりあえず気付き等を。


この章では算術式(簡単な計算式とか?)をS式で表現して、計算式を扱う手続きを抽象化


気付き


算術式だからarithmetic expressionでaexp、number expressionでnexp?




  • S式で算術式を表現すると嬉しい事


    • S式なので関数の引数とする事が可能である。

    • 構造的にn + 3と(n + 3)が似てる。(カッコでくくってあるだけだもんね)

    • 先頭に+を持ってきたら(+ n 3)まんまLisp



  • numbered?は


    • 演算子の+, *, exptを除いて数だけを含んでいるかを調べる



  • value


    • nexpを評価出来たw すごいw

    • 補助関数を使うと定義がすっきり。




感想




  • ちょっとテストかきづらかったかも。算術式を別形式で書いたり、戻したりで…

  • 簡単な算術式なら演算出来るようになった!ふつうの計算なら自分の定義したやつで出来る。嬉しい。

  • 実際のデータ構造から演算子や被演算子を取り出す手続きを補助関数を定義する事で抽象化しているのかな?

  • 算術式のフォーマットを変えても補助関数を書きなおすだけでvalueが動いた。すごい。

  • 最終的に数も抽象化して、'()の含まれてるリストで数を表現しててなんじゃこりゃと思ったw






2011年5月16日月曜日

Scheme手習い Chapter 5



3でlatの再帰、4で数の再帰、5はリストの再帰。




  • ここで第1の戒律、第4の戒律が最終版に。アトムのリストlatの場合、数nの場合、S式のリストの場合の再帰の掟が決まる。

  • *関数は'(), (cons a l), (cons l l)のいずれかの上で動くから、3つ質問をする。

  • equal?を定義した

  • equal?を使って任意のS式とリストを取るremberに書き直した

  • 第6の掟「関数が正しいときのみ簡素化せよ。」が登場。


    • 書いてて今までの章よりも関数のcondが多かった印象。



  • eqan?以外の関数の中のeq?や=に関してはequal?で一般化出来る。


気付き感想




  • 最初はアトムから始まり、cons、lat・数・リストの再帰と来てなんだか少しずつ扱えるデータが増えてきたような。

  • それに伴ってeq?, =, eqan?, equal?とより多くのデータを扱える関数を使ってremberを定義しなおしたり、面白い!

  • equal?を使う事で処理が簡素化出来て理解しやすくなった。すごい。

  • p91の注に出てくる話(andもorもcondの省略形として書く事は出来る)がちょっと発想の転換な気がして面白かった。





2011年5月8日日曜日

Scheme手習い Chapter 4

Chapter 3までは主にリストを再帰させてたけど今度は数の再帰。

自分の中でのまとめ
  • リストの時はリストが空かどうかを判定し再帰を終わらせるためにnull?を最初に質問したが、数で再帰する場合は再帰を終わらせるためzero?でゼロかどうか質問する。
  • 第5の戒律はわかりやすい。数で再帰する場合、再帰の終わりでは今までの計算を変えないような値を返し、リストで再帰する時はリストの終端nilを返す。
  • number?は基本関数。add1 sub1 zero? car cdr cons null eq? atom?も基本関数。

気をつけた事
  • +, -, *, /, <, >, =はoを付けo+, o-, o*, o/, o<, o>と書いた。exptはo-exptと、o-を付けた。でもlengthはo-付けずにそのまま書いた。
    • 「はじめに」p.xiiiを見るとsub1とadd1がないので組込み関数+と-を使って定義する。
    • +や-を直接書くと循環的な定義になってしまうのでo+, o-と書く。
    • という事はR5RSで定義されてる関数はo-つけたりoつけて書いた方がよいのだろうか?

疑問点
  • 基本関数って?「はじめに」p.xiiに出ているSchemeの一部の機能の中で特殊形式じゃない関数の事を基本関数と呼ぶのかな?
  • p79でもcondでnull?か調べてelseで分岐した後またcondしてる。これも簡素化してないのは3章p42「そのときに関数の構造が引数の構造と一致しないからです」という事なのだろうか。
  • p80で同じatomかの判定にeq?を使っているがこれだと同じシンボルか判定出来ても同じ数か判定出来ないのでは?(p12参照。実際eq?の引数に数が来てもかまわない、と注釈に書いてはいるが。)eqan?の間違い?

gitの使い方
とりあえずこんな感じの事をした。前にも1回やったような気がする。忘れそうなのでメモ。
こまめにpushしない方がいいかな?ちょっと悩みますね。

そんな感じです。ext/charconv/test.scmについては別途読んでエントリあげてみようかな、と。

2011年5月6日金曜日

テストの件



id:yamanetoshi さんのところでgauche.testについて触れられてたので自分でも試行錯誤してみた。


gauche.test の件 - /var/log/messages


GWなのでよく理解しないままマクロでコネコネした結果こうなったとさ。


f-testでテストしたい関数fと[answer args ...]のリストをつらつら書くとargs ...をfに与えた時の結果がanswerと一緒かテストしてくれます。ついでなんで関数名でtest-sectionも吐くように。argsは勝手にquoteするようにしてみた。でもこれだと数がargsやanswerな時まずいかもなぁ。まぁいっか。後で考える。



(use gauche.test)
(add-load-path ".")
(load "func")

(define-syntax test-q&a (syntax-rules () ((_ q a) (test* (quote q) a q))))
(define-syntax f-test
(syntax-rules ()
((_ f (a args ...) ...)
(begin
(test-section (symbol->string (quote f)))
(test-q&a (f (quote args) ...) (quote a)) ...))))

(test-start "chapter 3")

(f-test
rember
[(lamb chops and jelly) mint (lamb chops and mint jelly)]
[(lamb chops and flavored mint jelly) mint (lamb chops and mint flavored mint jelly)]
[(bacon lettuce and tomato) toast (bacon lettuce and tomato)]
[(coffee tea cup and hick cup) cup (coffee cup tea cup and hick cup)]
[(lettuce and tomato) bacon (bacon lettuce and tomato)]
[(bacon lettuce tomato) and (bacon lettuce and tomato)]
[(soy and tomato sauce) sauce (soy sauce and tomato sauce)])

(f-test
firsts
[(apple plum grape bean) ((apple peach pumpkin)
(plum pear cherry)
(grape raisin pea)
(bean carrot eggplant))]
[(a c e) ((a b) (c d) (e f))]
[() ()]
[(five four eleven) ((five plums) (four) (eleven green oranges))]
[((five plums) eleven (no)) (((five plums) four)
(eleven green oranges)
((no) more))])

(f-test
seconds
[(b d f) ((a b)
(c d)
(e f))])

(f-test
insertR
[(ice cream with fudge topping for dessert)
topping fudge (ice cream with fudge for dessert)]
;; Gauche
;; [(tacos tamales and |jalape&#241;o| salsa) |jalape&#241;o| and (tacos tamales and salsa)]
[(tacos tamales and jalapeno salsa) jalapeno and (tacos tamales and salsa)]
[(a b c d e f g d h) e d (a b c d f g d h)])

;; my insertL test
(f-test
insertL
[(ice cream with topping fudge for dessert) topping fudge (ice cream with fudge for dessert)]
[(tacos tamales jalapeno and salsa) jalapeno and (tacos tamales and salsa)]
[(a b c e d f g d h) e d (a b c d f g d h)])

(f-test
subst
[(ice cream with topping for dessert) topping fudge (ice cream with fudge for dessert)])

(f-test
subst2
[(vanilla ice creamwith chocolate topping)
vanilla chocolate banana (banana ice creamwith chocolate topping)])

(f-test
multirember
[(coffee tea and hick) cup (coffee cup tea cup and hick cup)])

;; my multiinsertR test
(f-test
multiinsertR
[(a b c d e f g d e h) e d (a b c d f g d h)]
[(w r y y y y y y y y y y) y y (w r y y y y y)])

(f-test
multiinsertL
[(chips and fried fish or fried fish and fried) fried fish (chips and fish or fish and fried)]
[(j o j o) j o (o o)])

(f-test
multisubst
[(o p p a o) o i (i p p a i)]
[() o i ()])

(test-end)


なんかだ随分寂しい感じ。すっかすか。


実行結果がこれ。diffとったけど普通に最初書いたテストと変わらなかった。



> gosh 3.scm
Testing chapter 3 ...
<rember>-----------------------------------------------------------------------
test (rember 'mint '(lamb chops and mint jelly)), expects (lamb chops and jelly) ==> ok
test (rember 'mint '(lamb chops and mint flavored mint jelly)), expects (lamb chops and flavored mint jelly) ==> ok
test (rember 'toast '(bacon lettuce and tomato)), expects (bacon lettuce and tomato) ==> ok
test (rember 'cup '(coffee cup tea cup and hick cup)), expects (coffee tea cup and hick cup) ==> ok
test (rember 'bacon '(bacon lettuce and tomato)), expects (lettuce and tomato) ==> ok
test (rember 'and '(bacon lettuce and tomato)), expects (bacon lettuce tomato) ==> ok
test (rember 'sauce '(soy sauce and tomato sauce)), expects (soy and tomato sauce) ==> ok
<firsts>-----------------------------------------------------------------------
test (firsts '((apple peach pumpkin) (plum pear cherry) (grape raisin pea) (bean carrot eggplant))), expects (apple plum grape bean) ==> ok
test (firsts '((a b) (c d) (e f))), expects (a c e) ==> ok
test (firsts '()), expects () ==> ok
test (firsts '((five plums) (four) (eleven green oranges))), expects (five four eleven) ==> ok
test (firsts '(((five plums) four) (eleven green oranges) ((no) more))), expects ((five plums) eleven (no)) ==> ok
<seconds>----------------------------------------------------------------------
test (seconds '((a b) (c d) (e f))), expects (b d f) ==> ok
<insertR>----------------------------------------------------------------------
test (insertR 'topping 'fudge '(ice cream with fudge for dessert)), expects (ice cream with fudge topping for dessert) ==> ok
test (insertR 'jalapeno 'and '(tacos tamales and salsa)), expects (tacos tamales and jalapeno salsa) ==> ok
test (insertR 'e 'd '(a b c d f g d h)), expects (a b c d e f g d h) ==> ok
<insertL>----------------------------------------------------------------------
test (insertL 'topping 'fudge '(ice cream with fudge for dessert)), expects (ice cream with topping fudge for dessert) ==> ok
test (insertL 'jalapeno 'and '(tacos tamales and salsa)), expects (tacos tamales jalapeno and salsa) ==> ok
test (insertL 'e 'd '(a b c d f g d h)), expects (a b c e d f g d h) ==> ok
<subst>------------------------------------------------------------------------
test (subst 'topping 'fudge '(ice cream with fudge for dessert)), expects (ice cream with topping for dessert) ==> ok
<subst2>-----------------------------------------------------------------------
test (subst2 'vanilla 'chocolate 'banana '(banana ice creamwith chocolate topping)), expects (vanilla ice creamwith chocolate topping) ==> ok
<multirember>------------------------------------------------------------------
test (multirember 'cup '(coffee cup tea cup and hick cup)), expects (coffee tea and hick) ==> ok
<multiinsertR>-----------------------------------------------------------------
test (multiinsertR 'e 'd '(a b c d f g d h)), expects (a b c d e f g d e h) ==> ok
test (multiinsertR 'y 'y '(w r y y y y y)), expects (w r y y y y y y y y y y) ==> ok
<multiinsertL>-----------------------------------------------------------------
test (multiinsertL 'fried 'fish '(chips and fish or fish and fried)), expects (chips and fried fish or fried fish and fried) ==> ok
test (multiinsertL 'j 'o '(o o)), expects (j o j o) ==> ok
<multisubst>-------------------------------------------------------------------
test (multisubst 'o 'i '(i p p a i)), expects (o p p a o) ==> ok
test (multisubst 'o 'i '()), expects () ==> ok
passed.


f-testとかも適当に名前つけちゃった。どうなんだろこれ。なんか分かりづらくなってしまったような気がしないでもない。





2011年4月26日火曜日

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



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

lat?の定義について

微妙な考えの違いが。本のが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に全部入れちゃうとだんだんでっかくなっちゃうかかな、という不安





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

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

lat?の定義について

微妙な考えの違いが。本のが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に全部入れちゃうとだんだんでっかくなっちゃうかかな、という不安

2011年4月14日木曜日

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

自分なりの理解
  • 最後に?が付く関数は#tか#fを返す
  • carとcdrは空でないリストについてのみ定義される
    • 空でないリストのcdrは常に別のリストになる
  • consの引数は2つ、第2引数はリストでなければならない。結果はリストになる。
    • 疑問点に書くべきかと思うけどこっちで。p8で「実際、すべての値aとbにうまく働いて」と書かれているが、第2引数がリストでない場合はリストが返るのか気になった。どうやらGaucheでは第2引数がリストでない場合はpairであってlistでないらしい。
  • null?はリストに対してのみ定義される。(が実際、空リスト以外は偽になる。)
  • eq?は2つの引数を取る。どちらも数でないアトムでなければならない。(が実際、数が来てもかまわない。)
疑問点
  • Q. carとcdrの由来
  • Q. なぜS式?
    • A. SはSymbolのS.
  • Q. ググったんだけどS式以外にもM式ってあるらしい。M式って?
    • A. MはMetaのM.
  • Q. なぜSchemeはM式ではなくてS式?
  • Q. なんでS式にはatomとlistしかないの?
  • Q. predicateに?を付けるのはどの言語由来?
  • Q. 実際consがどんなa bでもいいのは何故?
    • Q. pairはLispの世界では一般的じゃないの?
    • Q. 上でも書いたけどconsの第2引数がリストでない場合どうなるの?
  • Q. eq?の引数に数でないアトムがこなければならない理由って何でしょうか?
    • Q. 実装上の問題? シンボルや関数へのポインタ値と数を比べた時、同じになってしまう事があるから?