For Development HEAD DRAFTSearch (procedure/syntax/module):

11.65 srfi.235 - コンビネータ (SRFI)

Module: srfi.235

このSRFIはコンビネータのユーティリティを提供します。 Gaucheは組み込みでよく使われるコンビネータを持っていますが、このSRFIはそれを補強します。

以下の手続きは組み込みです。詳しくはコンビネータを参照してください。

constantly  complement  flip  swap  boolean

コンビネータユーティリティ

手続きを取って手続きを返す手続きです。

Function: on-left proc

[SRFI-235]{srfi.235} 2つの引数を取る手続きを返します。その手続きが呼ばれると、右側の引数を無視して 左側の引数をprocに渡します。

((on-left car) '(a b) '(c d)) ⇒ a
Function: on-right proc

[SRFI-235]{srfi.235} 2つの引数を取る手続きを返します。その手続きが呼ばれると、左側の引数を無視して 右側の引数をprocに渡します。

((on-right car) '(a b) '(c d)) ⇒ c
Function: conjoin pred …

[SRFI-235]{srfi.235} 任意個の引数を取る、次の動作をする関数を返します。 各引数に対し、pred …を左から順に適用します。pred#fを 返したらただちに#fを返します。全ての引数に対し、全てのpredが真の値を 返したら、最後の評価値を返します。predがゼロ個の場合、もしくは返された関数が 引数無しで呼び出された場合は#tを返します。

