読者です 読者をやめる 読者になる 読者になる

やろーじだい

ブログです

Aizu SICP 第一回

 昨日は第一回 Aizu-SICP (読む会) を行った。 10 人集った。

タイムテーブル

  • 19:05 ~ 19:25: 読 P1~9 「1.1.3 組み合わせの評価」 前まで
  • 19:25 ~ 19:40: 質疑
  • 19:45 ~ 20:15: 読 P10~22 「1.1.7 ニュートン法による平方根」 前まで
  • 20:20 ~ 20:55: 質疑

読書内容

 参加者の @mizuki_sonoko さんが読んだ範囲をリアルタイムでまとめていたので貼る。 SICPを読む会に参加した
 練習問題に関しては,次回の読む会で答え合わせをするので簡単なコメントに留める。

1 手続きを用いた抽象化の構築

 計算プロセスについて学習して行く。プロセスは抽象的な存在であり別な抽象物であるデータを操作する。これはプログラング言語によって記号的表現で組み立てられる。そのプログラング言語には Lisp を用いる。

Lisp がメインストリームの言語でないとしたら、なぜそれをプログラミングの考察のための枠組みとして使うのでしょうか。それは、この言語が独特な特徴を持っているため、プログラミングの重要な構成とデータ構造について学び、それらを支える言語的特性と結びつけるのにとても便利な媒体だからです。 これらの特性の中でも最も意義深いものは、プロセスの Lisp による記述 (これは手続き (procedure) と呼ばれます) が、それ自身 Lisp のデータとして表され、 操作できるということです。これが重要なのは、“受動的な” データと “能動的 な” プロセスという伝統的な区別を曖昧にする能力を使った強力なプログラム設計のテクニックが存在するからです。これから見ていくように、Lisp は手続きをデータとして扱う柔軟性のおかげで、これらのテクニックを探求するのに 最も便利な言語のひとつになっています。手続きをデータとして表現する能力は、コンピュータ言語を支えるインタープリタコンパイラのような、ほかの プログラムをデータとして操作しなければならないプログラムを書くのにも、 Lisp をとても優れたものにしています。それに、こういったことを考えに入れなくても、Lisp でのプログラミングは本当に楽しいのです。

1.1 プログラミングの要素

 強力な言語は,3つのメカニズムである基本式・組み合わせ方法・抽象化方法がある。基本式は言語によって提供されている数値や関数などで,組み合わせと抽象化方法は基本式を組み合わせ,それに対して名前を付けるということが最も単純な例だと考えられる。

1.1.1 式

 特になし。

1.1.2 命名と環境

 値という単語からはイメージしづらいが, Lisp では手続きも値である。  変数と値はただのペアであり,変数は箱のようなものではない。

1.1.3 組み合わせの評価

 Lisp の基本は (f a1 a2 ... an) という式に対して,まず f を評価して手続きを取り出し,a1 a2 ... an を順に評価した結果を手続きに渡す。特殊形式はこの評価の規則に沿わないものである。

1.1.4 複合手続き

 関数では外の環境を引きついで,仮引数の名前を使ってローカルな環境を作成している。

1.1.5 手続き適用の置換モデル

 特になし。

1.1.6 条件式と述語

 and や or が特殊形式であることは注目する点である。これは C などと同様である。C における if( p1 && p2 ) で, p1 が偽だった場合は p2 は実行されない。

練習問題 1.1

 特になし。

練習問題 1.2

 特になし。

練習問題 1.3

 特になし。

練習問題 1.4

 式が手続きを返す例である。

練習問題 1.5

 if の評価規則が非常に重要である。

