ですが、これはいかにも Lisper が例として挙げそうな Smalltalk コード(そもそも関数で表現せよってところがひっかかります(^_^;))。後のほうに OO 批判もずいぶんとありますが、そもそも副作用を嫌う関数プログラミングは副作用を利用する OO とは油と水。Smalltalk ならアキュムレータはオブジェクトで表現するほうが自然でしょう。したがってコードは、foo: n |s| s := n. ^[:i| s := s+i]
で、最短かなと(笑)。--sumimaccumulate: aNumber ^ register := register + aNumber
あれれ、列挙されている言語でいちばん長くなっちゃいました(爆笑)。--sumim'From Squeak3.5'! Object subclass: #Accumulator instanceVariableNames: 'register ' classVariableNames: '' poolDictionaries: '' category: 'Tools-Toys'! !Accumulator methodsFor: 'accumulation'! accumulate: aNumber ^ register := register + aNumber! ! !Accumulator methodsFor: 'accessing'! register ^ register! ! !Accumulator methodsFor: 'accessing'! register: aNumber register := aNumber! ! !Accumulator methodsFor: 'initialization'! initialize register := 0! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! Accumulator class instanceVariableNames: ''! !Accumulator class methodsFor: 'example'! example "Accumulator example" | accumulator | accumulator := Accumulator new register: 1. World findATranscript: nil. Transcript cr; show: 'I''m ', accumulator printString, '.'. Transcript cr; show: 'Current value of my register is ', accumulator register printString, '.'. #(3 4 8 23) do: [ :value | Transcript cr. Transcript show: 'When you accumulate ', value printString, ', '. Transcript show: 'my register shows ', (accumulator accumulate: value) printString, '.'] "I'm an Accumulator. Current value of my register is 1. When you accumulate 3, my register shows 4. When you accumulate 4, my register shows 8. When you accumulate 8, my register shows 16. When you accumulate 23, my register shows 39."! ! !Accumulator class methodsFor: 'instance creation'! new ^ super new initialize! !
でやっぱり最短の部類?(^_^;)--sumimAccumulator new register: n; accumulate: i
このページを編集 (2593 bytes)
以下の 1 ページから参照されています。 |
This page has been visited 3460 times.