((conjoin char? digit->integer) #\1 #\2 #\3) ⇒ 3
((conjoin char? digit->integer) #\1 #\a #\3) ⇒ #f
Function: disjoin pred …

[SRFI-235]{srfi.235} 任意個の引数を取る、次の動作をする関数を返します。 各引数に対し、pred …を左から順に適用します。predが真の値を 返したらただちにその値を返します。全ての引数に対し、全てのpred#fを 返したら、#fを返します。predがゼロ個の場合、もしくは返された関数が 引数無しで呼び出された場合は#fを返します。

((disjoin integer? char?) 'a 'b 'c) ⇒ #f
((disjoin integer? char?) #\a 'b 'c) ⇒ #t
Function: each-of proc …

[SRFI-235]{srfi.235} 手続きを返します。返された手続きは、適用された際に、 各procを順に呼び出します。procの結果は捨てられます。

(define (f x y) (print (+ x y)))
(define (g x y) (print (* x y)))

((each-of f g) 2 7)
  ⇒ #<undef>; prints 9 and 14
Function: all-of pred

[SRFI-235]{srfi.235} リストをひとつ取る手続きを返します。 返された手続きは、リストの要素に順にpredを適用してゆきます。 それが#fを返したらそこで適用を打ち切り#fを返します。 そうでなければ最後のpredの適用結果を返します。 空リストに適用された場合は#tを返します。

次の等価性が成り立ちます:

((all-of pred) list) ≡ (every pred list)
Function: any-of pred

[SRFI-235]{srfi.235} リストをひとつ取る手続きを返します。 返された手続きは、リストの要素に順にpredを適用してゆきます。 それが真の値を返したらそこで適用を打ち切りその値を返します。 そうでなければ#fを返します 空リストに適用された場合は#fを返します。

次の等価性が成り立ちます:

((any-of pred) list) ≡ (any pred list)
Function: on reducer mapper

[SRFI-235]{srfi.235} (apply (on reducer mapper) args)(apply reducer (map mapper args))と同じ動作になるような手続きを返します。

(define square-sum (on + square))

(square-sum 1 2 3 4 5) ⇒ 55
Function: left-section proc arg …

[SRFI-235]{srfi.235} Returns a procedure such that, when applied to more args, calls proc with arg … and the given args. In other words, returns a specialized procedure with the left argumen(s) are given as arg ….

In Gauche, this is the same as (pa$ arg …) (see コンビネータ).

((left-section list 'a 'b 'c) 'd 'e 'f)
 ⇒ (a b c d e f)
Function: right-section proc arg …

[SRFI-235]{srfi.235} Returns a procedure such that, when applied to more args, calls proc with the newly given args concatenated with (reverse arg …).

((right-section list 'a 'b 'c) 'd 'e 'f)
 ⇒ (d e f c b a)

The reason that arg … is reversed is because of this invariance:

(right-section proc arg arg1 ...)
 ≡ (right-section (right-section proc arg) arg1 ...)
Function: apply-chain proc proc2 …

[SRFI-235]{srfi.235} Returns a procedure such that it applies the last procedure to the given arguments, then applies the previous procedure on the returned value(s), and so on. Returns the result(s) of proc.

((apply-chain car cdr) '(a b c d)) ⇒ b
((apply-chain list div-and-mod) 10 3) ⇒ (3 1)
Function: arguments-drop proc n
Function: arguments-drop-right proc n
Function: arguments-take proc n
Function: arguments-take-right proc n

[SRFI-235]{srfi.235} Returns a procedure such that proc is applied on the argument list after taking/dropping n arguments. That is, (arguments-drop proc n) is (^ args (apply proc (drop args n))), and so on.

((arguments-drop list 2) 'a 'b 'c 'd 'e)       ⇒ (c d e)
((arguments-drop-right list 2) 'a 'b 'c 'd 'e) ⇒ (a b c)
((arguments-take list 2) 'a 'b 'c 'd 'e)       ⇒ (a b)
((arguments-take-right list 2) 'a 'b 'c 'd 'e) ⇒ (d e)
Function: group-by key-proc :optional equal

[SRFI-235]{srfi.235} Returns a procedure that takes one list argument. It applies key-proc to each element of the list to get keys, and then elements with the same key are grouped into a fresh list, and returns list of such groups. The keys are compared with equal, which defaults to equal?. Within each group, elements that appears left in the original list also appears on the left.

((group-by key-proc eq-proc) lis) works like (group-collection lis :key key-proc :test eq-proc), except that group-collection can take any collection (see コレクションからの選択と探索).

((group-by (cut string-ref <> 0) char-ci=?)
 '("apricot" "Banana" "Apple" "blueberry"))
 ⇒ (("apricot" "Apple") ("Banana" "blueberry"))

構文に対応する手続き

Function: begin-procedure thunk …

[SRFI-235]{srfi.235} thunk …を左から順に呼び出します。最後のthunkの呼び出し 以外の結果は捨てられます。最後のthunkの呼び出し結果が返されます。

thunkがひとつも与えられなかった場合は#<undef>が返されます。

Function: if-procedure value then-thunk else-thunk

[SRFI-235]{srfi.235} valueが真ならthen-thunkを呼び、その結果を返します。 そうでなければelse-thunkを呼び、その結果を返します。

Function: when-procedure value thunk …
Function: unless-procedure value thunk …

[SRFI-235]{srfi.235} valueが真または偽の値に評価されたら、 各thunkを順に呼び出して、未定義値を返します。 そうでなければ直ちに返ります。

Function: value-procedure value then-proc else-thunk

[SRFI-235]{srfi.235} valueが真の値に評価されたら、 その値を引数にthen-procを呼び出しその戻り値を返します。 そうでなければ、else-thunkを引数なしで呼び出しその戻り値を返します。

Function: case-procedure value thunk-alist :optional else-thunk

[SRFI-235]{srfi.235}

Function: and-procedure thunk …

[SRFI-235]{srfi.235} thunk …を左から順に呼んでいきます。#fを返すサンクがあれば そこで評価を打ち切り#fを返します。最後のサンクまでどれも#fを返さなければ、 最後のサンクの結果を戻り値とします。thunkがひとつも与えられなかった場合は #tを返します。

Function: eager-and-procedure thunk …

[SRFI-235]{srfi.235} thunk …をまず全て呼び出し、それから結果を調べます。 どれかひとつでも#fがあったら#fを返します。 そうでなければ、最後のthunkの結果を返します。 thunkがひとつも与えられなかった場合は#tを返します。

Function: or-procedure thunk …

[SRFI-235]{srfi.235} thunk …を左から順に呼んでいきます。真の値を返すサンクがあれば そこで評価を打ち切りその値を返します。最後のサンクまでどれも真の値を返さなければ #fを返します。thunkがひとつも与えられなかった場合は #tを返します。

Function: eager-or-procedure thunk …

[SRFI-235]{srfi.235} thunk …をまず全て呼び出し、それから結果を左から右へ調べ、 最初に出会った真の値を返します。全てが#fであったり、 thunkがひとつも与えられなかった場合は#fを返します。

Function: funcall-procedure thunk

[SRFI-235]{srfi.235} thunkを呼び出しその結果を返します。 これは他の手続きに渡すのに便利です。例えば: (map funcall-procedure list-of-procedures)

Function: loop-procedure thunk

[SRFI-235]{srfi.235} 繰り返しthunkを呼びます。thunkからの大域脱出のみが ループを抜ける方法です。

Function: while-procedure thunk
Function: until-procedure thunk

[SRFI-235]{srfi.235} それぞれ、thunkが真の値を返す限り(while)、あるいは真の値を返すまで(until)、 繰り返しthunkを呼びつづけます。

補助ユーティリティ

Function: always obj …

[SRFI-235]{srfi.235} 引数を無視して常に#tを返す手続きです。 (constantly #t)と同じです。

Function: never obj …

[SRFI-235]{srfi.235} 引数を無視して常に#fを返す手続きです。 (constantly #f)と同じです。

註: booleanは組み込みです (論理値参照)。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT