このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

AS のハンドラーをオブジェクトとして扱う

発言者:田中求之
( Date Monday, June 09, 1997 23:20:53 )


ええ、知ってた人には今更な話でしょうが、私は今ごろになって、以下のようなスクリプト
で、ハンドラーがオブジェクトとして扱えるのを知りました( Scripting ML で
流れてたメールで知った)。

===

on handlerOne(you)
  display dialog you & "さん、私はハンドラー1です"
end handlerOne

on handlerTwo(you)
  display dialog you & "、おれはハンドラー2だぜぇ"
end handlerTwo

set hList to {handlerOne, handlerTwo}

set doThisHandler to some item of hList

doThisHandler("田中")

===

Python いじっていて、関数がオブジェクト扱いできたり、ラムダ関数があるのが
うらやましかったんだけど、なんと手元にもあったとは…

AS って奥が深いぜ。

田中求之 さんからのコメント
( Tuesday, June 10, 1997 01:43:06 )

正確には、オブジェクトとして扱うのではなくて、ハンドラーへのリファレンスを
操作するということですね(このへんは OOP に詳しい方にまかせるとして (^_^;;  )


田中求之 さんからのコメント
( Tuesday, June 10, 1997 02:26:39 )

で、こういうこともできるわけです(指定したハンドラーに、リストで渡したデータを
順に処理させる)

====

on greeting(someone)
  return "Hello, " & someone
end greeting

on greeting2(someone)
  return "Hi, " & someone
end greeting2

set myList to {"Bill", "Steve", "Motoyuki"}

set dx to some item of {greeting, greeting2}

doIt(dx, myList)

on doIt(dx, them)
  set yList to {}
  repeat with xMan in them
    set end of yList to dx(xMan)
  end repeat
  return yList
end doIt

===

この場合、doIt ハンドラーのパラメーターの dx は、dx 以外のものにすると
エラーになります。

hODA さんからのコメント
( Tuesday, June 10, 1997 07:18:24 )

on oldHandler()
  display dialog "古いハンドラ-だよ"
end oldHandler

on newHandler()
  display dialog "新しいハンドラ-だよ"
end newHandler

set oldHandler to newHandler
oldHandler()

のようにハンドラーそのものを書き換えることも出来るようです。
但し ヌevent XXXXYYYYネ の形のハンドラーは object としては扱えないようです。

p.s. AppleScript っていつから case sensitive になったのでしょうか

田中求之 さんからのコメント
( Tuesday, June 10, 1997 09:23:01 )

> AppleScript っていつから case sensitive になったのでしょうか

ハンドラーへのリファレンスの場合は、case sensitive (というか、コンパイル
した時点で、もとのハンドラーと同じ case にそろえられます)になっているよう
ですが、文字列の処理などは case insensitive ですよ( "A" is "a" は
true になります)


狩野正嗣 さんからのコメント
( Tuesday, June 10, 1997 21:17:46 )

 話がずれますが、「considering/ignoring」を使えば、
sensitive/insensitiveを切り替えることができますね。


→  Control Statements--Considering/Ignoring