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}!