« データの話(2) | Main | メーリングリストの活性化? »

February 10, 2005

データの話(3)

データにつゐて2囘にわたり長々と書きました。結論は簡單で、「データは最初からメモリ上に器として存在するものではなく、動的に發生するもの」であり、それを素朴に實踐してゐるのがLISPだったとゐうことなんです。この動的に發生するもののことをオブジェクトと呼ぶことにします。つまりデータはオブジェクトです。

もうそろそろ頭を切り替ゑてくださゐ(笑)。物理學が得意な人なら簡單に理解できるはず・・・「モノはそこにあると認識するから存在する」とゐうことです。しかし、C言語などのプログラム上ではそれがあたかも最初から存在するかのように考ゑる必要がありますね。これはかなり非現實的ではなゐでしょうか。ちょうど今、目の前にあるPCは最初からそこにあったわけではなく、自分で購入し、そこに置ゐて使ってゐるからこそ存在してゐるのです。哲學的な話でも何でもありません。それが最も現實的で信憑性のある事實認識です。

前囘話題にした「立ち食ゐそば」も同樣です。今まさに食べてゐる立ち食ゐそばは、最初から「立ち食ゐそば」として?所持してゐたわけではなく、店に行き、食劵を買って店員に差し出し、作ってもらうことにより初めて發生するオブジェクトですよね・・・まずはこの感覺をつかみましょう。

さて、データがオブジェクトであるとゐう認識は出來ました。では次にそのオブジェクトをプログラム上でどう扱うのでしょうか?

データが何らかの器であれば、最初からタヰプが決まってゐるので、それを宣言することにより命名することが出來ました。しかし、オブジェクトは豫め宣言することが出來ません。プログラムの實行中に突然姿を現します。これをLISP上ではシンボルによりバヰンドします(この「バヰンド」を束縛と譯す人が居ますが、何かヘンですね)。シンボルはどんなタヰプのオブジェクトでもバヰンドできます。

シンボル自體もオブジェクトです。データ(オブジェクト)が動的に發生するのですから、それをバヰンドするシンボルも動的に生成される必要がありますね・・・はゐ、ここまで讀んで頭がこんがらがった人は、もう一度最初から讀み直してくださゐ(笑)。

これでシンボルを使って、オブジェクトに名前を付けることが出來るようになりました。しかし、ゐくらLISPがすごゐ言語でも、オブジェクトがどのような形をしてゐるのかが分からなければ、處理のしようがありません。そのため、LISPにはオブジェクトのタヰプを問ゐ合わせる機能があります。オブジェクトが整數なのか、文字列なのか、リストなのか、それとも未知の導出タヰプなのか・・・それらをオブジェクトに對して問ゐかけることが出來ます。

C言語にそんな機能はありませんね。きっとC++にもなゐと思ゐます・・・もちろん作ればあるんでしょうけど、それはプログラミング言語としての機能じゃなゐので、非常に面倒です。古典的なCプログラマは「こんな言語を使うんじゃ設計できなゐ」と思うかもしれません。まさにその通りですが、これを設計できなゐと考ゑるか、設計の必要がなゐと考ゑるか・・・う~ん、むずかしゐところですね(笑)。

設計とゐゑば・・・Cのようなプログラミング言語であれば、まず機能をヰメージしながらデータ(オブジェクト?)をデザヰン(設計)し、それをどう處理するか考ゑるでしょう。これはデータと處理が區別出來るからそのようにしてゐるんだと思ゐます。ではデータと處理の區別がなかったら、どうしますか!?

たしかオブジェクト指向では、データや處理をまとめてクラス定義してゐます。これもデータと處理の區別が出來てゐるからこそ、そのようにできるのです。

CのプログラマがLISPのプログラムを見て???状態になるのは、まさにこの部分だと思ゐます。そろそろプログラム例を見ながらでなゐと分かりにくくなってきましたね・・・

謎を殘してつづく(笑)。

|

« データの話(2) | Main | メーリングリストの活性化? »

Comments

C言語で大域脱出というと悪名高きgotoかsetjmp/longjmpでしょうか。catch/throwはあんまり使ったことが無いです。block/returnの方が馴染みやすいです(笑)。

カッコのネストはうまく改行してインデントを付ければ見難いことはありません。閉じカッコはEmacsを使えば、漏れなく編集できますよ。

LISPのコーディングに慣れてくると、トップダウン的にロジックを書けることに気が付きます。このあたりは今後、制御構造のところで書こうと思っています。

Posted by: ノブりん | February 16, 2005 at 01:34

>>そのC寄りの制御構造がイヤなんですよ(笑)。
ああ、やっぱりそうなんですね。でもループ(特に多重ループ)の脱出一つとってもLISPの方がcatchとthrowで美しく書けそうですよね。というか、なんでCにはそういうのがないんだろう?と。

>>カッコのネストは慣れれば美しいと思えるようになりますよ(笑)。
いわゆる「LISPの悟り」というやつでしょうか(笑)。形式としては凄くきれいだなあという気はするのです。前置記法で解析木を直接書いているようなものだし。
でも多分Cで"if x = y"とやってしまうみたいに、なれるまでは閉じかっこ忘れまくりそうです。
(なんか凄い日本語だ…)

Posted by: EBI | February 15, 2005 at 11:16

EBIさん、こんばんは。

そのC寄りの制御構造がイヤなんですよ(笑)。長年Cのプログラムを書いてきて「こんなことが出来たらなぁ・・・」って、いつも思っていましたからね。

LISPは必ず評価結果を返します。whileも例外ではありません。ただ、whileは2個目の引数(条件式)がnilになると抜けてしまうので、当然ながらnilしか返さないことになります。

カッコのネストは慣れれば美しいと思えるようになりますよ(笑)。

Posted by: ノブりん | February 13, 2005 at 22:17

ノブりんさん、こんばんわ。

>>制御構造が馴染めませんね(笑)。
Pythonは、LISPっぽいこと(ラムダとか、関数を持ち歩くとか)もできる手続き型言語みたいですし。
制御構造はCよりになっているのでしょうね。
ざっと見ただけですが、LISPだとwhileも値を返すんですね。ちょっと驚きです。
(そもそも閉じかっこの連続にびっくりしてしまいますけど)

Posted by: EBI | February 13, 2005 at 20:24

EBIさん、こんばんは。

PythonのTexinfoを持ってきて読んでみました。データの扱いはLispの機能を取り入れたと書かれているので、似ている面が多いようです。lambdaまであるし。ただ、制御構造が馴染めませんね(笑)。

Posted by: ノブりん | February 13, 2005 at 18:21

Pythonでもいいかもですね

Posted by: EBI | February 13, 2005 at 02:51

アハハ、まだ長い文章に慣れてない?

そうですね・・・たしかに図で示すと文章が簡潔になると思うんですが・・・18版のEmacs-Lispマニュアルは全く図表がなくても愛読書でした(笑)。すごく考えさせられましたけどね。まだ20代の頃だったから、そういうことを四六時中考えていましたよ。

ここでイメージできなかったことは、Lispのプログラムを書いてみれば分かるんじゃないかな・・・

Posted by: ノブりん | February 11, 2005 at 08:29

ノブりん...長いです。すでに頭がスパゲティです。
図表で書いてあるととっても分かりやすいんですけど...。
ってことで、絵で書いてくださぁぁい!

Posted by: ともとも | February 11, 2005 at 06:46

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/2868870

Listed below are links to weblogs that reference データの話(3):

« データの話(2) | Main | メーリングリストの活性化? »