The King's Museum

ソフトウェアエンジニアのブログ。

cut 式とプログラミング Gauche 7章

cut 式

関数を部分適用したい時に使えるらしい。

例えば、

二つのパラメータを取る cons。片方のパラメータを 1 に特殊化したい。

そういう場合には、

(cut cons 1 <>)

と簡潔に書くことができる。

cut 式は実際には lambda の糖衣構文。

(lambda (x) (cons 1 x)) ; = (cut cons 1 <>)

たしかに cut 式の方が簡潔にかける。

ちなみに名前にこれぞという語源はなさそうだ *1

7章: 手続き

7章はちょっと長かったな。以下はメモ。コードはこちら

  • 評価の結果が #<...> のものは読み戻せない
  • 手続きも、数値、文字列、真偽値と同じ、値として他の変数に束縛できる
  • (define (NAME args) expr ...) = (define NAME (lambda (args) expr ...)
    • 前者は MIT 記法
  • for-each: 要素に手続きを適用して、返り値なし
  • map: 要素に手続きを適用して、返り値あり
  • map や for-each は複数のリストを同時に処理できる
  • スコープ
    • let: lambda の糖衣構文。順序は保証されない。
    • let*: let がネストしているだけ。
    • letrec: 初期化式が lambda の場合に変数を参照できる。再帰を書くために使う。
  • ロカール手続きは内部的には letrec として扱われる
  • 可変長引数
    • (define (func a b . c) ...) ⇒ a = 1, b = 2, c = (3 4 5)
    • (define (func . a) ...) ⇒ a = (1 2 3 4 5)
  • apply: リストを unpack して、手続きに適用する
  • match 構文
  • let-optionals* 構文
  • let-keywords 構文
  • cut 構文: 部分適用
    • (cut cons 1 <>) ⇒ (lambda (x) (cons 1 x))
  • 多値
    • リストでも値を返せるが、取り出しが面倒だったり、非効率だったりする
    • receive で受け取る
    • let-values や let*-values でも受け取れる
    • values で返す

プログラミングGauche

プログラミングGauche

(c) The King's Museum