ドットリスト、ドット対

いまいち理解しきれてない。使いどころが分からん。
例えば、

(define MIT->primitive
  (lambda (expr)
    (match expr
      (('define (func . args) . body)
       (list 'define func (list* 'lambda args body))))))

のmatchのパターンのところが、なぜ

('define (func args) body)

じゃなくて

('define (func . args) . body)

なのか。


あと、それに付随するのかもしれんが、なんで

(list 'lambda args body)

じゃなくて

(list* 'lambda args body)

なのか。
実際に動かしてみると違った結果が得られるから違うのは分かる。
だけど、なぜ違うのかという根拠を整理できていない。
つまり分かってないってことじゃんかーーー。くそー。


さらには、

'(foo bar baz)

'(foo bar . baz)

の違いが分からん。
これが根本的な原因?