07 June 2008

7章 手続き 7.3~7.9 :: プログラミングGauche

7章の続きです。内容は、

  • ローカル変数
  • 可変長引数を取る
  • 可変長引数を渡す
  • 引数のパターンマッチング
  • 省略可能引数とキーワード引数
  • 部分適用
  • 多値

です。色々な話が出てきたので、一回読んだくらいじゃ身についてないと思います。今後見かえすことになりそうなので、出てきた構文やトピックをリストにしてみます。

  • let / let* / letrec
  • ドット表記で可変長引数をとる
  • apply
  • match
  • list*
  • make-list
  • let-optinals*
  • 「:」でキーワード / keyword? / make-keyword
  • cutと<>
  • split-at
  • receive
  • let-values / let*-values
  • values-ref
  • values

興味深かったのは、p75のコラム「構文の拡張とマクロ」です。lispはすべてがリストで表現されていると言われていたのですが、このコラムの例でその意味を実感できました。

関数の定義式には、ラムダ式を使う本来のものと、省略形のMIT記法があります。

;; もともとの定義式
(define func (lambda (a b . c) body))

;;MIT記法
(define (func a b . c) body)

当然、それぞれの式はリストなので、car、cdr、consを使ってリストを操作し、一方の記法をもう一方へ変換することができます。

;; MIT -> もともとの定義式
(define (mit-from->primitive-from expr)
   (cons (car expr)
         (cons (car (car (cdr expr)))
               (cons (cons 'lambda
                           (cons (cdr (car (cdr expr)))
                                 (cdr (cdr expr))))
                     '()))))

;; もともと->MITは省略

ここではあえてcar / cdr / consのみで書いているので、ややこしいコードになっていますが、色々な構文を用いることでもっとコンパクトに表現することもできます。lispは最低限のルールのみでできているということを、また改めて実感できました。すごいです。