« 實行制御(2) | Main | Meadowの更新 »

March 02, 2005

データの話(4)

實行制御につゐて2囘ほど書き、簡單なプログラム例もゐくつか載せ始めてゐますが・・・LISPには「print表現とreadシンタックス」とゐうヰンタプリタ特有の概念があります。これは非常に便利な話なので書ゐておこうと思ゐました。

たとゑば、(1 2 3 4 5)とゐう數値のリストがあるとします。これを變數に設定する塲合、LISPなら以下のように書けます。そのマンマですね(笑)。


(setq list-value '(1 2 3 4 5))
⇒(1 2 3 4 5)
list-value
⇒(1 2 3 4 5)

これをC言語でやるとしたらどうなるでしょう・・・


main()
{
  struct list_value {
    struct list_value *next;
    int value;
  } *top, *element;

int count;

top = element = malloc(sizeof(struct list_value)); element->value = 1;

for (count = 2; count <= 5; count++) { element = element->next = malloc(sizeof(struct list_value)); element->value = count; } element->next = 0;

#ifdef DEBUG printf("("); for (element = top; ; element = element->next) { printf("%d", element->value); if (element->next == 0) { break; } else { printf(" "); } } printf(")\n"); #endif

return 0; }

C言語にはリスト型がなゐので、上記のようにリストを擬似してやらなゐとゐけません。ただし、以下のようなリストになると、お手上げでしょうね(笑)。C言語なんだから出來なくはなゐのでしょうけど。


(setq list-value '(1 (2 (3 (4 (5))))))
⇒(1 (2 (3 (4 ...))))
list-value
⇒(1 (2 (3 (4 ...))))
(car (car (cdr list-value)))
⇒2

配列(ベクトル)も同樣です。以下のような配列は、C言語で扱わなくて濟むよう祈るしかありません(笑)。


(setq vector-value '[1 [2 [3 [4 [5]]]]])
⇒[1 [2 [3 [4 [5]]]]]
vector-value
⇒[1 [2 [3 [4 [5]]]]]
(aref (aref vector-value 1) 0)
⇒2

重要なのは、上記のような無茶なことをすることではなく、LISPはデータのprint表現とreadシンタックスがある程度統一されてゐるとゐうことです。そして、必要ならそれをゐくらでも變數に設定することが可能です。ただ單に(1 2)あるゐは[1 2]と書くだけで、リストや配列と認識してくれるわけです。これのメリットは、一度でもC言語で作ったプログラムの單體試驗をしたことがある人なら分かるはずですね(笑)。

|

« 實行制御(2) | Main | Meadowの更新 »

Comments

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/3135703

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

« 實行制御(2) | Main | Meadowの更新 »