質疑まとめ

 以下は決められた範囲を読んだ上でその後疑問点を誰かが挙げ,誰かが答えるという形で質疑応答を行った。読んだ部分の内容だけでなく LispScheme に関する話が多かった。現状の知識でのやりとりであるため間違いが含まれている可能性が高い。また,ここではの話題はあくまで Scheme における話,さらには Racket 特有の話である場合があり Lisp 全般に共通するとは限らない。(Scheme 特有の話としては #t#f が,Racket 特有の話としては #<void> などが良い例である。)

  • difine とは何か? 関数?

 特殊形式であり関数ではない。 (多分) マクロで定義されており,グローバル環境に値とシンボルの組み合せを追加するようなもの。特殊形式自体は値を持たない。(> define) また評価規則が通常とは違っている。特殊形式には処理系によって提供されているもの (if など) の他に,マクロを用いることで作成できる。つまりマクロは評価規則を操作できると考えることができる。

  • ここでいう式とは?

基本的な式のひとつとして,数値があります
基本的な手続きを表す式 (例えば +*) と組み合わせることで複合式を作り P6

  • Racket とは何か?

Racket is a full-spectrum programming language. It goes beyond Lisp and Scheme with dialects that support objects, types, laziness, and more. Racket enables programmers to link components written in different dialects, and it empowers programmers to create new, project-specific dialects. Racket's libraries support applications from web servers and databases to GUIs and charts. http://racket-lang.org/

 私は Scheme の処理系のひとつという認識だったが,「Scheme の仕様を満たした上で拡張された別な言語」という認識の方が正しいかもしれない。

  • definecond 式で条件に当てはまらなかった場合はなにを返しているのか

 Racket では #<void> というものを返しているようだ。参考 Scheme の仕様上, #f 以外は全て真として扱われるため注意が必要な場面があることが予想できる。

  • 適用順序評価と遅延評価は同じものであるか?

 正規順序評価の方が遅延評価に近いものである。ただし全くのイコールではない (はずである)。この辺りの理解は正確でない。遅延評価は引数の評価を遅らせることを指し,正規順序評価はある式を,ある一つの値まで評価する際の流れを定義したものだと考えている。

  • 環境とは?

値と記号を関連づけ,後から取り出すことができるということは,名前とオブジェクトのペアを記録しておくために何らかのメモリを持っておかないといけません。このメモリは環境 (environment) と呼ばれます P9

  • +-define することは可能か?

 Lisp における +- というのは,ひとつの名前とオブジェクトの組み合わせにすぎないため容易に可能である。ただしインタプリタ上で (define + -) を行った場合,他で + の処理を別な名前で定義していなかった場合 ((define sum +)など) インタプリタの再起動が必要になると思われる。

  • #t#f とは

 0 や 9と同じような定数であり,それぞれ真・偽を表すものであり,インタプリタ> #t とすると #t と評価される。Scheme では #f 以外は全て真として扱われることに注意をする必要がある。また,(#f)インタプリタに渡したところエラーが出たという話がでたが,Lisp では (f a1 a2) のように括弧で渡した場合は最初の f の値は手続きでなければならない。

 できるようである。http://d.hatena.ne.jp/reinyannyan/20100624/p1

  • 角括弧は使える?

 Scheme では角括弧は丸括弧と同じく使用できる。

読書会進行方法と感想

  •  まず私が適当にページを決め Slack にその範囲と終了時間を書き,全員で同時に黙読を始めた後,終了した人はその Slack に Add reaction するという形で進行した。その Slack のチャンネルはこれのためだけにひとつ用意することで, Add reaction では通知が行かず,周りの進行状況を気にせず読むことができる。ただ Add reaction を忘れると進行に影響がでるので,必ず忘れないようにすることを直前に注意した方がよい。
  •  この日は読書中の質問は出なかったが,読書中の発言も可とした。ただ,それ以降を読み進めること影響がでる疑問でなければ,範囲の終了後に質問する方が全員しっかり会話に参加できるので良いかと思った。
  •  質問者は,自分の質問とそれへの解答を簡単にまとめたものを Slack に記入するようにした。これは純粋に,読書会におけるもっとも価値のある議論・会話を記録することと,その日に参加することができなかった人たちへの共有のためであり,少々手間ではあるが必ず行うべきたと感じた。
  •  疑問に対する返答で少し自分が出しゃばりすぎた。質問とそれへの解答は手を挙げてから話しをするようにした方が良いかもしれない。
  •  ある疑問に対して,「それはここに書いてあるのでは?」と指摘してもらえることは読書会の利点のひとつだと感じた。しっかり読んでいるつもりでも無意識に読み飛ばしてしまっているところを補完することができた。