id:sumim:20070618:p1 ããã®ç¶ãã
ããªããããããæ©æ§ã¯ãªãã®ããã«å¿ è¦ãªã®ããªâ¦ã¨çåã ã£ãã®ã§ãç¶æ é·ç§»ãªã©èª¿ã¹ã¦ãã¦è¬ãè§£ãã¾ãããå è¨äºã® OCaml ã®ä¾ã§ã¯ãSenders 㨠Receivers ãåæã«å¿ è¦ã¨ãªãç¶æ³ããªãã®ãå©ç¨ãã¦ã空ã¨ãªã£ããããããä½¿ãæ¨ã¦ãã¦ããã®ã§ããï¼ãã£ã¨ãç´°ãããã¨ãè¨ãã°ãä½¿ãæ¨ã¦ã¨ããã°è¦ç´ ã®å¢æ¸æã«ãã§ã«ä½¿ãæ¨ã¦ã¦ãããã§ãããã¾ããããã¯ããã¾ã§ç§ã®ã¡ã³ã¿ã«ã¢ãã«ã¨ãã¦ï¼ãããã§ã... Senders [v, v, v]ãSenders [v, v]ãSenders [v] 㨠Receivers [f] ãReceivers [f, f]ãReceivers [f, f, f] ...ã®éãè¡ãæ¥ããã®ã«ããªãããããããå¿ è¦ã ã£ããã¨ãããã¨ãåãã£ãã¨ããã§ãããå¿ å®ã«ãã®åããåç¾ãã¦éãã§ã¿ããã¨ã«ãã¾ããã
å 輪ãã¿çã«ã¯ã¯ãã¯è¨ãã¨ããã®ãåã«ããæ½è±¡åãææ³ãã¨ããã¦ããã®ã§ãSenders ã Receivers ã¯åãªãé åºä»ãã³ã¬ã¯ã·ã§ã³ã§ã¯ã ãã§ããããã¹ãåæ å ±ãæããã¦ããå¿ è¦ãããã¾ããã¾ãããã£ã³ãã«ãï¼åæ å ±ããå¿ è¦ããã¾ãããï¼åç §ã¨ãã¦ã®æ¯ãèãããããããã«ããªãããã®å·¥å¤«ãå¿ è¦ã§ããæ®éãªãããã§ã¯ã©ã¹ã®åºçªã¨ãªãããã§ãããããã¦ãããããªãã¨ããã°ãé¢é£ä»ããªãã¸ã§ã¯ãï¼an Associationï¼ã使ã£ã¦ã¿ã¦ã¯ã©ããã¨æãã¤ãã¾ããã
é¢é£ä»ããªãã¸ã§ã¯ãã¯ããã¼ãã¨ãå¤ãã key -> value ã¨è¨è¿°ï¼ãªãã©ã«å¼ã£ã½ãã§ããããã£ãã¨ããã¡ãã»ã¼ã¸å¼ã§ãâ¦ï¼ãããã¨ã§çæã§ãããªãã¸ã§ã¯ãã§ãäºã¤ã®å¤ãé¢é£ä»ããã¦æ±ãã®ã«ä¾¿å©ãªãã®ã§ããSmalltalk ã§ã¯è¾æ¸ï¼a Dictionaryãä»ã®è¨èªã§ã¯ä¸è¬çã«ããã·ã¥ï¼ã®è¦ç´ ã¨ãã¦å©ç¨ããã¦ãã¾ãã
éä¿¡ç¨ã®ãã¥ã¼ããã³åç §ãå®ç¾ããããã«ããã®é¢é£ä»ããªãã¸ã§ã¯ãã®ããã¼ãã«ã·ã³ãã«ã§æ¨¡ããåæ å ±ãããå¤ãã«ãã¥ã¼ä»£ããã®é åºä»ãã³ã¬ã¯ã·ã§ã³ãå²ãæ¯ã£ã¦ã¿ã¦ã¯ã©ããã¨æã£ã¦ãã®ããã«æ¸ãã¦ã¿ã¾ããã
| newc send recv c repeat servc serv r fibc fib nn | newc := [#Senders -> OrderedCollection new]. send := [:ch :vals | ch key caseOf: { [#Senders] -> [ch value add: vals]. [#Receivers] -> [ch value ifEmpty: [ch key: #Senders value: (OrderedCollection with: vals)] ifNotEmpty: [ch value removeFirst valueWithArguments: vals]]}]. recv := [:ch :proc | ch key caseOf: { [#Receivers] -> [ch value add: proc]. [#Senders] -> [ch value ifEmpty: [ch key: #Receivers value: (OrderedCollection with: proc)] ifNotEmpty: [proc valueWithArguments: ch value removeFirst]]}]. World findATranscript: nil. Transcript clear. "æ´æ°ãåä¿¡ãã¦ç»é¢ã«è¡¨ç¤º" c := newc value. send value: c value: {3}. recv value: c value: [:x | Transcript cr; show: x]. "ä½åã§ã c ããæ´æ°ãåä¿¡ãã¦ç»é¢ã«è¡¨ç¤º" repeat := [recv value: c value: [:x | Transcript cr; show: x. repeat value]]. repeat value. (1 to: 3) do: [:i | send value: c value: {i}]. "颿°ãµã¼ãã¼" servc := newc value.. serv := [ recv value: servc value: [:i :recp | send copy value: recp value: {i * i}. serv value]]. serv value. r := newc value. send copy value: servc value: {123. r}. recv value: r value: [:j | Transcript cr; show: j]. send copy value: servc value: {45. r}. recv value: r value: [:j | Transcript cr; show: j]. "ãã£ããããæ°å" fibc := newc value. fib := [ recv value: fibc value: [:n :repc | fib fixTemps value. n <= 1 ifTrue: [ send value: repc value: {n}] ifFalse: [ | repc1 repc2 | repc1 := newc value. repc2 := newc value. send copy value: fibc value: {n - 1. repc1}. send copy value: fibc value: {n - 2. repc2}. recv copy value: repc1 value: [:rep1 | recv copy value: repc2 value: [:rep2 | send copy value: repc value: {rep1 + rep2}]]]]]. fib fixTemps value. nn := 10. r := newc value. send copy value: fibc value: {nn. r}. recv copy value: r value: [:m | Transcript cr; show: ('fib({1}) = {2}' format: {nn. m})]. "=> fib(10) = 55 "
ãããã¿éããæ©è½ãã¦ãããããã§ãã
ä¾ã®ãã¨ã Ruby ã§ããRuby ã«ã¯ Smalltalk ã® an Association ã«å½ãããªãã¸ã§ã¯ãã¯ããã¾ãããããªãã¡ãã£ã¦çã Association ã¨ãã¦å®ç¾©ã#-> ã¯ã¡ã½ããåã¨ãã¦ä½¿ããªãã®ã§ Symbol#>= ãå®ç¾©ãã¦ããã代ããã«ç¨ãã¾ãã
class Association; attr_accessor :key, :val; def initialize(k,v); @key=k; @val=v end end class Symbol; def >=(other); Association.new(self,other) end end newc = proc{ :Senders >= Array.new } send = proc do |ch,*vals| case ch.key when :Senders ch.val << vals when :Receivers if ch.val.empty? ch.key = :Senders; ch.val = [vals] else ch.val.shift.call(*vals) end end end recv = proc do |ch,proc| case ch.key when :Receivers ch.val << proc when :Senders if ch.val.empty? ch.key = :Receivers; ch.val = [proc] else proc.call(*ch.val.shift) end end end #æ´æ°ãåä¿¡ãã¦ç»é¢ã«è¡¨ç¤º" c = newc.call send.call(c, 3) recv.call(c, proc{ |x| p x }) #ä½åã§ã c ããæ´æ°ãåä¿¡ãã¦ç»é¢ã«è¡¨ç¤º" rep = proc{ recv.call(c, proc{ |x| p x; rep.call }) } rep.call (1..3).each{ |i| send.call(c, i) } #颿°ãµã¼ãã¼ servc = newc.call serv = proc do recv.call(servc, proc{ |i,recp| send.call(recp, i * i); serv.call }) end serv.call r = newc.call send.call(servc, 123, r) recv.call(r, proc{ |j| p j }) send.call(servc, 45, r) recv.call(r, proc{ |j| p j }) #ãã£ããããæ°å fibc = newc.call fib = proc do recv.call(fibc, proc do |n,repc| fib.call if n <= 1 send.call(repc, n) else repc1 = newc.call repc2 = newc.call send.call(fibc, n - 1, repc1) send.call(fibc, n - 2, repc2) recv.call(repc1, proc do |rep1| recv.call(repc2, proc do |rep2| send.call(repc, rep1 + rep2) end) end) end end) end fib.call nn = 10 r = newc.call send.call(fibc, nn, r) recv.call(r, proc{ |m| p "fib(#{nn}) = #{m}" })
id:sumim:20070619:p1 ã«ç¶ãã