わわ,Danさんにリンクされてしまった.404 Blog Not Found:C - tailとqueueという記事.なんというか,C言語でもこんなきれいなコードかけるんだなぁ.ほんと,「C言語だしなー」って言い訳して冗長なコード書いてる場合じゃないぜ.ちなみに,元ネタははこべにっき# - C言語でtailっぽいものを書く.以下コード引用たくさん.
char *new_string(char *str){ char *new = (char *)malloc(strlen(str)+1); if (new == NULL) DIE_OUT_OF_MEMORY; strcpy(new, str); /* it's okay not to use strncpy */ return new; }
it's okay not to use strncpy
とコメントにあるように,strlenで文字列の長さ拾ってるのでstrncpy使う必要ないということか.
struct list { void *car, *cdr; }; typedef struct list list;
これなんてLisp? void型のポインタはたしかに何かと便利そうに思える.
void del_queue(queue *q){ list *l; if (q == NULL) return; while((l = dequeue(q)) != NULL){ del_list(l); } free(q); }
このコードはかなり美しい.ほかの部分みてもそうなんだけど,元ネタのうちの書いたコードのように,
for (cur = q->top; cur->next != NULL; cur = cur->next);
リストをだらだらと辿るコードがまったくない.そもそもqueueなんだから先頭と末尾をみてれば良いのだから,リスト辿る必要なんて無いよな.さらに,headとtail使って基本操作を定義しとく.すると,queueの破棄だってこんな風に抽象的に表現できるのだなぁ.Cで書いてあるとは思えん.
oid traverse_queue(queue *q, int (*callback)(void *)){ list *l; for (l = q->head; l; l = l->cdr) callback(l->car); }
そして関数ポインタ.これなんてL(ry.クロージャっぽくて柔軟でかなりすてき.
このコードみておどろいたのはCでもCoolなコードが書けるってことだ.最近はPerlやらRubyやらさわりながら,「スクリプト言語さいこう!Cなんかじゃ到底かけないきれいさだぜ!」なんて思っていたよ.まぁ,しかし考えてみれば,PerlだってRubyだってCで書かれてるんだな.スクリプト言語のCoolさはそんなCから生まれてるんだ.
いや,むしろ,そうじゃないか,結局プログラミング言語ってのはロジックを記述するための道具だもの.言語に関係なくロジックがきれいならどんな言語でもコードはきれいになるのかもしんない.それが書きやすいかは別として.