2008年7月18日金曜日

第12講 ガールフレンドも買い物も関数引数でOK


  • 「金太郎飴がどこで切っても同じだというので、Lispの構造的一様性の比喩でしょうと言ってきた御人がおる。」
  • 「電気信号の処理のように、データの処理もフィルターをかける操作と考えると非常に明快なことがある。」
  • 「Common Lispはラムダ式を関数実体につけた"名前"という見方をする。functionまたは#'は名前から本当の関数実体を引き出す特殊形式なのじゃ。だから、#'consはconsというシンボルがもつ関数実体を返す。"名前"と"関数実体"の差に拘わるとこのへんはこういうふうに厳密に書かざるを得まい。」
  • 「functionでくくられたラムダ式は、その時点で見えるメモ用紙を自分と一緒に持ち歩くのだ。つまり、Common Lispではラムダ式という"名前"とそのときのメモ用紙の状態から、そのつど新しい関数実体を作り出す。」

2008年7月13日日曜日

第11講 シンボルを人前に曝す


  • 「Lispの名前は単に構文上の標識ではなく、リストのセルのようにデータが置かれている空間のどこかに実在する1つのデータ実体である。」
  • 「ウム、確かに名前という名前は紛らわしいから、これから名前と呼ばずにシンボルと呼ぼう。」
  • 「そういう細かいことはこだわらんのがLispなのじゃ。」
  • 「Lispではシンボルは数と同等、いやそれ以上に重要な概念だから、シンボルの表記と内部に作られるシンボルの実体をはっきりと分けて考える。」
  • 「実は、変数名と値の対応というのはいろいろ難しい問題をハラんでおる。Lispの歴史の中でも最も波瀾万丈の問題なのじゃ。」
  • 「とりあえず、ズルズルと目をつぶって、いい加減にやってきちゃっというのがLispの歴史の本質だし、Lisp教師の本質でもある。」
  • 属性リストで出てくる交代リストとは、キーワードリストのことなのかな?
  • 「ラムダ式の一番重要なポイントは、関数の概念から、名前を省いたことじゃ。」

2008年7月11日金曜日

第10講 変態プログラム

こつこつ。

  • 「生物個体あるいはその一部の外形のかなり不可逆的な内因的変化」
  • 「変態プログラムは、実際に評価される前にプログラム自身が変態する」
  • defsubstはCLにはなさそう。お、substはある。
  • 「B子:評価したくない引数が必要なときにdefsubstを使うというのが本音なのかしら。K:ウム、ほぼ正しい、それは。」ということは、lazy evaluationが十分ならばマクロは不要ってことか。
  • お、マクロも出てきた。
  • この本の時点ではCLにgensymはなかったのかも。

2008年7月10日木曜日

第9講 デートの前にリストの切り貼り

こつこつ。

  • rplaca, rplacd。初めて知った。ANSI CLにも存在する。
  • なるほど、これを使うと、リストを紐解かなくてもリストの切り貼りができるんだな。

ざっと見だけ。もう一度読むときに、いろいろ試してみることにする。

2008年7月6日日曜日

第8講 Lispの御本尊のお出まし


  • 「いつか言ったように名前は、それ自身で実体を伴ったデータである。
  • 「Lispの仕組みを理解するには、変数と値の結合もS式の形に見えることが重要なので、いまでも教育用にはこの辞書が使われる。」
  • 「(略)どうも変だな。Lispのプログラムを評価するのに、辞書であるalistが出て来た。そして、そのalistから情報を引き出すのに、またassocとかいったLispの式を評価しないといけない。assocの中にもまた変数が出てくる。ウワ、一体どうなるんだ。話がこんがらがってきたぞ。」

