Gauche の手続き : 5

呼称: 部分適用と多値
目的: cut 式と複数の結果を返す・受け取る方法を学ぶ

lambda 式を簡略化する方法として cut 式があります。cut 式の中に現れる <> が引数のプレースホルダーになります。<> は複数あっても良く、また <...> は可変長引数を表します。

(cut <手続き> <> x)
(cut <> x y)
(cut <手続き> <> x <...>)

手続きを呼び出すことを、手続きに引数を適用すると言います。cut 式で引数の一部だけが適用された状態の式を作れるので、この操作を「部分適用」と呼びます。

使用例。

;; 以下の cut 式 と lambda 式の内容は等価
(define (my-add lis)
  (map (cut + <> 1) lis))
  又は
  (map (lambda (x) (+ x 1)) lis))

gosh> (my-add '(1 2 3))
(2 3 4)

手続きが返す複数の戻り値を多値と呼びます。多値を受け取るには receive を、多値の特定の値だけを取得するには values-ref を使用します。また、多値を返すには values を使用します。

;; 多値を受け取る
(receive <名前のリスト>
    <多値を返す式>
  <本体>)

;; 多値の特定の値を取得する
(values-ref <多値を返す式> インデックス)

;; 多値を返す
(values <式1> <式2> ... <式n>)

使用例。

;; n 番目で split するリストの前後の値を返す
(define (my-split lis n)
  (receive (da db)
           (split-at lis n)
           (list (car (reverse da)) (car db))))

gosh> (my-split '(1 2 3 4 5) 3)
(3 4)

;; 3つの引数を各々の乗算で返す
(define (my-multiply a b c)
  (values a (* b b) (* c c c)))

gosh> (my-multiply 1 2 3)
1
4
27

;; 上記の3番目の多値を取得する
gosh> (values-ref (my-multiply 1 2 3) 2)
27

7章の手続きが終了。色んな(組み込み)手続きが出てきました。