読者です 読者をやめる 読者になる 読者になる

valuesの定義

scheme

多値を返す関数valuesは、R5RSにおいて下のようにcall/ccを使って定義されていることは比較的有名なことと思う。

(define (values . args)
  (call/cc (lambda (cc) (apply cc args))))

ところが、2,3年ほど前Schemeをやり始めた頃に使っていたMIT-Schemeでは、

(define (values . args)
  (cut apply <> args))

のように定義されていた。対応するcall-with-valuesはこんな感じか。

(define (call-with-values thunk proc)
  ((thunk) proc))

もちろん、普通に多値を使うだけならこれでも問題ないのかもしれないけれど、それでもcall-with-valuesが2引数以上の継続を作ることを想定したようなコード(それが役に立つかは知らないけど)ではうまく動かないし、そもそもここで言われてるようなパフォーマンス向上は望めなさそう。

もういくらか時間の経ってMIT-Schemeもあれからバージョンも上がっていると思うけど、今はどうなってるんだろう?