- 前説
- この説明はぼやっとしかわからない。これを尽きつめると、いろいろな言語を調べることになるので、それはやめておく。この後のCLについての具体的な説明を理解すればよしとする。
- この説明はぼやっとしかわからない。これを尽きつめると、いろいろな言語を調べることになるので、それはやめておく。この後のCLについての具体的な説明を理解すればよしとする。
- 6.1 変数の基礎
- 「Common Lispの変数はC++やJavaのようには型付けされていないから、」ここの表現、間違ってはいないが微妙。type宣言すれば、変数に型を持たせることはできる。間違っていない、というのは「ようには」と書いてあるから。
- お、変数の導入についての説明でdefunから入るのはいいかんじ。
- 変数と、変数の名前を区別しているところがいいかんじ。
- 「Common Lispの変数はC++やJavaのようには型付けされていないから、」ここの表現、間違ってはいないが微妙。type宣言すれば、変数に型を持たせることはできる。間違っていない、というのは「ようには」と書いてあるから。
- 6.2 レキシカル変数とクロージャ
- 「Common Lispにおける束縛フォームが導入する変数は、すべてデフォルトではレキシカルなスコープを持つ。」progvを束縛フォームと呼ばないならなんだけど、束縛フォームの定義(P65)のところではprogvも含むような感じなのがあぶない。
(defun bar (x)
(format t "Parameter: ~a~%" x)
(format t "symbol-value: ~a~%" (symbol-value 'x))
(progv '(x) '(100)
(format t "Parameter: ~a~%" x)
(format t "symbol-value: ~a~%" (symbol-value 'x)))
(format t "Parameter: ~a~%" x)
(format t "symbol-value: ~a~%" (symbol-value 'x)))
;; 以下出力
CL-USER(19): (bar 1)
Parameter: 1
symbol-value: 10
Parameter: 1
symbol-value: 100
Parameter: 1
symbol-value: 10
NIL - なんでエクステントという概念を導入しないのかな? と思ったら、次節の脚注にあった。
- 「Common Lispにおける束縛フォームが導入する変数は、すべてデフォルトではレキシカルなスコープを持つ。」progvを束縛フォームと呼ばないならなんだけど、束縛フォームの定義(P65)のところではprogvも含むような感じなのがあぶない。
- 6.3 ダイナミック変数。またの名をスペシャル変数
- ダイナミック変数、というとなんだかよくわからなくなるが、シンボルに値として入っているもので、その変数名について値を求められたときは、シンボルに入っている値を使いますよ、というのがスペシャル宣言。
- ダイナミック変数の導入判断について、コードの上流下流とスタックの束縛の操作、というところはなにか本質的な気がする。このあたり、もっと尽きつめて考えてみなければいけない。というのは、プログラミングって「実行時のスタックの動き(動的)をイメージしつつ、それがよしなに動くようにソース(静的)を書く」ということのような気がしているから。これは気づきなのか誤解なのか。
- ダイナミック変数、というとなんだかよくわからなくなるが、シンボルに値として入っているもので、その変数名について値を求められたときは、シンボルに入っている値を使いますよ、というのがスペシャル宣言。
- 6.4 定数
- defconstantはスペシャル。
- +const+は、じゃなくて$consもありではというg000001さんの調査。
- defconstantはスペシャル。
- 6.5 代入
- ある変数について新しい値を設定するということ自体は、再度束縛する形でもできる。なので、変数について値を変えていくことと代入は別だと思う。
- 代入は代入したいからするのだ。そして代入は、既存の束縛における値を変更することだ。
- setqは使わずsetfのみ使うのがmodern。
- ある変数について新しい値を設定するということ自体は、再度束縛する形でもできる。なので、変数について値を変えていくことと代入は別だと思う。
- 6.6 一般化代入
- そうかsetfが多機能というだけではなくて、そもそもいろいろな言語がもっている=演算子?が多機能なんだ。
- そうかsetfが多機能というだけではなくて、そもそもいろいろな言語がもっている=演算子?が多機能なんだ。
- 6.7 場所の値を変更する別のやり方
- rotatef、shiftf、忘れてた。。。便利だなぁ。
- rotatef、shiftf、忘れてた。。。便利だなぁ。
実践CL、悪くないなぁ。
さて、各プログラマの頭の中にある、プログラミング言語の意味論というのはかなり違うのではないか、と思えてきた。なぜかというと、自分ひとりだけを考えてみても、過去から今までの間いろいろ変遷してきているからだ。
そしてそれは、よりよいアプリケーションを書くという観点でいうと、ヒープとかスタックとかいうあたりのコンストラクトをどのように操作するかというところにあるのではないか(ここで言う意味論は学術的なもののことではなくプログラマがもつ内的イメージくらいのもの)。そういう意味でいうと、C言語はソースと内的イメージ(意味論)がかなり近いと思う。で、C言語はかなりシンプルな言語なので簡単であると。ただし、ハードウエアの進化によって意味論とハードウエアの距離は昔より開いている。CLの内的イメージ(意味論)はかなり複雑である。構文は簡単なんだけど、その背後にあるものが複雑。
そして残像のようにそういう内的イメージが言語に付きまとうのは、そもそも言語設計者がそういうイメージでモノを考えざるを得ないからじゃないか?
さらに言うと、プログラミングの理解がそういうものであるとして、そういもモノを変数は箱だとかなんだとか比喩だとか何だとかでわかったつもりにさせるような入門本をいくらやってもプログラミングなんてできるようにはならないんじゃないか??? それってある意味、「これをやってればあなたも英語がしゃべれます〜何も考えなくても楽にできるようになります〜」という触込みで、それを使って英語がしゃべれるようになった人が一人もいないような、詐欺教材がちまたにあふれているということじゃないか?
こつこつ。
0 件のコメント:
コメントを投稿