Smalltalkでmapcar
Lispのmapcarの真似事。ただ、Lispのmapcarはリストを複数個取ることが出来るんだよね。
!Vector defineMethod: input! mapcar: fn |result| result := Vector new. self do:[:el|result add: (fn value: el)]. ^result. ! ! {1.2.3} mapcar: [:el|el+3].! {4.5.6}
複数配列取れる版。なんか美しくないな。特に1配列の時に2重にしなきゃいけない辺りが。
!Vector defineMethod: input! mapcar: fn |result| result := Vector new. self doSlice:[:elList|result add: (fn valueWithArgumentList: elList)]. ^result. ! doSlice: block |i v| i := 0. [ v := Vector new. self do:[:each| (i < each size) ifTrue:[v add: (each at: i)]]. v size = 0 ] whileFalse:[ block value: v. i:=i+1 ]. ! ! {{1.2.3}.{3.4.5}} mapcar: [:l1:l2|l1+l2].! {4.6.8} {{1.2.3}} mapcar: [:el|el+3].! {4.5.6}
可変長引数をサポートしてこう書けるようにすれば良いのか?
[:a:b|a+b] mapcar:{1.2.3}:{2.3.4}!