LoginSignup
1
1

More than 5 years have passed since last update.

HSPでmap, reduce, filterを定義する

Last updated at Posted at 2016-12-02

文字列操作比較16言語を書いていた時、HSPはmapとかreduceとかfilterみたいな今時のリスト処理が全然入って無くてさびしかったのでざっと定義してみた。

HSP
#runtime "hsp3cl"

#define global map(%1,%2,%3,%4) \
    dimtype %2,vartype(%1),length(%1) :\
    foreach %1 :\
        %3=%1(cnt) :\
        %2(cnt)=%4 :\
    loop

#define global reduce(%1,%2,%3,%4) \
    %2=%1(0) :\
    repeat length(%1)-1,1 :\
        %3=%1(cnt) :\
        %2=%4 :\
    loop

#define global filter(%1,%2,%3,%4) %tfilter\
    %i=0 :\
    foreach %1 :\
        %3=%1(cnt) :\
        if %4 {\
            %2(%p0)=%3 :\
            %o++ \
        }:\
    loop


arr1=1,2,3,4,5

mes "!map"
dim arr2,length(arr1)
map arr1,arr2,val,val*10
foreach arr2
    mes arr2(cnt)
loop

mes "\n!reduce"
reduce arr1,sum,val,sum+val
mes sum

mes "\n!filter"
filter arr1,arr3,val,val\2!=0
foreach arr3
    mes arr3(cnt)
loop
Echo
!map
10
20
30
40
50

!reduce
15

!filter
1
3
5

仕組みとしてはいたって簡単で、defineの何でも定義に投げ込める仕様を利用してラムダ部分に当たる式を第4引数で指定する。

ちなみにfilterはdefineでやたら長くなるのを嫌って結構実装が適当。
filterで返る配列はsplitで生成されるのでstr型の配列となる。

  • 2018/9/12: 色々整形。filterも真面目に作り直した。

構文

map array anyArray,ref array result,var param,lambda
    anyArray        ;変換元の配列
    result          ;返り値
    param           ;lambdaに渡す引数名
    lambda          ;返り値を返す式

reduce array anyArray,ref var param1AndResult,var param2,lambda
    param1AndResult ;lambdaに渡す引数及び返り値
    param2          ;lambdaに渡す引数2

filter array anyArray,ref array result,var param,booleanLambda
    booleanLambda   ;真理値を返す条件式

実行環境

HSP : Hot Soup Processor ver3.5

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1