戻る |
sourceのVARIANT変数をtargetのVARIANTへmoveする |
|
Function moveVariant(ByRef source As Variant) As Variant |
|
|
|
Function p_moveVariant( |
|
|
|
a = moveVariant(b) |
|
↑ swapVariant(a, b) : swapVariant(b, Empty) と同等 |
|
|
|
|
|
プレースホルダ(置かれた位置によって第1引数もしくは第2引数を受け取る) |
|
Function ph_0()
As Variant |
|
|
|
|
|
プレースホルダ(第1引数を受け取る) |
|
Function ph_1()
As Variant |
|
|
|
printM
zipWith(p_minus, Array(1, 2, 3), Array(9, 8, 7)) |
|
-8 -6 -4 |
|
printM
zipWith(p_minus(ph_2,
ph_1), Array(1, 2,
3), Array(9, 8, 7)) |
|
8 6
4 |
|
↑引数への代入を操作 |
|
|
|
|
|
プレースホルダ(第2引数を受け取る) |
|
Function ph_2()
As Variant |
|
|
|
printM
zipWith(p_minus, Array(1, 2, 3), Array(9, 8, 7)) |
戻る |
-8 -6 -4 |
|
printM
zipWith(p_minus(ph_2,
ph_1), Array(1, 2,
3), Array(9, 8, 7)) |
|
8 6
4 |
|
↑引数への代入を操作 |
|
|
関数評価時に ph_0 を生成する |
|
Function yield_0() As Variant |
|
|
|
fun = p_foldl1(p_plus(yield_0, yield_0)) |
|
↑評価時に p_foldl1(p_plus(ph_0, ph_0)) を生成 |
|
|
関数評価時に ph_1 を生成する |
|
Function yield_1() As Variant |
|
|
|
fun = p_foldl1(p_plus(yield_1, yield_2)) |
|
↑評価時に p_foldl1(p_plus(ph_1, ph_2)) を生成 |
|
|
関数評価時に ph_2 を生成する |
|
Function yield_2() As Variant |
|
|
|
fun = p_foldl1(p_plus(yield_1, yield_2)) |
|
↑評価時に p_foldl1(p_plus(ph_1, ph_2)) を生成 |
戻る |
|
|
|
Array() が IsMissing = True
になることのWorkAround |
|
Function Is_Missing_(Optional ByRef x As Variant) As Boolean |
|
|
ユーザ関数をbindして関数オブジェクト化する(関数の部分適用) |
|
make_funPointer(func)
引数の束縛なし |
|
make_funPointer(func, firstParam)
1番目の引数を束縛 |
|
make_funPointer(func, , secondParam)
2番目の引数を束縛 |
|
make_funPointer(func, firstParam, secondParam) 両方の引数を束縛(遅延評価) |
|
Function make_funPointer(ByVal func As LongPtr, _ |
|
Optional ByRef firstParam As Variant, _ |
|
Optional ByRef secondParam As Variant) As Variant |
|
|
|
p_plus = make_funPointer(AddressOf plus, firstParam,
secondParam) |
|
↑plus 関数の関数オブジェクトを作成 |
|
|
ユーザ関数をbindファンクタ化する(2番目の引数にデフォルト値を設定する場合) |
|
Function make_funPointer_with_2nd_Default(ByVal func As LongPtr, _ |
|
Optional ByRef firstParam As Variant, _ |
|
|
|
p_log = make_funPointer_with_2nd_Default(AddressOf logN, firstParam, secondParam) |
|
↑logN 関数の関数オブジェクトを作成 |
|
(第2引数がOptionalで、省略された場合とされない場合で挙動が異なる) |
|
戻る |
ユーザ関数をbindファンクタ化する(3つのパラメータを持つ関数) |
|
Function make_funPointer_with_3_parameters(ByVal func1 As LongPtr, _ |
|
ByVal func2 As LongPtr, _ |
|
ByVal func3 As LongPtr, _ |
|
ByRef firstParam As Variant, _ |
|
ByRef secondParam As Variant, _ |
|
ByRef thirdParam As Variant) As Variant |
|
|
bindされた関数であることの判定 |
|
Function is_bindFun(ByRef val As Variant) As Boolean |
|
|
未束縛の第1引数を束縛する |
|
Function bind1st(ByRef
func As Variant, ByRef firstParam As Variant) As Variant |
|
|
|
Function p_bind1st( |
|
|
|
既に束縛済みの引数は変更できない(swap1stを使用する) |
|
|
未束縛の第2引数を束縛する |
|
Function bind2nd(ByRef
func As Variant, ByRef secondParam As Variant) As Variant |
|
|
|
Function p_bind2nd( |
|
|
|
既に束縛済みの引数は変更できない(swap2ndを使用する) |
|
戻る |
第1引数のswap |
|
Sub swap1st(ByRef
func As Variant, ByRef firstParam As Variant) |
|
|
|
swap1st fun, a
' 一時的にfunの束縛された第1引数をaと交換する |
|
mapF(fun, m)
' fun を使う |
|
swap1st fun, a
' 元に戻す |
|
|
第2引数のswap |
|
Sub swap2nd(ByRef
func As Variant, ByRef secondParam As Variant) |
|
|
|
swap2nd fun, a
' 一時的にfunの束縛された第2引数をaと交換する |
|
mapF(fun, m)
' fun を使う |
|
swap2nd fun, a
' 元に戻す |
|
|
|
|
|
配列(3次元まで)の各要素に関数を適用する |
|
Function mapF(ByRef
func As Variant, ByRef matrix As Variant) As Variant |
|
|
|
Function p_mapF( |
|
|
|
返り値はmatrixと同じ形の配列 |
|
printM mapF(p_plus, iota(1,10)) |
|
2 4
6 8 10 12 14 16 18 20 |
戻る |
m = makeM(3, 3, iota(1, 9)) : printM m |
|
1 2
3 |
|
4 5
6 |
|
7 8
9 |
|
printM mapF(p_minus(,3), m) |
|
-2 -1 0 |
|
1 2 3 |
|
4 5 6 |
|
|
mapF(fun(a), m) または mapF(fun(, a), m)の構文糖 |
|
ただしaはmoveされ、処理後戻される。 |
|
式
fun(a) や fun(, a) に伴う配列のコピーが避けられる。(大きな配列の場合考慮を要する) |
|
Function mapF_swap(ByRef fun As Variant, _ |
|
Optional ByRef x As Variant, _ |
|
Optional ByRef y As Variant, _ |
|
Optional ByRef z As Variant) As Variant |
|
|
|
パターン1
mapF_swap(fun, a, m) ->
mapF(fun(a), m) |
|
パターン2
mapF_swap(fun, , b, m) -> mapF(fun(, b), m) |
|
パターン3
mapF_swap(fun, a, , m) -> mapF(fun(a), m) (パターン1と同じ) |
戻る |
パターン4
mapF_swap(fun, a, b, m)
-> mapF(fun(a, b), m) (禁止) |
|
|
|
|
|
関数適用関数 1引数に対して関数を適用する 関数はBind式 |
|
Function applyFun(ByRef param As Variant, ByRef func As Variant) As Variant |
|
|
|
Function p_applyFun( |
|
|
|
パターン1. applyFun(x
, Null)
-> x |
|
パターン2. applyFun(x
, Empty) -> x |
|
パターン3. applyFun(x
, f(a, b))
-> f(a, b) |
|
パターン4. applyFun(x
, f(a) )
-> f(a, x) |
|
パターン5. applyFun(x
, f(, b) ) -> f(x, b) |
|
パターン6. applyFun(x
, f
)
-> f(x, x) |
|
|
関数に1引数を代入する関数 |
|
Function setParam(ByRef func As Variant, ByRef param As Variant) As Variant |
戻る |
|
|
Function p_setParam( |
|
|
|
パターン1. setParam(Null , x )
-> x |
|
パターン2. setParam(Empty
, x )
-> x |
|
パターン3. setParam(f(a, b) , x ) -> f(a, b) |
|
パターン4. setParam(f(a) , x )
-> f(a, x) |
|
パターン5. setParam(f(, b)
, x ) -> f(x, b) |
|
パターン6. setParam(f , x ) -> f(x, x) |
|
|
関数合成(foldl) |
|
Function foldl_Funs(ByRef init As Variant, ByRef funcArray As Variant) As Variant |
|
|
|
Function p_foldl_Funs( |
|
|
|
funcN(…func2(func1(func0(init)))…) |
|
戻る |
関数合成(scanl) |
|
Function scanl_Funs(ByRef init As Variant, ByRef funcArray As Variant) As Variant |
|
|
|
Function p_scanl_Funs( |
|
|
|
foldl_Funsの履歴 |
|
|
関数合成(foldr) |
|
Function foldr_Funs(ByRef init As Variant, ByRef funcArray As Variant) As Variant |
|
|
|
Function p_foldr_Funs( |
|
|
|
func0(func1(…(funcN(init)))…) |
|
|
関数合成(scanr) |
|
Function scanr_Funs(ByRef init As Variant, ByRef funcArray As Variant) As Variant |
|
|
|
Function p_scanr_Funs( |
|
|
|
foldr_Funsの履歴 |
|
戻る |
((x, y), f) に対して f(x, y) を返す |
|
((x, y), (f1, f2, ...))
に対して Array(f1(x, y), f2(x,
y), ...) を返す |
|
Function applyFun2by2(ByRef params As Variant, ByRef funcs As Variant) As Variant |
|
|
|
Function p_applyFun2by2( |
|
|
(f, (x, y)) に対して f(x, y) を返す |
|
((f1, f2, ...), (x, y))
に対して Array(f1(x, y), f2(x,
y), ...) を返す |
|
Function setParam2by2(ByRef funcs As Variant, ByRef params As Variant) As Variant |
|
|
|
Function p_setParam2by2( |
|
|
配列 matrix の各要素で述語による評価結果がゼロでないものの数 |
|
Function count_if(ByRef pred As Variant, ByRef matrix As Variant) As Variant |
|
|
|
Function p_count_if( |
|
戻る |
1次元配列から条件に合致するものを検索(最初にヒットしたインデックスを返す) |
|
Function find_pred(ByRef pred As Variant, ByRef vec As Variant) As Variant |
|
|
|
Function p_find_pred( |
|
|
|
1次元配列以外であれば返り値はEmpty、無かった場合は UBound(vec) + 1 を返す |
|
?find_pred(p_equal(5), iota(1,10)) |
|
4 |
|
?find_pred(p_less(11), iota(1,10)) |
|
10 |
|
|
|
|
|
1次元配列から条件に最良合致するものを検索(最初にヒットしたインデックスを返す) |
|
Function find_best_pred(ByRef pred As Variant, ByRef vec As Variant) As Variant |
|
|
|
Function p_find_best_pred( |
|
|
|
a = uniform_int_dist(10, 1, 100) |
戻る |
printM a |
|
40 92 12 49 81 8
5 90 59 12 |
|
printM find_best_pred(p_less, a) |
|
6 |
|
|
|
|
|
|
述語による条件が満たされる間繰り返し関数適用 |
|
Function repeat_while(ByRef val As Variant, _ |
|
ByRef pred As Variant, _ |
|
ByRef fun As Variant, _ |
|
Optional ByVal n As Long = -1) As Variant |
|
|
|
?repeat_while(1, p_less(, 100), p_mult(2))
← < 100 が成り立っている間 *2 を繰り返す |
|
128 |
|
?repeat_while(1, p_true, p_mult(2), 16)
← *2を16回繰り返す |
|
65536 |
|
|
述語による条件が満たされない間繰り返し関数適用 |
|
Function repeat_while_not(ByRef val As Variant, _ |
|
ByRef pred As Variant, _ |
|
ByRef fun As Variant, _ |
|
Optional ByVal n As Long = -1) As Variant |
|
戻る |
|
|
述語による条件が満たされる間繰り返し関数適用の履歴を生成 |
|
Function generate_while(ByVal val As Variant, _ |
|
ByRef pred As Variant, _ |
|
ByRef fun As Variant, _ |
|
Optional ByVal n As Long = -1) As Variant |
|
|
述語による条件が満たされない間繰り返し関数適用の履歴を生成 |
|
Function generate_while_not(ByVal val As Variant, _ |
|
ByRef pred As Variant, _ |
|
ByRef fun As Variant, _ |
|
Optional ByVal n As Long = -1) As Variant |
|
|
1次元配列限定の foldl (関数オブジェクトのみ) |
|
Public Function p_foldl( |
|
|
1次元配列限定の foldr (関数オブジェクトのみ) |
戻る |
Public Function p_foldr( |
|
|
1次元配列限定の foldl1 (関数オブジェクトのみ) |
|
Public Function p_foldl1( |
|
|
1次元配列限定の foldr1 (関数オブジェクトのみ) |
|
Public Function p_foldr1( |
|
|
1次元配列限定の scanl (関数オブジェクトのみ) |
|
Public Function p_scanl( |
|
戻る |
1次元配列限定の scanr (関数オブジェクトのみ) |
|
Public Function p_scanr( |
|
|
1次元配列限定の scanl1 (関数オブジェクトのみ) |
|
Public Function p_scanl1( |
|
|
1次元配列限定の scanr1 (関数オブジェクトのみ) |
|
Public Function p_scanr1( |
|
|
zipWithをfoldlする |
|
Function foldl_zipWith(ByRef fun As Variant, ByRef init As Variant, ByRef vec As
Variant) As Variant |
|
|
zipWithをfoldrする |
|
Function foldr_zipWith(ByRef fun As Variant, ByRef init As Variant, ByRef vec As
Variant) As Variant |
戻る |
|
|
zipWithをfoldl1する |
|
Function foldl1_zipWith(ByRef fun As Variant, ByRef vec As Variant) As Variant |
|
|
zipWithをfoldr1する |
|
Function foldr1_zipWith(ByRef fun As Variant, ByRef vec As Variant) As Variant |
|
|
zipWithをscanlする |
|
Function scanl_zipWith(ByRef fun As Variant, ByRef init As Variant, ByRef vec As
Variant) As Variant |
|
|
zipWithをscanrする |
|
Function scanr_zipWith(ByRef fun As Variant, ByRef init As Variant, ByRef vec As
Variant) As Variant |
|
|
zipWithをscanl1する |
戻る |
Function scanl1_zipWith(ByRef fun As Variant, ByRef vec As Variant) As Variant |
|
|
zipWithをscanr1する |
|
Function scanr1_zipWith(ByRef fun As Variant, ByRef vec As Variant) As Variant |
|
|