やろーじだい

ブログです

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 に記入するようにした。これは純粋に,読書会におけるもっとも価値のある議論・会話を記録することと,その日に参加することができなかった人たちへの共有のためであり,少々手間ではあるが必ず行うべきたと感じた。
  •  疑問に対する返答で少し自分が出しゃばりすぎた。質問とそれへの解答は手を挙げてから話しをするようにした方が良いかもしれない。
  •  ある疑問に対して,「それはここに書いてあるのでは?」と指摘してもらえることは読書会の利点のひとつだと感じた。しっかり読んでいるつもりでも無意識に読み飛ばしてしまっているところを補完することができた。

Aizu SICP - Aizu Advent Calendar 2015

挨拶

 Aizu advent calendar 一日目を担当します @cl_yaho です。
明日は @stringamp さんによる ストレスフリーな進捗生成のために - stringamp's blog です。

SICP 読む会 in Aizu

 大学生の内に読破したい本 No.1 に輝いた SICP を読む会を会津大学で行います。以下ではその具体的な方法などを挙げます。興味ある方はぜひ記事の最後の atnd より参加登録をしていただければと思います。

SICP とは

 見付けたスライドを利用します。 SICPの紹介
 今回は上で紹介されている id:minghai さんによる翻訳ではなく,今年の 10 月末に id:takeda25 さんによって新しく翻訳されたものを使用します。sicp-pdf

形式や注意

 まず私は今回の読書会が始めての主催・参加となります。更に通常の読書会とは異なり主催者の私も未読の状態となります。そのため時間の配分・進め方など思考錯誤しながら進めていくことになり,スムーズに進行させることは難しいことが予想できます。
 今回の読書会は主に私が未読という理由からエクストリームリーディングを採用します。正確な定義はわかりませんが,こちらのスライドで書かれている流れで行います。IT技術系書籍読書会のしおり エクストリームリーディングという単語は次のブログでほとんど同様な方式で行う読書会に対して使用されていました。 読書会(エクストリームリーディング)を開催 この方式は輪講形式などとは違い,毎回担当者などを設定して事前に準備をする必要が無いため,参加者の負担が少なく気軽に参加することができるという利点があります。すでに読んだ方が誰もいない状況で全員で同時に読み解いていく形になるため,ページあたりの必要な時間はかなり増えるという短所もありますが,これに関しても実際にその場で時間をかけて議論ができるという利点と見ることも可能でしょう。
 このエクストリームリーディングを採用するにあたって人数はある程度少ない方が良いとのことですが,種々の理由から途中で来れなくなる方もいることを考慮して最大 10 名としたいと思います。また,参加したいが今年で卒業してしまうという方がいることがわかったため,この読書会で利用する Slack のみへの参加も可能とします。Slack にはできる限りそれを読んだだけでもある程度流れがわかるように読書会中のやりとりなどを記録したいと思います。それにより,急遽参加できなかった場合でもそれを見ながら欠席分を補うことも狙いです。また毎回ブログなどでその日の内容をまとめたいと考えています。
 興味がある方・参加希望者は Slack へ招待を送るため s1200191@u-aizu.ac.jp までお手数ですがメールを送ってください。(その内自動ログインを可能にしたいと思っています。) Slack には無制限に誰でも (会津の方以外でも) 参加可能にしたいと思います。メールのタイトルに [Aizu-SICP] と付けていただければ空メールで問題ありませんのでお願いいたします。
 連絡などは以降すべて Slack で行います。

追記:  会津大学内のネットワークなどを利用するため,参加者は会津大生に限ります。

日程 (予定)

  • 来週 12/10 (木) の夜
    希望者で集まり,その後読書会を行う頻度やどの曜日のどの時間が良いかなどを話し合う。
  • その翌週より
    設定した日付で実際に読書会を行う。年末前に一度くらいやっておきたい。
  • 終了予定
    全く未定。

atnd

少し雑に書いてしまったので,何かあればメールまたは Twitter にお願いします。

参考資料・サイト

SICP 読書ノート - 目次
IT技術系書籍読書会のしおり
非公式PDF版SICPの全訳を公開しました
sicp-pdf

留学 23-26 日目と会津向け告知

日常

  • 23 日は大雨で大変だった。折り畳み傘だけではだめだった。
  • オンラインで Markdown を管理するために個人で esa.io を利用し始めた。(\( ⁰⊖⁰)/)
  • チーム向けのものだがフォルダの管理などが便利そうだったので使ってみた。Blog の下書きやメモに使っている。
  • 現実世界の紙以上にデータの管理は難しいく面倒なので,階層やテンプレート機能などとても助かる。
  • 教授がポルトガルに到着したが,会話中の英語を助けてくれるわけではないのでつらさが増した。
  • 殆ど留学が関係ない記事になってきている。

これからの豊富

  • 自分に最も必要なこと (統計処理や機械学習) については Clojure でここ1, 2年で良さそうな本が出ているし,Common Lisp でもできるので,ひとまず 1 年間この二つ集中してみようと思っている。
  • SICP に向けてちょっと Scheme もやる。
  • Lisp が吐くバイトコードを読みたいというのと,後期の OS 論の TA をやるので復習したいというモチベーションから初めて読む 486パタヘネを読んでいる。
  • ソフトウェアの基礎は年単位で少しづつ進める。

研究

  • 留学もラストの二週間となり,教授の持っている実際のデータを使った ILP の実験を始めた。
  • 具体的には人の生体組織検査 (biopsy) の結果などを数値化したもの。
  • ひとまず課題のような形で,何か新しいことを考えたわけではないので,研究というよりは学習という感じになった。
  • 今後発展させるかもしれないし,どうなるかは今一見通しが立っていない。
  • 午前と寝る前は完全に個人的なこと。昼から夜にかけては研究という感じで毎日過している。
  • 今一うまくいっていない。

告知

 後期 (11 月頃予定) から前期から計画していた会津 SICP 読む会を開く予定です。1 年以上かかる計画のため参加者が少ないと思いますが,個人ではなくイベントとして行うことで定期的に取り組むことを強要することが主な目的です。具体的な形式などは後程別な記事かそのまま atnd を立てて詳細を書きますのでそちらからどうぞ。またメールなどいただければ募集開始の旨をメールします。s1200191@会津 まで。会場は会津大学を利用する予定なので,インターネットなど大学のものを利用できる人に限ります。