この章はほんとに背景情報。2章からの具体的な作業に入る前に、初心者が頭に入れておくべきものごとをざっと整理したもの。
特記事項はなし。
こつこつ。
2009年1月3日土曜日
2009年1月2日金曜日
【実践CL】6 変数
うーん。変数についてってちゃんと書いてある文章は少いんだよね。だから変数について読むときはちょっと気が重くなる。実践CLがどういう記述だったかは忘れちゃった。よい記述だといいなぁ。まあ、まったりまったり。坦々。
実践CL、悪くないなぁ。
さて、各プログラマの頭の中にある、プログラミング言語の意味論というのはかなり違うのではないか、と思えてきた。なぜかというと、自分ひとりだけを考えてみても、過去から今までの間いろいろ変遷してきているからだ。
そしてそれは、よりよいアプリケーションを書くという観点でいうと、ヒープとかスタックとかいうあたりのコンストラクトをどのように操作するかというところにあるのではないか(ここで言う意味論は学術的なもののことではなくプログラマがもつ内的イメージくらいのもの)。そういう意味でいうと、C言語はソースと内的イメージ(意味論)がかなり近いと思う。で、C言語はかなりシンプルな言語なので簡単であると。ただし、ハードウエアの進化によって意味論とハードウエアの距離は昔より開いている。CLの内的イメージ(意味論)はかなり複雑である。構文は簡単なんだけど、その背後にあるものが複雑。
そして残像のようにそういう内的イメージが言語に付きまとうのは、そもそも言語設計者がそういうイメージでモノを考えざるを得ないからじゃないか?
さらに言うと、プログラミングの理解がそういうものであるとして、そういもモノを変数は箱だとかなんだとか比喩だとか何だとかでわかったつもりにさせるような入門本をいくらやってもプログラミングなんてできるようにはならないんじゃないか??? それってある意味、「これをやってればあなたも英語がしゃべれます〜何も考えなくても楽にできるようになります〜」という触込みで、それを使って英語がしゃべれるようになった人が一人もいないような、詐欺教材がちまたにあふれているということじゃないか?
こつこつ。
- 前説
- この説明はぼやっとしかわからない。これを尽きつめると、いろいろな言語を調べることになるので、それはやめておく。この後の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の内的イメージ(意味論)はかなり複雑である。構文は簡単なんだけど、その背後にあるものが複雑。
そして残像のようにそういう内的イメージが言語に付きまとうのは、そもそも言語設計者がそういうイメージでモノを考えざるを得ないからじゃないか?
さらに言うと、プログラミングの理解がそういうものであるとして、そういもモノを変数は箱だとかなんだとか比喩だとか何だとかでわかったつもりにさせるような入門本をいくらやってもプログラミングなんてできるようにはならないんじゃないか??? それってある意味、「これをやってればあなたも英語がしゃべれます〜何も考えなくても楽にできるようになります〜」という触込みで、それを使って英語がしゃべれるようになった人が一人もいないような、詐欺教材がちまたにあふれているということじゃないか?
こつこつ。
MacにMySQLをインストール
- www.mysql.comからGA版をDL。この時点では、Mac OS X (package)10.5 (x86_64)。
- mysql-5.1.30-osx10.5-x86_64の中のReadMe.txtを読む。
- mysql-5.1.30-osx10.5-x86.64.pkgを起動してインストール。
- MySQLStartupItem.pkgを起動してインストール。
- mysqlは/usr/local/mysqlに入る。
- mysqlサーバの起動は、StartupItemsを使う場合は、sudo /Library/StarupItems/MySQLCOM/MySQLCOM start
- 使わない場合は、
cd /usr/local/mysql
sudo ./bin/mysqld_safe
(C-z)
bg
(またはscreenでデタッチ) - 付属クライアントの起動は、
/usr/local/mysql/bin/mysql
付属の管理クライアントの起動は、
/usr/local/mysql/bin/mysqladmin - 起動省力化のためには、
alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin
これで、
~$ /usr/local/mysql/bin/mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.30 MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
おお!!私の機体でもRDBMSが動いている。ちょっと嬉しい。
今日で一周年
ブログ開始から今日でちょうど一年だ。
一年前の1月2日から怒涛のPCL学習をはじめたのがきっかけだった。(ここ)
ということはCLを勉強しはじめてちょうど一年ということだ。
CL自体はそこそこわかるようになってきた。そろそろ学習モードを終わりにして、生み出していくモードに入っていくのかな、と予感している(予感はよく外れる)。
口惜しいのは、数学の微積と線形代数の勉強が進んでいないことだ。なんとかこれを早めに習得して、現在のレベルを高校二年生から高校三年生に上げたい。というのはPAIPを読んでいるのに高校二年生というのはやはりおかしいからだ。いや、そういう高校二年生もいるだろうが、それはレアケースだろう。それだけ今の自分の知識状態がアンバランスになっているということだ。
今年は、CLがそこそこわかった頭で、既存の知識エリアも再度見直していきたい。そのはしりとして、IMAPを調べ初めている。またOOの分野は避けて通れないだろう。大規模な見直しになるはずだ。
Lisp系の言語をやると、自前の処理系を書く人が多い。私もそういうことをやることになるのだろうか? 自身の興味は、処理系よりもアプリケーションに向いているのは間違いない。しかしアプリケーションのパフォーマンスチューニングになると、処理系の内部の話にいつも及ぶところがなんともいえない。アプリへの必要に応じて処理系にも手を出すかもしれない。
あと、もう少し力量が増したら、コミュニティへの貢献を少しづつだがやってみたい。今は自分が向上するだけで精一杯で、人様の役に立つものは何も持ち合わせていない。力量が増せば何かできるかもしれない。
さて、初ブログの感想としては、、、学習メモや読書メモをこのように公開していくのは、自分自身のためにはなったと思う。勉強のリズムがでるし、継続性も高まったと思う。ただし、もっと人のためになるように書かないと他人のためにはならないと思う。目を汚すものでしかないのではないか。このブログは自分のためにしか書いてないので、もしなんらかの御縁で偶然このブログを目にしてしまった方は、その点ご容赦いただきたい。
というわけで、今年もこつこつと、そして坦々と取組みを進めていきたい。
一年前の1月2日から怒涛のPCL学習をはじめたのがきっかけだった。(ここ)
ということはCLを勉強しはじめてちょうど一年ということだ。
CL自体はそこそこわかるようになってきた。そろそろ学習モードを終わりにして、生み出していくモードに入っていくのかな、と予感している(予感はよく外れる)。
口惜しいのは、数学の微積と線形代数の勉強が進んでいないことだ。なんとかこれを早めに習得して、現在のレベルを高校二年生から高校三年生に上げたい。というのはPAIPを読んでいるのに高校二年生というのはやはりおかしいからだ。いや、そういう高校二年生もいるだろうが、それはレアケースだろう。それだけ今の自分の知識状態がアンバランスになっているということだ。
今年は、CLがそこそこわかった頭で、既存の知識エリアも再度見直していきたい。そのはしりとして、IMAPを調べ初めている。またOOの分野は避けて通れないだろう。大規模な見直しになるはずだ。
Lisp系の言語をやると、自前の処理系を書く人が多い。私もそういうことをやることになるのだろうか? 自身の興味は、処理系よりもアプリケーションに向いているのは間違いない。しかしアプリケーションのパフォーマンスチューニングになると、処理系の内部の話にいつも及ぶところがなんともいえない。アプリへの必要に応じて処理系にも手を出すかもしれない。
あと、もう少し力量が増したら、コミュニティへの貢献を少しづつだがやってみたい。今は自分が向上するだけで精一杯で、人様の役に立つものは何も持ち合わせていない。力量が増せば何かできるかもしれない。
さて、初ブログの感想としては、、、学習メモや読書メモをこのように公開していくのは、自分自身のためにはなったと思う。勉強のリズムがでるし、継続性も高まったと思う。ただし、もっと人のためになるように書かないと他人のためにはならないと思う。目を汚すものでしかないのではないか。このブログは自分のためにしか書いてないので、もしなんらかの御縁で偶然このブログを目にしてしまった方は、その点ご容赦いただきたい。
というわけで、今年もこつこつと、そして坦々と取組みを進めていきたい。
【ELp入門】3 関数定義の書き方
- 前説
- 「関数定義を持つシンボルを、単に関数と呼ぶ」このように断わっておいてくれるのは初学者にとって親切だ。
- 「関数定義を持つシンボルを、単に関数と呼ぶ」このように断わっておいてくれるのは初学者にとって親切だ。
- 3.1 スペシャルフォームdefun
- Elispでは (defun hoge (piyo) puyo)の(piyo)を引数リスト(argument list)と呼ぶようだ。CLだと正式にはパラメータリストで、歴史的にいうとラムダリストもあり。
- Elispでは (defun hoge (piyo) puyo)の(piyo)を引数リスト(argument list)と呼ぶようだ。CLだと正式にはパラメータリストで、歴史的にいうとラムダリストもあり。
- 3.2 関数定義のインストール
- defunを評価すると関数がインストールされる。
- defunを評価すると関数がインストールされる。
- 3.3 関数を対話的にする。
- スペシャルフォームinteractiveの紹介。
- 「対話的関数を呼び出すのは、(中略)副作用のためであり」 なるほど。
- スペシャルフォームinteractiveの紹介。
- 3.4 interactiveの他のオプション
- interactive、便利だなぁ。関数にまつわるEmacs的インターフェイスは、ほぼこれで尽きてるんじゃないか???
- interactive、便利だなぁ。関数にまつわるEmacs的インターフェイスは、ほぼこれで尽きてるんじゃないか???
- 3.5 コードの恒久的インストール
- ファイルの中のコードはloadで読み込めるようだ。
- ファイルの中のコードはloadで読み込めるようだ。
- 3.6 let
- スペシャルフォームlet。
- 普通の使い方では特にCLとの違いはなし。ただし、progvは存在しないし、そのエクステントは動的なんだろう。(調べてはいない)
- スペシャルフォームlet。
- 3.7 スペシャルフォームif
- 3.8 If-then-else式
- if-thenとif-then-elseを個別に順番に説明するのは丁寧だ。
- シンボルの比較にequalを使うのは不自然だ。
- CLとの有意な違いはなし。
- if-thenとif-then-elseを個別に順番に説明するのは丁寧だ。
- 3.9 Lispの真偽値
- CLとの有意な違いはなし。
- CLとの有意な違いはなし。
- 3.10 save-excursion
- save-excursionは関数。
- save-excursionはwith-excursionという感じだな。
- save-excursionは関数。
こつこつ。
登録:
投稿 (Atom)