selflearn @ ウィキ

メモ(第1章)

最終更新:

kato

- view
メンバー限定 登録/ログイン
第1章で気付いた点・残しておきたい内容をここに書いています。


ifとcondの違い(2007/1/7)

p.10の脚注19で次のような説明があるけれど、これまでその違いが分からなかった。

ifとcondの違いは、condの説<e>は式の並びでよいことである。対応する<p>が真であれば、<e>は順に評価され、最後の式の値がcondの値として返される。しかしif式では、帰結部と代替部は単一の式でなければならない。

今日ようやく分かって、condではつまり次のような記述が許される(if式では許されない)ことが理解出来た。
(cond ((= a 1) (display a) (func a))
      (else (display "else") (func (- a 1))))
ポイントは、condにぶら下がるそれぞれのカッコの中で、
((条件) (式1) (式2) ...)
というように、複数の式を並列に書けている点。(式1)と(式2)は互いの評価結果に関係なく、同時に評価される。

同じことをif式でやろうとしても、(式1)は帰結部、(式2)は代替部として扱われてしまうため、処理が変化してしまう。
無理矢理次のようなソースにしたとしても、これでは警告が出て動かない。
(if (= a 1)
    ((display a) (func a))
    ((display "else") (func (- a 1))))
なぜかというと、(display aまたは"else")の返戻値(評価結果)を使ってfuncの評価結果を評価しようとしてしまっているから。displayの評価結果は#<void>なので、「存在しない関数を評価しようとした」という状態に陥ってしまう。

上記例のように途中の値を表示したい場合はifではなくcondを使うこと。
(ただしifにもメリットがあって、評価結果が真の時は偽のときに評価する式を一切評価しないですむ。問題1.6でその問題に触れている)

DrSchemeでスタックトレースを出力する方法(2007/1/7)

DrSchemeでスタックトレースを取得・表示する方法:

[言語]-[ティーチパックの追加...]でcalltrace.ssを追加する。
削除する場合は[言語]で同ファイルを削除するだけ。

error手続き(2007/1/13)

エラーメッセージを出力して終了させる場合はerror手続きを使う。スタックトレースとともに渡したエラーメッセージが表示される

gosh> (error "Error message" 2 3)
*** ERROR: Error Message 2 3
Stack Trace:
_______________________________________

このエラーの中に渡せる値の数、書式は特に決まっていないみたい。error内の値は評価されてからerror手続きに渡されるので、未定義の変数を渡したりするとそっちが問題のエラーが出力される。

lambdaの定義って?(2007/1/15)

Schemeを作ろう 第3回というページで、

lambdaはschemeの構文キーワードで、(lambda (引数リスト) ボディ) という式で無名関数を作ることができます(ホントはちょっと違うのだけど、この場合はまあそう思ってよいです)。

とあった。「ちょっと違う」とはどういうことだろう?そのままで考えていたんだけれど・・・。

タグ:

SICP scheme
ウィキ募集バナー