vieweditattachhistoryswikistopchangessearchhelp

技術野郎の復讐---Revenge of the Nerds---

http://www.shiro.dreamhost.com/scheme/trans/icad-j.html --sumim



ここでの Smalltalk の例は、
foo: n
   |s|
   s := n.
   ^[:i| s := s+i]
ですが、これはいかにも Lisper が例として挙げそうな Smalltalk コード(そもそも関数で表現せよってところがひっかかります(^_^;))。後のほうに OO 批判もずいぶんとありますが、そもそも副作用を嫌う関数プログラミングは副作用を利用する OO とは油と水。Smalltalk ならアキュムレータはオブジェクトで表現するほうが自然でしょう。したがってコードは、
accumulate: aNumber
   ^ register := register + aNumber
で、最短かなと(笑)。--sumim

お題は“数nを取り、「数iを取ってnをiだけ増加させ、その増加した値を返す関数」を返すような関数”だからこれだと駄目ですね。こうしないと(^_^;)…
'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! !
あれれ、列挙されている言語でいちばん長くなっちゃいました(爆笑)。--sumim

でも“数nを取り、「数iを取ってnをiだけ増加させ、その増加した値を返すオブジェクト」を返すようなメッセージ式”だから、
Accumulator new register: n; accumulate: i
でやっぱり最短の部類?(^_^;)--sumim

このページを編集 (2593 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 3453 times.