Gauche > Archives > 2013/03/09

2013/03/09 00:03:34 UTC齊藤
#
私も以前ひっかかったんでした。
#
http://practical-scheme.net/wiliki/wiliki.cgi?%E9%BD%8A%E8%97%A4#H-1pn0zso
2013/03/09 00:08:03 UTCshiro
#
ああ、儂もコメントしてるじゃん。
2013/03/09 03:49:12 UTCiyanaha
#
えっと、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に詳しい方、よろしければ教えてください。
2013/03/09 04:29:20 UTCkoguro
#
詳しくないんですが、hatena も obj hate も呼び出し元は Lobby だから hatena == obj hate になるんじゃないんでしょうか?
2013/03/09 04:48:37 UTCkoguro
#
2番目の例だと、mailer deliver で postOffice packageSender が呼ばれますが、この場合の呼び出し元は mailer になる(正確には deliver メソッドのローカル環境? みたいですが、ちゃんと理解していないです)ので、左辺で直接 postOffice packageSender を呼び出す場合の呼び出し元とは異なるから、falseになるのではないかと思います。
2013/03/09 05:10:53 UTCiyanaha
#
回答ありがとうございます。大体理解できました。
#
しかし、今一つ理解ができないのが、call senderのところです。
#
私が今持っている書籍には、receiver message の形式をioはとると書いてあるのですが、
#
call sender の所は、callがメソッドなのに、どうしてsender callとならないのですか。
#
それとも、senderもメソッドなのですか?
2013/03/09 05:14:08 UTCkoguro
#
そこは、"call" オブジェクトに "sender" メッセージを送っているのだと思います。
#
http://iolanguage.org/scm/io/docs/reference/index.html#/Core/Core/Call
2013/03/09 05:21:05 UTCiyanaha
#
なるほど!わかりました。ありがとうございます。
2013/03/09 06:38:27 UTCiyanaha
#
度々すいません。また、Iolanguageについてです。
#
Io> method("hello, world" println) slotNames
==> list()
Io> method("Hello, world" println) call
Hello, world
==> Hello, world
#
ここで、method(...) slotNames ==> callを含むリストを期待しているのですが、違うのでしょうか?
2013/03/09 07:05:57 UTCkoguro
#
その期待している call とは、callメソッドのことを指していますか?
#
method("Hello, world" println) call の call か、それとも先の "call sender" のcallのどちらでしょう?
2013/03/09 07:23:24 UTCkoguro
#
前者であれば、method(...) で作られるオブジェクト自身が持っているのではなく、その proto である Block が持っているので、method("Hello, world" println) protos at(0) slotNames で返ってきます。
#
後者であれば、呼び出し時に作られるので、method内で slotNames を呼び出せば見えます。
#
Io> method(slotNames) call
==> list(self, updateSlot, call)