Pascal(delphi)の関数内関数はクロージャなの?

そもそも、クロージャという言葉が、Lispという関数が第一級である言語から生まれたので、Pascalの関数内関数のように第一級でない関数に対して適用するのは無理がありまくりだとは思うのですが・・・
Lispでは、関数が第一級であることは、そもそも始めからそうであって、クロージャというのは、第一級の関数を認める中で、字面通りのスコープを実装しましたよという機能を指しているのであって、そういうことで、「クロージャ=レキシカルクロージャ=静的スコープ」が同義になっているのです。
さて、Pascalですが、Pascalも静的スコープの言語ですが、関数が第一級ではありません。確かに関数ポインタがあるのですが、整数とは違って、関数が作られた場所によって、関数ポインタに代入できたりできなかったりします。端的に言えば、関数内関数は関数ポインタ型の変数に代入できません。だから第一級ではない。
しかし、一度ポインタ型にキャストしてやることで、関数内関数も関数ポインタ型の変数に代入することができます。しかし、その場合は、関数内関数でアクセスしている親関数のローカル変数にアクセスしようとしたところで、アクセス違反が起こってしまいます。つまり、その点で静的スコープが実現できていないのでクロージャではありません。(ちなみに、この場合、動的スコープでもありません)
なお、関数内関数を無理に第一級として扱わないという条件に限定してやれば、静的スコープが成立しているので関数内関数はクロージャだといっても論理的な矛盾はないと思うのですが、なんか、汎用性の低い数学体系に、汎用性の高い数学体系の定義を無理やり適用したようなむなしさが漂いますね。

      • -

ちなみに、私が先日やっていたDelphiクロージャを実現する([id:lethevert:20060110])という話は、関数内関数を第一級として扱って、なおかつ静的スコープを実現するというネタです。