文字列操作比較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