Gauche > Archives > 2013/05/09

2013/05/09 00:01:24 UTCkaki
#
promiseが他の値と区別できるかどうかも実装依存だと思いますが,thunkを識別する型って何のことですか?
2013/05/09 00:03:03 UTCyamasushi
#
手続きだということはわかるけれども、それが遅延評価のためにつかったかどうかがわからないという意味でした。なるほど、promiseの区別も実装依存でしたか。また、考えてみます。ありがとうございました。
#
1> (define x (delay (values 1 2 3)))
; no values returned
1> (force x) 

assertion-violation: returning wrong number of values [values]
                     (values 1 2 3)
;; scheme48 1.9です。
2013/05/09 00:06:52 UTCkaki
#
どうしても区別したかったら何かに包むしかないので,thunkでいいんじゃないかと思いました.何にせよ使う時に特別な手間が必要になって多値がファーストクラスになるわけではありませんし,リストにしてしまうのに比べてメリットがあるのかどうかよく分かりませんが.
2013/05/09 02:44:37 UTCyamasushi
#
> (define x (lazy (values 1 2 3)))
> (force x)
result arity mismatch;
 expected number of values not received
  expected: 1
  received: 3
  values...:
   1
   2
   3
  context...:
   /usr/local/lib/racket/collects/racket/private/more-scheme.rkt:263:2: call-with-exception-handler
   /usr/local/lib/racket/collects/racket/private/misc.rkt:87:7
> 
lazyだと、racketはエラーになりますね。 http://docs.racket-lang.org/reference/Delayed_Evaluation.html
2013/05/09 02:49:23 UTCyamasushi
#
gosh> (define x (lazy (values 1 2 3)))
x
gosh> (force x)
1
2
3
; gaucheではlazyは多値でOKのようです。
2013/05/09 02:54:13 UTCkaki
#
gosh> (define x (lazy (values 1 2 3)))
x
gosh> (force x)
1
2
3
gosh> (force x)
1
gosh>
#
大丈夫じゃなさそうです
2013/05/09 02:59:23 UTCshiro
#
ああ、promiseが多値を生成するってケースは考えていませんでしたねえ。なお(lazy (values 1 2 3))は不正です (lazyに渡す式はpromiseでないとだめ)。どうしようかな。(force (delay (values 1 2 3))) が多値を返すのは確かに筋が通ってるように思う。
2013/05/09 08:01:53 UTCyamasushi
#
Chickenのforceの実装では、listをpromiseにもっていて、valuesを問答無用でapplyしているようですね。http://code.call-cc.org/cgi-bin/gitweb.cgi?p=chicken-core.git;a=blob;f=library.scm
2013/05/09 08:04:01 UTCshiro
#
問答無用というより、多値をリストに変換して持ってるってだけじゃないですか。だから返すときにvaluesで多値に戻してる。
2013/05/09 08:20:20 UTCyamasushi
#
もっとひねった実装かなあとか思っていたのですが、案外簡単だったので。なるほど、結局はlistで持つわけですね。