68user's page 掲示板

Prev< No. 1207〜1212> Next  [最新発言に戻る] [過去ログ一覧]
No. 1207 # 68user 2000/09/29 (金) 09:39:23
> 「コールバック」という言葉じたいの
> 定義が本によってあやふやな気がして、、。
その本の記述例を見せていただけますか?

No. 1208 # ふくし [E-mail] 2000/09/29 (金) 13:17:13
すいません、、。

−−−−−−−−−−−−−−−
「Perl 5 パワフルテクニック大全集」(インプレス)
、、コード参照は、おもに、コールバック関数(後で呼び出してもらう関数)を指定するときに使う。、、

#! /usr/local/bin/perl

# コールバック関数の定義
sub callback
{
        my $mesg = shift;
        print "$mesg\n";
}

# 関数への参照を作成
my $coderef = \&callback;

# 異なるパラメータで関数を呼び出す
&$coderef("Hi Mike!");
&$coderef("How are you?");
−−−−−−−−−−−−−−−−−−−−
「Perl 5 マスターブック」(翔泳社)

サブルーチン関数の一般的な用途としてはコールバック関数があります。コールバック関数では、サブルーチンの配列をテーブル内に作成し、Perl プログラムから1つまたは複数呼び出します。、、

sub central_greeting {
        print "Hello!";
}
sub eastern_greeting {
        print "Yo!";
}
sub western_greeting {
        print "Howdy!";
}
%greetings = (
        "Central" => central_greeting,
        "Eastern" => eastern_greeting,
        "Western" => western_greeting,
)
(中略、どこの土地のひとかを $where に入れて)
$hash_ref = \%greetings;
$sub_ref = $hash_ref=>($where);
&$sub_ref();
−−−−−−−−−−−−−−−−−−−−
「実用Perlプログラミング」(オライリー)

コールバック関数とは、リファレンスとしてあちこちに渡され必要に応じて呼び出されるようなサブルーチンです。そうしたものが構文的に用意されているわけではなく、使い方としての名称に過ぎません。呼び出す(リファレンスを使用する)側のコードでは、そのサブルーチンが何をするものかを意識する必要はありません。本節では、ディスパッチテーブル、シグナルハンドラ、描画関数の3つの例を通して、コールバック関数の使い方を説明します。
−−−−−−−−−−−−−−−−−−−−

うーん、用例にしても呼び出しのレベルがいたずらに増えてるだけで、いまいち便利になった実感が。

No. 1209 # hsj 2000/09/29 (金) 14:17:27
こんにちは。

@ふくしさん
ぼくの少ない経験でしか言えませんが、
今までぼくは「コールバック関数」(もしくはハンドラ)の名称は、
「何らかのアクションを要求した際に呼び出される関数」
に対して使ってきました。
#ボタン押下のイベントに対して呼び出されるモノであったり
#シグナルイベントに対して呼び出されるモノであったり
ふくしさんが例に出されている、それぞれの本では、
>「実用Perlプログラミング」(オライリー)
の説明がほぼ的確だと思います。
>「Perl 5 パワフルテクニック大全集」(インプレス)

>「Perl 5 マスターブック」(翔泳社)
の説明は、これらの部分だけを見ると
コールバック関数と呼ぶのはおかしいような気はしますね。
どちらかと言うと、コールバック関数として使う際に便利に呼び出せるように
準備をしているところに見えます。
あくまでもそれぞれ、コード参照とサブルーチンの説明なのではないでしょうか。

No. 1210 # 68user 2000/09/29 (金) 19:42:54
全くもって同感です<hsj さん

> 「何らかのアクションを要求した際に呼び出される関数」
あと、このアクションは「非同期に発生する」というのも
重要な要素なのかな? (違うかも)

No. 1211 # ふくし [E-mail] 2000/09/30 (土) 12:54:33
なるほどー(知恵熱)
ひとつわからないのが、Tkやシグナルハンドラのように、
そのアクションをキャッチする機構がシステムによって用意されているもの
(BASICのON命令みたいなもんですね)
だけをコールバックと呼ぶんでしょうか?
それとも、呼び出し元も自前のPerlコードで書いた例がなにかあるでしょうか?
あと非同期ってどういう意味なんでしょう。
あとなんでコールバック(電話を掛けなおすこと)っていうんでしょね。
すいませんずうずうしくお伺いして、、。

No. 1212 # 68user 2000/10/03 (火) 01:47:46
ん〜、こういうのは自分の中で納得できるかどうかなので、
うまく説明するのは僕には難しいなぁ。

> あと非同期ってどういう意味なんでしょう。
プログラム側から「いつそのアクションが起きるか」を
知ることができないということです。たとえば、マウスの
クリックがいつ発生するだとか、シグナルがいつ飛んで
くるかを、プログラムの側から予想することはできません。

> Tkやシグナルハンドラのように、そのアクションをキャッチする機構が
> システムによって用意されているものだけをコールバックと呼ぶんで
> しょうか?
そうだと思います。というより、システム (OS) の手助けを
借りなければ、非同期なアクションに応答することはできません。

signal は非同期でやってきますので、シグナルハンドラという
機構が OS にあります。

ボタンの押下は、結局は X Window System のイベントとして
socket 経由でデータが送られてきます。これは select で
データが送られてきているかどうかを調べます (たぶん)。

結局どちらも OS の手助けを借りている (=システムコール
を使う) わけです。

Prev< No. 1207〜1212> Next  [最新発言に戻る] [過去ログ一覧]