第7講 Go,go,go... do,do,do... loop,loop,loop...。やっぱりOは丸い


  • 「太古の昔から人間は手順を伝達するのに再帰法なんか使っていなかったのです。あくまで"繰り返し"が基本でした」
  • 「自然言語で書いたものをいつでもそのままS式に投影しただけでLispのプログラムになるのでは、Lispのシステムが大きくなりすぎて爆発してしまう」
  • 「BasicやFortranだったら、それこそ文法上の革命あるいは言語そのものの改変みたいなことが、Lispではいともあっさり起こり、それでもそれがLispであることを誰もが疑わないような強烈なアイデンティティがLispの各に潜んでおる。」
  • 「繰り返しなら繰り返しと最初から形を見ただけでわかるような書き方にしようというのが、いわゆる構造化プログラミングだ。」

2008年7月5日土曜日

第6講 またも再帰するから再帰なのだ


  • 「大きな仕事を分解して、1つ1つの昨日単位に関数を対応させていくようなプログラミングでは、そもそもの基本的極意なのじゃ。再帰法は、たまたま下請けが自分と同じ関数だったというだけのことで、それ以上のものでもないしそれ以下のものでもない。」
  • 「現実のプログラムを書かない理論屋は再帰法のほうを好むし、本当に毎日商売のためにプログラムを書いている人間はあそもそも会場の計算なんかに興味をもたない。」

2008年6月9日月曜日

第5講 今度はcond, 再帰と再起を混同せぬように…

この本、埋もれてしまっていて、ご無沙汰した。再開。

  • 「式のcarで式の意味が区別されなければならないというのがLispの大前提」
  • 「このようにいかにも関数風(略)の式で表すけれど、引数の形が独特だったり、引数が評価されないような式は特殊形式と呼ばれる。」
  • 「文字通り同じ手順を繰り返すばかりではなく、ほんの少ししか違わない状況であれば、同じ手順をうまくそれに順応させて実行するという能力も人間はもち合わせている。」
  • 「関数が呼ばれるとその関数の変数のメモ用紙が新たに用意されるって。束縛とかいう話」
  • 「だから、Lispは最初、繰り返し動作を再帰法だけで書くように設計された。」


うーん。含蓄深いなぁ。

2008年1月15日火曜日

