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章の手続きが終了。色んな(組み込み)手続きが出てきました。