ã³ã¡ã³ãæ¬ãããããªãã©ãæ¸ãï¼ ãããããªè¨èªã§ FizzBuzz ããç¶æ
â¦ã«ãªã£ã¦ãã Raganwald: Don't Overthink FizzBuzz ãããå½è©²ã¨ã³ããªã¼ä¸ã«æç¤ºããã¦ãã Ruby ã§æ¸ãããã¡ãã£ã¨å¤ãã£ãå®è£
ã®åããããåãããªãã£ãã®ã§ãä¾ã«ãã£ã¦ Squeak Smalltalk ã§ç´è¨³æ°å³ã«å¤æãã¦ããåãã調ã¹ã¦ã¿ããã¨ã«ã
â¦ã¨ããã®åã«ããªã³ã¯å ã«ãã Ruby çã®ããã«ããã種ãé£èªåãæ½ãããã®ãèãããèªã¿è§£ãããããã®ããããªãã«æãããã¨ã ããã©ãããã£ã±ã Smalltalk ã®ç骨é ã¯ã³ã¼ãã®èªã¿ä¸ããããï¼èª°ã§ãï¼ï¼ãããã§é¦ããããã¦ããã®ã¯ï¼ãã ããã¼ï¼ï½ï¼ããªã®ã§ãã¾ãã¯èªãã§å 容ãããåãããªã¼ã½ããã¯ã¹ãªãã®ããã
ããããããã«ï¼ãããã¯ã³ã¼ãã´ã«ãçã«â¦ï¼åºåã¾ã§ã䏿°ã«ã¾ã¨ãã¦æ¸ãã¦ãã¾ã£ã¦ãããã®ã§ãããã¡ãã»ã¼ã¸ã³ã°å½ã® Smalltalk ãããã¨ãããããªãã®ãæèãã¦ãä»»æã®æ´æ°ã«å¯¾ãã¦å¿ è¦ãªã 'Fizz'ã'Buzz'ã'FizzBuzz' ã®ãããããããã§ãªããªãèªèº«ã printString ãã¦çãããããInteger ã« #asFizzBuzzString ã¨ãã¦å®ç¾©ãã¦ã¿ã¾ãã
Integer >> asFizzBuzzString "converting" | stream | stream := String new writeStream. (self isDivisibleBy: 3) ifTrue: ['Fizz' putOn: stream]. (self isDivisibleBy: 5) ifTrue: ['Buzz' putOn: stream]. stream isEmpty ifTrue: [self printString putOn: stream]. ^ stream contents
3 asFizzBuzzString "=> 'Fizz' "
ãã¼ããç¾ããï¼ï¼âèªå·±æºè¶³ï¼
ãã 念ã®ãããã±ã³ãã»ããã¯çã«ã¯ããããã®ã¯ï¼®ï¼§ã§ãããã®çç±ãªã©è©³ãã㯠SBPP ã®ãConverter Methodãã®é ãã覧ãã ããã
ã¹ããªã¼ã ã¯ã¡ãã£ã¨ä½¿ãæ¹ãããåãããªãâ¦ã¨ããåå¦è ãªããã«ããæ¬¡ã®ããã«æ¸ããªããã°ããã£ã¦ãããã¨ã¯ãåããããã ãããã¨ã
Integer >> asFizzBuzzString "converting" | result | result := String new. (self isDivisibleBy: 3) ifTrue: [result := result, 'Fizz']. (self isDivisibleBy: 5) ifTrue: [result := result, 'Buzz']. ^ result isEmpty ifTrue: [self printString] ifFalse: [result]
ãã¨ã¯ãããã鿬¡æ°å¤ã«èµ·åãã㦠#collect: ããã®ãããã
(1 to: 15) collect: [:each | each asFizzBuzzString]
=> #('1' '2' 'Fizz' '4' 'Buzz' 'Fizz' '7' '8' 'Fizz' 'Buzz' '11' 'Fizz' '13' '14' 'FizzBuzz')
ã«ã¼ãã§åãã¦ãé©å®ãã©ã³ã¹ã¯ãªããã«åºåããã®ãããã
World findATranscript: nil. (1 to: 100) do: [:n | Transcript cr; show: n asFizzBuzzString]
ãã¦ãæ¬é¡ãå ã®ã¸ãã¦ã㪠Ruby çããSqueak Smalltalk ã§æ¸ãä¸ãã¨ãããªæããï¼æ¹è¡ä½ç½®ãã¡ãã£ã¨ã ãæèãã¦ãã³ãã³ã«ãã¦ããã¾ãâ¦(^_^;)ï¼
| compose carbonation | compose := nil. compose := [:lambdas | lambdas isEmpty ifTrue: [ [nil] ] ifFalse: [lambdas size = 1 ifTrue: [ lambdas first ] ifFalse: [ [:n| lambdas first value: ( (compose copy fixTemps value: lambdas allButFirst) value: n)] ]] ]. carbonation := [:modulus :printableForm | | i | i := 0. [:n | (i := i+1) \\ modulus = 0 ifTrue: [printableForm] ifFalse: [n]] copy fixTemps ]. World findATranscript: nil. ((1 to: 100) collect: ( compose value: { carbonation value: 15 value: 'FizzBuzz'. carbonation value: 5 value: 'Buzz'. carbonation value: 3 value: 'Fizz'})) do: [:each | Transcript cr; show: each]
LISP ã Ruby ã¨éã£ã¦ãã¯ãã¼ã¸ã£ï¼ãã ããSqueak Smalltalk ã®ããã¯âãã©ãâãå¾è¿°ï¼ãä½ãã®ã«ãã¡ãã¡ lambdaï¼ããã㯠procãProc.new â¦ï¼ã¨æ¸ãå¿
è¦ããªããã¨ãããã¦ããããã¯ããªãã¸ã§ã¯ãã§ã¯ãªã Rubyï¼å¼æ°ã®åãæ¸¡ãã®éã«â&âã使ã£ã¦ã¯ãã¼ã¸ã£ã¨ãããã¯ã¨ã®å¤æãæç¤ºçã«ããå¿
è¦ãããâ¦ï¼ã¨éã£ã¦ãcompose ã®è¿ãå¤ããã®ã¾ã¾ #collect:ï¼Ruby çã§ã¯ #map ã使ç¨â¦ï¼ã®å¼æ°ã«ã§ããã¨ããã Smalltalk ã§ã®ç¹è²ã§ãã
䏿¹ã§ãRuby ãä»ã®ä¸è¬ç㪠Smalltalk å¦çç³»ã¨ã¯ç°ãªããå¤å
¸ç㪠Smalltalk-80 ã®åæ®ããæªã ã«æ®ãã¦ãã Squeak Smalltalk ã§ã¯ããããã¯ãâã¯ãã¼ãºâãã¦ããªãï¼ã¡ããã¨ããã¯ãã¼ã¸ã£ã§ã¯ãªãï¼ã®ã§ãåå
¥ã®éã«ã¯ copy fixTemps ãã¦ãã¾ããå¿
è¦ãããã¾ãã
| fact | fact := nil. fact := [:n | n < 2 ifTrue: [1] ifFalse: [n * (fact value: n-1)]]. ^ fact value: 10 "=> Error: Attempt to evaluate a block that is already being evaluated."
| fact | fact := nil. fact := [:n | n < 2 ifTrue: [1] ifFalse: [n * (fact copy fixTemps value: n-1)]]. ^ fact copy fixTemps value: 10 "=> 3628800 "
ããè¦ã¦ã¿ãã¨ãcompose ã§ãã£ã¦ãããã¨ã¯ãä¸ãããããããã¯ç¾¤ã«ã¤ãã¦ã#inject:into: ã¿ãããªä½æ¥ãéã㦠#collect: ç¨ã®ãããã¯ãèªåçæãã¦ããã ãã®ããã§ãããªãã°ã¨ãç´ ç´ã«ããæ¸ãç´ãã¦ã¿ãã®ã次ã®ã¹ã¯ãªããããªããã«ã¦ã³ã¿ã§ãã i ã¨ä¸ãããã n ã¨ãï¼å ´åã«ãã£ã¦ã¯â¦ï¼ä¸è´ãã¦ãããã®æ®ä½ããã¡ãã¡ç®åºããã®ã¯ä½ã ãè² ããæ°ãããã®ã§ããµã¤ã¯ãªãã¯ãªã«ã¦ã³ã¿ã«ããã¦ã¿ã¾ããã
| lambdas collectBlock | lambdas := #( 3 'Fizz' 5 'Buzz' 15 'FizzBuzz') pairsCollect: [:modulus :printableForm | | i | i := 0. [:n | (i := i+1) = modulus ifTrue: [i := 0. printableForm] ifFalse: [n]] copy fixTemps]. collectBlock := lambdas inject: [:n | n] into: [:result :each | [:n | each value: (result value: n)] copy fixTemps]. World findATranscript: nil. ((1 to: 100) collect: collectBlock) do: [:each | Transcript cr; show: each]
Ruby ã«æ»ãã¨ããããªæãã
lambdas = [3, 5, 15].zip(["Fizz", "Buzz", "FizzBuzz"]).collect do |m,f| i = 0 proc { |n| if (i += 1) == m then i = 0; f else n end } end collectBlock = lambdas.inject(proc { |n| n }) do |r,e| proc { |n| e.call(r.call(n)) } end puts (1..100).collect(&collectBlock)