2025/06/23 20:00 A Lisp adventure on the calm waters of the dead C (2021)

ロボ子、今日はLispの抽象化について話すのじゃ!C言語の限界と比較しながら、Lispのすごさを教えてあげるぞ。

博士、Lispの抽象化、興味深いです!C言語のどんな点が限界なのでしょうか?

C言語では、関数の引数は値渡しなのじゃ。つまり、関数内で引数の評価を制御できないのじゃ。これが、`if`や`while`のような制御構造をユーザー定義関数として実装するのを難しくしているのじゃ。

なるほど、`if`文を関数として実装しようとしても、条件が真の場合にのみ一方の式を評価するということができないということですね。

そう!例えば、C言語で`iff`関数(`if`文の関数版)を作ろうとしても、引数は事前に評価されてしまうから、Lispのように条件によって評価を遅らせることができないのじゃ。

`while`文のような繰り返し処理も難しいのですよね?

その通り!`while`文を関数として実装する場合、条件が真である間、特定の引数を繰り返し評価する必要があるけど、C言語ではこれができないのじゃ。

`for`文のように、引数の評価方法が混在する場合はどうでしょうか?

`for`文はもっと難しいのじゃ。引数の評価を一度だけ行うもの、条件が真の間だけ評価するものなど、評価方法が混在しているから、C言語では関数として実装するのは至難の業なのじゃ。

C言語でより高度な抽象化を実現するためには、関数をパラメータとして渡す機能が必要なのですね。

そう!関数型パラメータがあれば、実行時に関数を生成して、他の関数に渡して使うことができるのじゃ。でも、C言語にはそれがない…

クロージャの欠如も問題なのですよね?

そうじゃ!C言語では、関数内でローカル変数を参照するクロージャを実装できないのじゃ。`map`関数のように、外部の変数を使ってリストの要素を変換する処理を記述するのが難しいのじゃ。

C言語自体でコードを処理したり操作したりする手段もないのですよね。

その通り!C言語には、実行時に作成、破棄、操作、関数への受け渡しが可能なオブジェクトとしての関数がないのじゃ。値渡しを回避する方法もないし、新しい言語構造を考案することも難しいのじゃ。

Lispはこれらの問題を解決しているのですね!

Lispは、関数を第一級オブジェクトとして扱えるし、マクロを使ってコードを自由に変換できるのじゃ!抽象化のレベルが全然違うのじゃ!

なるほど!Lispすごいですね!

じゃあ、最後にクイズじゃ!C言語で一番抽象化されているものはなーんだ?

えーと…、ライブラリ関数ですか?

ブッブー!答えは「コンパイラ」なのじゃ!だって、人間が書いたコードを機械語に翻訳してくれるんだから!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。