srfi.235 - コンビネータ (SRFI) ¶このSRFIはコンビネータのユーティリティを提供します。 Gaucheは組み込みでよく使われるコンビネータを持っていますが、このSRFIはそれを補強します。
以下の手続きは組み込みです。詳しくはコンビネータを参照してください。
constantly complement flip swap boolean
手続きを取って手続きを返す手続きです。
[SRFI-235]{srfi.235}
2つの引数を取る手続きを返します。その手続きが呼ばれると、右側の引数を無視して
左側の引数をprocに渡します。
((on-left car) '(a b) '(c d)) ⇒ a
[SRFI-235]{srfi.235}
2つの引数を取る手続きを返します。その手続きが呼ばれると、左側の引数を無視して
右側の引数をprocに渡します。
((on-right car) '(a b) '(c d)) ⇒ c
[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
[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
[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
[SRFI-235]{srfi.235}
リストをひとつ取る手続きを返します。
返された手続きは、リストの要素に順にpredを適用してゆきます。
それが#fを返したらそこで適用を打ち切り#fを返します。
そうでなければ最後のpredの適用結果を返します。
空リストに適用された場合は#tを返します。
次の等価性が成り立ちます:
((all-of pred) list) ≡ (every pred list)
[SRFI-235]{srfi.235}
リストをひとつ取る手続きを返します。
返された手続きは、リストの要素に順にpredを適用してゆきます。
それが真の値を返したらそこで適用を打ち切りその値を返します。
そうでなければ#fを返します
空リストに適用された場合は#fを返します。
次の等価性が成り立ちます:
((any-of pred) list) ≡ (any pred list)
[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
[SRFI-235]{srfi.235}
手続きを返します。その手続きを引数x …で呼び出すことは、
(proc arg … x …) と同じ効果をもたらします。
言い換えれば、右側の引数をarg …で固定した手続きを返します。
Gaucheではこれは(pa$ arg …)と同じです(コンビネータ参照)。
((left-section list 'a 'b 'c) 'd 'e 'f) ⇒ (a b c d e f)
[SRFI-235]{srfi.235}
手続きを返します。その手続きを引数x …で呼び出すことは、
(apply proc x … (reverse (list arg …)))
と同じ効果をもたらします。
((right-section list 'a 'b 'c) 'd 'e 'f) ⇒ (d e f c b a)
arg …を逆順にするのは次の不変条件を満たすためです。
(right-section proc arg arg1 ...) ≡ (right-section (right-section proc arg) arg1 ...)
[SRFI-235]{srfi.235}
手続きを返します。その手続きに引数を渡すと、
まず最後のprocがその引数で呼ばれ、
その戻り値(複数可)を引数としてその手前のprocが呼ばれ…という具合に
進み、先頭のprocの戻り値が手続きの戻り値となります。
((apply-chain car cdr) '(a b c d)) ⇒ b ((apply-chain list div-and-mod) 10 3) ⇒ (3 1)
手続き呼び出しをチェインする別のやり方として、
srfi.197 - パイプラインオペレータがあります。
[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)
[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"))
[SRFI-235]{srfi.235}
thunk …を左から順に呼び出します。最後のthunkの呼び出し
以外の結果は捨てられます。最後のthunkの呼び出し結果が返されます。
thunkがひとつも与えられなかった場合は#<undef>が返されます。
[SRFI-235]{srfi.235}
valueが真ならthen-thunkを呼び、その結果を返します。
そうでなければelse-thunkを呼び、その結果を返します。
[SRFI-235]{srfi.235}
valueが真または偽の値に評価されたら、
各thunkを順に呼び出して、未定義値を返します。
そうでなければ直ちに返ります。
[SRFI-235]{srfi.235}
valueが真の値に評価されたら、
その値を引数にthen-procを呼び出しその戻り値を返します。
そうでなければ、else-thunkを引数なしで呼び出しその戻り値を返します。
[SRFI-235]{srfi.235}
thunk-alist引数は、値とサンクのペアのリストです。
まずvalueが評価され、その値がthunk-alist中のペアのcarの値と順にeqv?
で比較されます。一致するエントリが見つかったら、そのペアのcdrにあるサンクが呼ばれ、
その結果が戻り値となります。一致するエントリが無い場合、
else-thunkが与えられていればそれが呼ばれてその結果が戻り値となり、
与えられていなければ未定義値が返されます。
[SRFI-235]{srfi.235}
thunk …を左から順に呼んでいきます。#fを返すサンクがあれば
そこで評価を打ち切り#fを返します。最後のサンクまでどれも#fを返さなければ、
最後のサンクの結果を戻り値とします。thunkがひとつも与えられなかった場合は
#tを返します。
[SRFI-235]{srfi.235}
thunk …をまず全て呼び出し、それから結果を調べます。
どれかひとつでも#fがあったら#fを返します。
そうでなければ、最後のthunkの結果を返します。
thunkがひとつも与えられなかった場合は#tを返します。
[SRFI-235]{srfi.235}
thunk …を左から順に呼んでいきます。真の値を返すサンクがあれば
そこで評価を打ち切りその値を返します。最後のサンクまでどれも真の値を返さなければ
#fを返します。thunkがひとつも与えられなかった場合は
#tを返します。
[SRFI-235]{srfi.235}
thunk …をまず全て呼び出し、それから結果を左から右へ調べ、
最初に出会った真の値を返します。全てが#fであったり、
thunkがひとつも与えられなかった場合は#fを返します。
[SRFI-235]{srfi.235}
thunkを呼び出しその結果を返します。
これは他の手続きに渡すのに便利です。例えば:
(map funcall-procedure list-of-procedures)。
[SRFI-235]{srfi.235}
繰り返しthunkを呼びます。thunkからの大域脱出のみが
ループを抜ける方法です。
[SRFI-235]{srfi.235}
それぞれ、thunkが真の値を返す限り(while)、あるいは真の値を返すまで(until)、
繰り返しthunkを呼びつづけます。
[SRFI-235]{srfi.235}
引数を無視して常に#tを返す手続きです。
(constantly #t)と同じです。
[SRFI-235]{srfi.235}
引数を無視して常に#fを返す手続きです。
(constantly #f)と同じです。
註: booleanは組み込みです (論理値参照)。