第4講 基本関数を修了するや,突然関数定義なんと大それた・・・


  • 「...、えーと、ちょっと待て、これがこのままで評価されると困るから、評価のレベルを合わせるために
    '(10 aho 51)
    としておけば済む話ですね?」
  • 「listは、(引数が0個の場合を除き)評価されるだびに"新しい"リストを作り出す」
  • 練習問題
    1. (A)
    2. (NIL)
    3. (A NIL)
    4. (cons (A) (B)) => ((A) B)
    5. ((1) (2) (3))
    6. (cons 'head (body tail)) => (HEAD BODY TAIL)
    あってた。
  • 「Lispの世界でTanakaと言ってしまうと、Tanakaというアトムは1つしか存在しないのだ」
  • 「名前というアトム、あるいはシンボル(Symbol)は、あくまでも名前という実体なのであって、...」
  • 「Lispは、名前アトムに対し、1個のデータとして存在し、データの海の中を浮遊しうるという実存性を与えた」
  • 練習問題
    1. T
    2. T
    3. NIL
    4. T
    5. T
    6. NIL
    7. NIL
    8. T
    9. NIL
    10. T
    11. NIL
    12. NIL
    13. T
    14. T
    15. NIL
    15を間違えた。あ、そうかNILまでいっちゃうから。
  • 「関数がブラックボックスとして、中身が見えにくいようになっていればいるほど、モジュラー性が高いと呼ばれます。一時的なメモ用紙だの、束縛だのという苦しまぎれの言葉や概念をもちだしたのは、人間にとって自然なモジュラー性を保証するためのメカニズムを理解するために止むを得なかったのです」

2008年1月8日火曜日

第3講 解釈は評価なり・・・辞書なくして世は渡れず


  • キン肉マンってこのころからあったのか。
  • 「これが関数名と引数並びとからなる2組を簡約化した、いわば題付き並びであることも説明したな」
  • 「Lispの世界ではすべての情報構造がS式で表されなければならない」
  • 「書かれたS式が静の世界とすれば、S式から別のS式を生み出すという計算機構は動の世界じゃ。静と動、この厳しい対立の美しさがすなわちLispなのである」
  • 練習問題
    1. 15
    2. -15
    3. 21
    4. 7
    5. 20
    6. 37
    7. 15
    8. 15
    9. 5
    あってた。
  • '''(aho doji)

    CL-USER> (eval (eval '''(aho doji)))
    (AHO DOJI)
    CL-USER>

  • そういえば、シンボルという用語はでてきてないな。
  • う、(+ '1 '2)がなぜ3になるのかがわからない。。。
  • 「数を評価したらその数自身になるというのもプログラム言語としての1つの約束にすぎないことに注意しておきましょう」
  • 「その辞書とやらもやっぱりS式で表せるんですか? もちろん、そうです」
  • 「しょっちゅう使うものに限って変に乱れてくるんですよね」


  • CL-USER> (setq + 10)
    10
    CL-USER> (+ + +)
    ; Evaluation aborted.
    CL-USER> +
    (SETQ + 10)
    CL-USER> (set '+ 10)
    10
    CL-USER> +
    (SET '+ 10)
    CL-USER> (set '- 10)
    10
    CL-USER> -
    -
    CL-USER> (- - -)
    ; Evaluation aborted.
    CL-USER> (- 1 1)
    0
    CL-USER> (+ 1 1)
    2
    CL-USER> +
    (+ 1 1)
    CL-USER> -
    -
    CL-USER> +
    -
    CL-USER> -
    -
    CL-USER> (progn
    (print nil)
    -)

    NIL
    (PROGN (PRINT NIL) -)
    CL-USER>

    あり? CLのREPLでは、+は直前の式を、-は現在の式を表わすんだ。
  • 練習問題
    1. nil
    2. t
    3. nil
    4. 58
    5. (+ 87 90) -> 177
    6. (+ B) -> (+ '(87 58 90)) -> error
    7. (58 90)
    8. nil
    9. error
    10. t
    11. error
    12. error
    13. error
    6, 9, 11, 12 を間違えた。。。
    そうか。7がIの辞書登録なのか。すると9,11,12は納得。
    6は???
    aclでためしてみると、、、やはりエラーだ。

第2講 CARとCDRで世間を渡れば権兵衛もたじろぐ


  • 「まずフィネスすることを覚えよ。次にフィネスしないことを覚えよ。最後に、時々フィネスすることを覚えよ」
  • 「もっともLispの世界に足を踏み入れてしまえば、Lispのほうがはるかに常識的に思えてくる」そうなのか? やはりblue pillなのか?
  • 練習問題
    1. car (A), cdr nil.
    2. car (nil), cdr (nil).
    3. (B C).
    4. D.
    5. cdr (B (C (D))), cadr B.
    6. car (((A) B) C), cdr (D)
    7. ((A) B).
    8. (A).
    9 ().
    10. ((A B C) D E F).
    5と9を間違えた。でも9はCLなら正解か。
  • S式は、car、cdr、atomとnullという観測装置で内部構造を観測できる。
  • 「これでcarもcdrもatomもnullもそれを通してS式を見ればまたS式が見えるという仕掛けになった」
  • 「情報構造は、処理対象となるデータばかりでなく、処理そのものももっている」
  • 練習問題
    ((56) (29 (P 5) (X 2))
    あってた。
  • 「いったん、S式の形で表現してしまえば、それの"解釈"はまったく自由だから、手順の記述自身をデータと見なすような面白い処理が可能になる」

第1講 初めての人のためのLISP


  • いきなりたらいまわしだ。
  • 「Lispを"言語"としてではなく"概念"としてわかってもらうようにするのがよい」
  • 「当店では常識に反したような規則は作らないというのを規則としております」
  • 「Lispでもアトムを2つに分解したりしないというのが原則です」
  • ) := コッカ。
  • 「すべてのデータには、そのデータが存在している文脈というものがある。ちょっと先走って言えば、こういう文脈構造を支えるのがプログラムなのであるよ」
  • 「Lispの場合、扱う対象世界の最小単位をアトムとし、構造をもつものをリストというデータ構造へ写像してモデル化するのです」

読む目的

読む目的は気分転換。

読書メモとして気になったフレーズとかを書いていきます。