#私も以前ひっかかったんでした。
##ああ、儂もコメントしてるじゃん。
#えっと、Gauche部屋なのに他の言語の話題を持ってきて申し訳ないんですが、Iolanguageについて質問です。
#Io> hatena := method(call sender)
==> method(
call sender
)
Io> hatena
==> Object_0x8092028:
Lobby = Object_0x8092028
Protos = Object_0x8091f58
_ = Object_0x8092028
exit = method(...)
forward = method(...)
hatena = method(...)
set_ = method(...)
Io> obj := Object clone
==> Object_0x81d7d78:
Io> obj hate := method(call sender)
==> method(
call sender
)
Io> obj hate
==> Object_0x8092028:
Lobby = Object_0x8092028
Protos = Object_0x8091f58
_ = Object_0x8092028
exit = method(...)
forward = method(...)
hatena = method(...)
obj = Object_0x81d7d78
set_ = method(...)
#どうして hatena == obj hate がtrueになるのでしょう。
#それと、こちらは本から引っ張り出してきた例なのですが、
#Io> postOffice := Object clone
==> Object_0x82bd1f8:
Io> postOffice packageSender := method(call sender)
==> method(
call sender
)
Io> mailer := Object clone
==> Object_0x823ba20:
Io> mailer deliver := method(postOffice packageSender)
==> method(
postOffice packageSender
)
Io> postOffice packageSender == mailer deliver
==> false
#の最後がfalseになる理由が分かりません。
#Iolanguageに詳しい方、よろしければ教えてください。
#詳しくないんですが、hatena も obj hate も呼び出し元は Lobby だから hatena == obj hate になるんじゃないんでしょうか?
#2番目の例だと、mailer deliver で postOffice packageSender が呼ばれますが、この場合の呼び出し元は mailer になる(正確には deliver メソッドのローカル環境? みたいですが、ちゃんと理解していないです)ので、左辺で直接 postOffice packageSender を呼び出す場合の呼び出し元とは異なるから、falseになるのではないかと思います。
#回答ありがとうございます。大体理解できました。
#しかし、今一つ理解ができないのが、call senderのところです。
#私が今持っている書籍には、receiver message の形式をioはとると書いてあるのですが、
#call sender の所は、callがメソッドなのに、どうしてsender callとならないのですか。
#それとも、senderもメソッドなのですか?
#そこは、"call" オブジェクトに "sender" メッセージを送っているのだと思います。
##なるほど!わかりました。ありがとうございます。
#度々すいません。また、Iolanguageについてです。
#Io> method("hello, world" println) slotNames
==> list()
Io> method("Hello, world" println) call
Hello, world
==> Hello, world
#ここで、method(...) slotNames ==> callを含むリストを期待しているのですが、違うのでしょうか?
#その期待している call とは、callメソッドのことを指していますか?
#method("Hello, world" println) call の call か、それとも先の "call sender" のcallのどちらでしょう?
#前者であれば、method(...) で作られるオブジェクト自身が持っているのではなく、その proto である Block が持っているので、method("Hello, world" println) protos at(0) slotNames で返ってきます。
#後者であれば、呼び出し時に作られるので、method内で slotNames を呼び出せば見えます。
#Io> method(slotNames) call
==> list(self, updateSlot, call)