call-with-valuesでfuncallを作る

最近更新していなかったので、小ネタを一つ。

(define-syntax funcall
  (syntax-rules ()
    ((_ fn . args)
      (call-with-values
        (lambda () (values . args))
        fn))))

call-with-valuesがcallを内包している手続きなので当然ですが・・・
funcallが基底にあって、その拡張としてcall-with-valuesを実装するのか、
call-with-valuesが基底にあって、その糖衣構文としてfuncallを実装するのか。

どちらが先にあると考えるかで、少しだけ見えてくるものが変わる気がする。

CPS変換と多値が大好きな自分としては、
多値を渡す流れを構築するという意味で、
call-with-valuesとvaluesを主軸に置きたい。
(funcallやapplyはn-in,1-outを基準に考えているように思えてしまう)