アカウント名:
パスワード:
type TProc = procedure(hoge: integer); //integerを受け取る手続き TFunc = function: Integer //integerを返す関数
type TMyFunc = function: Integer; function f1: Integer; begin result := 1; end; function f2: TMyFunc; begin Result := f1; end;procedure test;var I: Integer; F: TMyFunc;begin I := f1; // 1 F := f1; // TMyfunc F; //1end;
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
物事のやり方は一つではない -- Perlな人
Pascalで関数ポインタはたしか… (スコア:0)
http://jp.rubyist.net/magazine/?0021-Hotlinks#fm06 [rubyist.net]
関数のあとの引数括弧を略するルールについての話あたりで、
Pascalについて
「関数なんて型は無さそうだよね。」
とのことですが、
記憶に間違いがなければ
(すみません手元に処理系がないもんで)
関数ポインタみたいなものは有ったと記憶しています。
記憶してるのはBorland拡張かも知れませんが、少なくとも「Pascalらしさ」を崩してるようには見えませんでした。
以下、処理系も仕様書も参照してなくて個人的憶測でしかなく恐縮なのですが、想像を書いてみます。
識者さん突っ込んでください。
Pascalは、(Cや)Rubyと違う点として、
●関数とプロシジャの区別(返し値の有無)が有り、それは厳格。
●厳格というのは、関数なのに返し値を受け取らないとか、プロシジャなのに受け取ろうとするとか、は構文(コンパイル)エラー扱いということ。
●型も厳格。Cみたいにテキトウではない。
といった性質があるので、たぶん、以下のように処理できますよね。
●プロシジャなのに左辺値のようなものを受け取ろうとしてたら、
それは返し値じゃなく関数ポインタの要求としか解釈できない。
よってそう解釈を試み、それでもうまくいかなければコンパイルエラーに。
●関数の場合、左辺値の「型」が
関数ポインタ型じゃなければ、関数呼び出しとしか解釈できない。以下同文。
●また、関数で、関数呼び出し引数用の括弧が後ろについていれば、
これも関数呼び出しである。
●関数で、返し型がたまたま同じ型の関数ポインタ型で、
しかも受け取る左辺値変数も正しく同じ型で、
しかも引数括弧が略されてたら、
区別は不能なんで、
これは別のルールが必要ですね。
どっちかを優先して解釈するかといったルールが。
…というふうに
「何を返すか」だけじゃなく
「何を返すのを期待してるか」ででも
制御が出来るんじゃないでしょうか。
そしてそれは、(変数の)型が強い言語だからこそ。
Rubyのように弱い型付けの言語だと、
左辺値変数の型などの情報をフィードバックすることは不可能なので、
いっけん似ててもPascalと同じことは出来ないと言えると思います。
(Rubyじゃ出来ないから悲しいなどというつもりはありません。むしろ嬉しいです。逆にPascalのルールの複雑さに参ってました。)
あと、キイハナですが、
オリジナルPascalは、BorlandでいうUnitのような
モジュールの仕組みも無かったそうです。
となるとソースは常に一本きりで、
コンパイラはソース「全部」を一発で見渡せたはずです。
となると、上記のような「(左辺も見る)踏み込んだ解釈」も、よりやり易いのではないでしょうか?
石塚さんは
>そういうものは扱えないよね、きっとね。硬すぎて。
と仰ってますが、Pascalの言うところの硬さとは、そういう方向性ではないと思います。
関数ポインタの概念は例えばPascalのガチガチの型システムと矛盾するか?というと、別にしない。
関数といってもLispみたいな意味での関数ではなく、Cの関数程度なので、
そう難しいことではないはずです。
(Pascalには関数内関数もあるが、Lispのそれとは全然違うし。)
Re:Pascalで関数ポインタはたしか… (スコア:1)
Delphiでは手続き型があってこれが関数ポインタになります。 代入の左辺が手続き型の場合は代入です。それ以外の場合は呼び出しになります。 なんてのはコンパイルできます。
この辺はBorland拡張というか、原始Pascalにはポインタも無いんで扱えはしませんね。 少なくともポインタの概念を導入しないと使えないので、Pascal上では矛盾持ちだと思えます。
> コンパイラはソース「全部」を一発で見渡せたはずです。
一応Delphi上でもコンパイラは1パスになるのでソースはすべて見えています。