home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 230_01 / tests.bun < prev   
Text File  |  1987-05-27  |  46KB  |  2,092 lines

  1. : To unbundle, sh this file
  2. echo unbundling Makefile 1>&2
  3. cat >Makefile <<'End'
  4. .SUFFIXES : .st .test
  5.  
  6. BINDIR = ../bin
  7.  
  8. FILES = Makefile in *.st *.out
  9.  
  10. .st.test:
  11.     $(BINDIR)/st -m $*.st <in | diff - $*.out
  12.  
  13. install:
  14.     echo Performing Self Checking Tests
  15.     -make basic.test
  16.     -make blocks.test
  17.     -make fork.test
  18.     -make new.test
  19.     -make super.test
  20.     -make copy.test
  21.     -make num.test
  22.     -make file.test
  23.     -make primes.test
  24.     -make collect.test
  25.     -make 4queen.test
  26.     echo The following produce cycles, thus have nonzero differences
  27.     -make phil.test
  28.     echo Differences in random numbers may change results in following
  29.     -make sim1.test
  30.     -make sim2.test
  31.     echo Finished Self Checking Tests
  32.     
  33. bundle:
  34.     bundle $(FILES) >../tests.bundle
  35.  
  36. # if the CURSES routines are available, and the form library has been
  37. # built in the /prelude subdirectory (see Makefile there), the following
  38. # executes the plane example
  39. plane:
  40.     $(BINDIR)/st -m -g form plane.st <in
  41.  
  42. # if the PLOT(3) routines are available, and the pen library has been
  43. # built in the /prelude subdirectory (see Makefile there), the following
  44. # executes the pens exame
  45. pen:
  46.     $(BINDIR)/st -m -g pen penshow.st <in
  47. End
  48. echo unbundling in 1>&2
  49. cat >in <<'End'
  50. Main new main
  51. End
  52. echo unbundling 4queen.st 1>&2
  53. cat >4queen.st <<'End'
  54. Class Queen
  55. | myrow mycolumn neighbor boardsize |
  56. [
  57.         build: aQueen col: aNumber size: brdmax
  58.  
  59.                 neighbor <- aQueen.
  60.                 mycolumn <- aNumber.
  61.                 myrow <- 1.
  62.                 boardsize <- brdmax.
  63.                 neighbor first.
  64.                 ^ self
  65.  
  66. |       checkCol: colNumber row: rowNumber      | cd |
  67.                 (rowNumber = myrow) ifTrue: [ ^ false ].
  68.                 cd <- colNumber - mycolumn.
  69.                 ((myrow + cd) = rowNumber) ifTrue: [ ^ false ].
  70.                 ((myrow - cd) = rowNumber) ifTrue: [ ^ false ].
  71.                 (neighbor isNil) ifFalse:
  72.                         [ ^ neighbor checkCol: colNumber row: rowNumber ].
  73.                 ^ true
  74.  
  75. |       first
  76.                 myrow <- 1.
  77.                 ^ self checkrow
  78.  
  79. |       next
  80.                 myrow <- myrow + 1.
  81.                 ^ self checkrow
  82.  
  83. |       checkrow
  84.                 (neighbor isNil) ifTrue: [^ myrow].
  85.                 [myrow <= boardsize] whileTrue:
  86.                         [(neighbor checkCol: mycolumn row: myrow)
  87.                                 ifTrue: [^ myrow]
  88.                                 ifFalse: [myrow <- myrow + 1] ].
  89.                 ((neighbor next) isNil) ifTrue: [^ nil].
  90.                 ^ self first
  91.  
  92. |       printboard
  93.                 (neighbor isNil) ifFalse: [ neighbor printboard].
  94.                 ('Col ', mycolumn asString , ' Row ' ,
  95.                     myrow asString) print
  96. ]
  97.  
  98. Class Main
  99. | lastq |
  100. [
  101.         main | size |
  102.  
  103.                 size <- 4.
  104.                 lastq <- nil.
  105.                 (1 to: size) do: [:x |
  106.                          lastq <- Queen new build: lastq col: x size: size ].
  107.                 lastq first.
  108.                 lastq printboard
  109. ]
  110. End
  111. echo unbundling 8queen.st 1>&2
  112. cat >8queen.st <<'End'
  113. Class Queen
  114. | myrow mycolumn neighbor boardsize |
  115. [
  116.         build: aQueen col: aNumber size: brdmax
  117.  
  118.                 neighbor <- aQueen.
  119.                 mycolumn <- aNumber.
  120.                 myrow <- 1.
  121.                 boardsize <- brdmax.
  122.                 neighbor first.
  123.                 ^ self
  124.  
  125. |       checkCol: colNumber row: rowNumber      | cd |
  126.                 (rowNumber = myrow) ifTrue: [ ^ false ].
  127.                 cd <- colNumber - mycolumn.
  128.                 ((myrow + cd) = rowNumber) ifTrue: [ ^ false ].
  129.                 ((myrow - cd) = rowNumber) ifTrue: [ ^ false ].
  130.                 (neighbor isNil) ifFalse:
  131.                         [ ^ neighbor checkCol: colNumber row: rowNumber ].
  132.                 ^ true
  133.  
  134. |       first
  135.                 myrow <- 1.
  136.                 ^ self checkrow
  137.  
  138. |       next
  139.                 myrow <- myrow + 1.
  140.                 ^ self checkrow
  141.  
  142. |       checkrow
  143.                 (neighbor isNil) ifTrue: [^ myrow].
  144.                 [myrow <= boardsize] whileTrue:
  145.                         [(neighbor checkCol: mycolumn row: myrow)
  146.                                 ifTrue: [^ myrow]
  147.                                 ifFalse: [myrow <- myrow + 1] ].
  148.                 ((neighbor next) isNil) ifTrue: [^ nil].
  149.                 ^ self first
  150.  
  151. |       printboard
  152.                 (neighbor isNil) ifFalse: [ neighbor printboard].
  153.                 ('Col ', mycolumn asString , ' Row ' ,
  154.                     myrow asString) print
  155. ]
  156.  
  157. Class Main
  158. | lastq |
  159. [
  160.         main | size |
  161.  
  162.                 size <- 8.
  163.                 lastq <- nil.
  164.                 (1 to: size) do: [:x |
  165.                          lastq <- Queen new build: lastq col: x size: size ].
  166.                 lastq first.
  167.                 lastq printboard
  168. ]
  169. End
  170. echo unbundling basic.st 1>&2
  171. cat >basic.st <<'End'
  172. Class Main
  173. [
  174.     main
  175.         88 print.
  176.         3.14159 print.
  177.         'this is it' print.
  178.         #(this is also it) print.
  179.         88 respondsTo: #+ ; print.
  180.         Object respondsTo.
  181.         smalltalk at: 3 put: #(22 17).
  182.         (smalltalk at: 3) print.
  183.         Smalltalk respondsTo.
  184. ]
  185. End
  186. echo unbundling blocks.st 1>&2
  187. cat >blocks.st <<'End'
  188. Class Main
  189. [
  190.     main
  191.         (2 < 3) ifTrue: ['correct-1' print].
  192.         ((2 < 3) ifTrue: ['correct-2']) print.
  193.         [:x | x print] value: 'correct-3' .
  194.         ((2 < 3) or: [3 < 4]) ifTrue: ['correct-4' print].
  195.         ((2 > 3) or: [3 < 4]) ifTrue: ['correct-5' print].
  196.         ((2 < 3) and: [3 < 4]) ifTrue: ['correct-6' print].
  197.         ((2 > 3) and: [3 < 4]) ifFalse: ['correct-7' print].
  198.         self test1 print
  199. |
  200.     test1
  201.         self test2: [^ 'correct-8'].
  202.         'should not print' print
  203. |
  204.     test2: aBlock
  205.         self test3: aBlock.
  206.         'should not print' print
  207. |
  208.     test3: bBlock
  209.         bBlock value.
  210.         'should not print' print
  211. ]
  212. End
  213. echo unbundling check.st 1>&2
  214. cat >check.st <<'End'
  215. Class CheckBook
  216. | balance |
  217. [
  218.     new
  219.         balance <- 0
  220. |
  221.     + amount
  222.         balance <- balance + amount.
  223.         ^ balance
  224. |
  225.     - amount
  226.         balance <- balance - amount.
  227.         ^ balance
  228. ]
  229.  
  230. End
  231. echo unbundling collect.st 1>&2
  232. cat >collect.st <<'End'
  233. Class Main
  234. | i |
  235. [
  236.     main
  237.         self test1.
  238.         self test2.
  239.         self test3
  240. |
  241.     test1        | j |
  242.         (i <- 'example') print.
  243.         i size print.
  244.         i asArray print.
  245.         (i occurrencesOf: $e) print.
  246.         i asBag print.
  247.         (j <- i asSet) print.
  248.         j asString reversed print.
  249.         i asDictionary print.
  250.         (j <- i asList) print.
  251.         j addFirst: 2 / 3.
  252.         j addAllLast: (12.5 to: 15 by: 0.75).
  253.         j print.
  254.         j removeLast print.
  255.         (j , #($a 7) ) print.
  256.         (i reject: [:x | x isVowel] ) print.
  257.         (i copyWithout: $e) print.
  258.         i sort print.
  259.         (i sort: [:x :y | y < x]) print.
  260.         i keys print.
  261.         i values print.
  262.         (i atAll: (1 to: 7 by: 2) put: $x) print
  263. |
  264.     test2            | j |
  265.         i <- (1 to: 6) asBag print.
  266.         i size print.
  267.         (i select: [:x | (x \\ 2) strictlyPositive] ) print.
  268.         (j <- (i collect: [:x | x \\ 3]) asSet ) print.
  269.         j size print
  270. |
  271.     test3
  272.         ('bead' at: 1 put: $r) print
  273. ]
  274. End
  275. echo unbundling cond.st 1>&2
  276. cat >cond.st <<'End'
  277. Class Main
  278. [
  279.     main            | i |
  280.         ((2 < 3) ifTrue: ['correct']) print.
  281.         (2 < 3) ifTrue: ['correct' print ].
  282.         i <- 1.
  283.         [i < 3] whileTrue: [i <- i + 1].
  284.         (i >= 3) ifTrue: ['correct' print]
  285. ]
  286.  
  287. End
  288. echo unbundling control.st 1>&2
  289. cat >control.st <<'End'
  290. "
  291.      control the values produced by a generator
  292. "
  293. Class ControlGenerator :Generator
  294. | firstGenerator secondGenerator
  295.   currentFirst currentSecond
  296.   controlBlock computeBlock |
  297. [
  298.         initA: fGen b: sGen control: aBlock compute: anotherBlock
  299.                 firstGenerator <- fGen.
  300.                 secondGenerator <- sGen.
  301.                 controlBlock <- aBlock.
  302.                 computeBlock <- anotherBlock
  303.  
  304. |       first
  305.                 currentFirst <- firstGenerator first.
  306.                 currentSecond <- secondGenerator first.
  307.                 (currentFirst isNil & currentSecond isNil) ifTrue: [^ nil].
  308.                 ^ self controlGeneratorNext
  309.  
  310. |       next
  311.                 ^ self controlGeneratorNext
  312.  
  313. |       controlGeneratorNext    | control returnedValue |
  314.                 control <- 0.
  315.                 [ control anyMask: 12] whileFalse: [
  316.                   control <- controlBlock value: currentFirst
  317.                                           value: currentSecond.
  318.                    (control allMask: 64) ifTrue: [^nil].
  319.                    (control allMask: 32) ifTrue:
  320.                                 [currentFirst <- firstGenerator first].
  321.                    (control allMask: 16) ifTrue:
  322.                                 [currentSecond <- secondGenerator first].
  323.                    (control allMask: 12)
  324.                       ifTrue:
  325.                           [returnedValue <- computeBlock
  326.                                value: currentFirst value: currentSecond]
  327.                       ifFalse: [
  328.                          (control allMask: 8) ifTrue:
  329.                            [returnedValue <- computeBlock value: currentFirst].
  330.                          (control allMask: 4) ifTrue:
  331.                            [returnedValue <- computeBlock value: currentSecond].
  332.                          ].
  333.                    (control allMask: 2) ifTrue:
  334.                            [currentFirst <- firstGenerator next].
  335.                    (control allMask: 1) ifTrue:
  336.                            [currentSecond <- secondGenerator next].
  337.                   ].
  338.                 ^ returnedValue
  339. ]
  340. End
  341. echo unbundling copy.st 1>&2
  342. cat >copy.st <<'End'
  343. Class Main
  344. | i j k l |
  345. [
  346.     main
  347.         i <- Test new.
  348.         i set: 17.
  349.         j <- Test new.
  350.         j set: i.
  351.         k <- j deepCopy.
  352.         l <- j shallowCopy.
  353.         i set: 12.
  354.         k print.
  355.         l print.
  356.         i <- Test new.
  357.         i set: 17.
  358.         j <- #(2).
  359.         j at: 1 put: i.
  360.         k <- j deepCopy.
  361.         l <- j shallowCopy.
  362.         i set: 12.
  363.         k print.
  364.         l print.
  365. ]
  366. Class Test
  367. | var |
  368. [
  369.     printString
  370.         ^ 'test value ', var printString
  371. |
  372.     set: aVal
  373.         var <- aVal
  374. ]
  375.  
  376. End
  377. echo unbundling fib.st 1>&2
  378. cat >fib.st <<'End'
  379. Class Fib :Generator
  380. | lastNumber  nextToLastNumber |
  381. [
  382.     first
  383.             nextToLastNumber <- 0.
  384.             ^ lastNumber <- 1
  385. |
  386.       next            | sum |
  387.             sum <- nextToLastNumber + lastNumber.
  388.             nextToLastNumber <- lastNumber.
  389.             ^ lastNumber <- sum
  390. ]
  391. End
  392. echo unbundling file.st 1>&2
  393. cat >file.st <<'End'
  394. Class Main
  395. [
  396.     main        | f g |
  397.         f <- File new ; open: 'file.st'.
  398.         g <- File new ; open: 'foo' for: 'w'.
  399.         f do: [:x | g write: x reversed].
  400.         g <- File new ; open: 'foo' for: 'r'.
  401.         g do: [:x | x print].
  402.         f modeCharacter.
  403.         f first print.
  404.         10 timesRepeat: [ f next print ].
  405.         (f at: 2) print.
  406.         f currentKey print.
  407.         f size print.
  408. ]
  409.  
  410. End
  411. echo unbundling fork.st 1>&2
  412. cat >fork.st <<'End'
  413. Class Main
  414. [
  415.     loop1
  416.         10 timesRepeat: [17 print]
  417. |
  418.     loop2
  419.         10 timesRepeat: [23 print]
  420. |
  421.     main
  422.         [self loop1] fork.
  423.         self loop2
  424. ]
  425.  
  426. End
  427. echo unbundling generator.st 1>&2
  428. cat >generator.st <<'End'
  429. Class Generator :Collection
  430. [
  431.     , aGenerator
  432.         ^ DyadicControlGenerator new;
  433.             firstGen: self
  434.             secondGen: aGenerator
  435.             control: [:x :y |
  436.                 (x isNil)
  437.                     ifTrue:
  438.                         [(y isNil)
  439.                             ifTrue:  [2r01000000]
  440.                             ifFalse: [2r00000101]
  441.                         ]
  442.                     ifFalse: [2r00001010] ]
  443.             compute: [:x | x ]
  444. |
  445.       collect: xformBlock
  446.             ^ MonadicControlGenerator new;
  447.                    initGen: self deepCopy
  448.                    control: [ :x |
  449.                 (x isNil)
  450.                     ifTrue:  [2r1000]
  451.                     ifFalse: [2r0101]
  452.                  ]
  453.                    init: []
  454.                    compute: [:x | xformBlock value: x]
  455. |
  456.     first: limit     | count |
  457.             count <- 0.
  458.         ^ MonadicControlGenerator new;
  459.                    initGen: self deepCopy
  460.                    control: [ :x |
  461.                              (x isNil)
  462.                               ifTrue:  [2r1000]
  463.                               ifFalse: [((count <- count + 1) > limit)
  464.                                              ifTrue:  [2r1000]
  465.                                              ifFalse: [2r0101]
  466.                                         ]
  467.                          ]
  468.                    init: [count <- 0]
  469.                    compute: [:x | x]
  470. |
  471.       select: condBlock
  472.             ^ MonadicControlGenerator new;
  473.                    initGen: self deepCopy
  474.                    control: [ :x |
  475.                          (x isNil)
  476.                               ifTrue:  [2r1000]
  477.                               ifFalse: [(condBlock value: x)
  478.                                              ifTrue:  [2r0101]
  479.                                              ifFalse: [2r0001]
  480.                                         ]
  481.                          ]
  482.                    init: []
  483.                    compute: [:x | x]
  484. |
  485.       until: condBlock
  486.             ^ MonadicControlGenerator new;
  487.                    initGen: self deepCopy
  488.                    control: [ :x |
  489.                          (x isNil)
  490.                               ifTrue:  [2r1000]
  491.                               ifFalse: [(condBlock value: x)
  492.                                              ifTrue:  [2r1000]
  493.                                              ifFalse: [2r0101]
  494.                                         ]
  495.                          ]
  496.                    init: []
  497.                    compute: [:x | x]
  498. |
  499.     with: aGenerator when: conditionBlock
  500.         ^ DyadicControlGenerator new ;
  501.             firstGen: self
  502.             secondGen: aGenerator
  503.             control: [:x :y |
  504.                 (x isNil)
  505.                     ifTrue: [(y isNil)
  506.                         ifTrue:  [2r01000000]
  507.                         ifFalse: [2r00000101] ]
  508.                     ifFalse: [(y isNil)
  509.                         ifTrue:  [2r00001010]
  510.                         ifFalse: [(conditionBlock
  511.                             value: x value: y)
  512.                             ifTrue:  [2r00001010]
  513.                             ifFalse: [2r00000101]
  514.                             ] ] ]
  515.             compute: [:x | x ]
  516. ]
  517.  
  518. Class MonadicControlGenerator :Generator
  519. | subGenerator  currentValue  controlBlock  initBlock  computeBlock |
  520. [
  521.       initGen: aGenerator
  522.     control: conBlk
  523.     init: iniBlk
  524.     compute: cmpBlk
  525.             subGenerator <- aGenerator.
  526.             controlBlock <- conBlk.
  527.             initBlock <- iniBlk.
  528.             computeBlock <- cmpBlk.
  529.             currentValue <- nil
  530. |
  531.       first
  532.             (currentValue <- subGenerator first) isNil
  533.                   ifTrue: [^ nil].
  534.             initBlock value.
  535.             ^ self next
  536. |
  537.       next     | control  returnedValue |
  538.             control <- 0.
  539.             [control anyMask: 2r0100] whileFalse:
  540.                   [
  541.                     control <- controlBlock value: currentValue.
  542.  
  543.                     (control anyMask: 2r1000) ifTrue:
  544.                           [^ nil].
  545.                     (control anyMask: 2r0100) ifTrue:
  546.                           [returnedValue <-
  547.                         computeBlock value: currentValue].
  548.                     (control anyMask: 2r0010) ifTrue:
  549.                           [currentValue <- subGenerator first].
  550.                     (control anyMask: 2r0001) ifTrue:
  551.                     [currentValue <- subGenerator next]
  552.               ].
  553.             ^ returnedValue
  554. ]
  555. Class DyadicControlGenerator :Generator
  556. | firstGenerator secondGenerator
  557.   currentFirst currentSecond
  558.   controlBlock computeBlock |
  559. [
  560.     firstGen: firstGen
  561.     secondGen: secondGen
  562.     control: contBlock
  563.     compute: compBlock
  564.  
  565.                 firstGenerator <- firstGen.
  566.                 secondGenerator <- secondGen.
  567.                 controlBlock <- contBlock.
  568.                 computeBlock <- compBlock
  569.  
  570. |       first
  571.                 currentFirst <- firstGenerator first.
  572.                 currentSecond <- secondGenerator first.
  573.                 (currentFirst isNil & currentSecond isNil) ifTrue: [^ nil].
  574.                 ^ self next
  575.  
  576. |       next        | control returnedValue |
  577.                 control <- 0.
  578.                 [ control anyMask: 2r00001100] whileFalse: [
  579.                   control <- controlBlock value: currentFirst
  580.                                           value: currentSecond.
  581.                    (control allMask: 2r01000000) ifTrue: [^nil].
  582.                    (control allMask: 2r00100000) ifTrue:
  583.                                 [currentFirst <- firstGenerator first].
  584.                    (control allMask: 2r00010000) ifTrue:
  585.                                 [currentSecond <- secondGenerator first].
  586.                    (control allMask: 2r00001100)
  587.                       ifTrue:
  588.                           [returnedValue <- computeBlock
  589.                                value: currentFirst value: currentSecond]
  590.                       ifFalse: [
  591.                          (control allMask: 2r00001000) ifTrue:
  592.                            [returnedValue <- computeBlock value: currentFirst].
  593.                          (control allMask: 2r00000100) ifTrue:
  594.                            [returnedValue <- computeBlock value: currentSecond].
  595.                          ].
  596.                    (control allMask: 2r00000010) ifTrue:
  597.                            [currentFirst <- firstGenerator next].
  598.                    (control allMask: 2r00000001) ifTrue:
  599.                            [currentSecond <- secondGenerator next].
  600.                   ].
  601.                 ^ returnedValue
  602. ]
  603. End
  604. echo unbundling new.st 1>&2
  605. cat >new.st <<'End'
  606. Class Acl
  607. | vara |
  608. [
  609.     new
  610.         vara <- 'correct'
  611. |
  612.     printa
  613.         vara print
  614. ]
  615.  
  616. Class Bcl :Acl
  617. | varb |
  618. [
  619.     new
  620.         varb <- 'correct'
  621. |
  622.     printb
  623.         varb print
  624. ]
  625.  
  626. Class Main
  627. [
  628.     main        | i |
  629.         i <- Bcl new .
  630.         i printb .
  631.         i printa
  632. ]
  633. End
  634. echo unbundling num.st 1>&2
  635. cat >num.st <<'End'
  636. Class Main
  637. [
  638.     testChars
  639.         ($A max: $a) print.
  640.         (4 between: 3.1 and: (17/3)) print.
  641.         ($A < $0) print.
  642.         $A asciiValue print.
  643.         $A asString print.
  644.         $A printString print.
  645.         $A isVowel print.
  646.         $A digitValue print
  647. |
  648.     testNums
  649.         3 + 4.1 ; print.
  650.         3.14159 exp print.
  651.         1 pi exp print.
  652.         3.5 radians print.
  653.         13 roundTo: 5 ; print.
  654.         13 truncateTo: 5 ; print.
  655.         (smalltalk perform: #+ withArguments: #(3 4.1) ) print.
  656.         (smalltalk doPrimitive: 10 withArguments: #(3 4) ) print
  657. |
  658.     testInts
  659.         5 allMask: 4 ; print.
  660.         4 allMask: 5 ; print.
  661.         5 anyMask: 4 ; print.
  662.         5 bitAnd: 3 ; print.
  663.         5 bitOr: 3 ; print.
  664.         5 bitInvert print.
  665.         254 radix: 16 ; print.
  666.         5 reciprocal print.
  667.         -5 // 4 ; print.
  668.         -5 quo: 4 ; print.
  669.         -5 \\ 4 ; print.
  670.         -5 rem: 4 ; print.
  671.         4 factorial print.
  672. |
  673.     testFloats
  674.         2.1 ^ 4 ; print.
  675.         0.5 arcSin print.
  676.         4.3 sqrt print.
  677.         256 log: 10 ; print.
  678.         16rC.ABC print.
  679.         (14.5408 radix: 16) print.
  680.         0.5236 radians sin print.
  681.         (100 @ 12) transpose print.
  682. |
  683.     main
  684.         self testChars.
  685.         self testNums.
  686.         self testInts.
  687.         self testFloats.
  688. ]
  689. End
  690. echo unbundling penshow.st 1>&2
  691. cat >penshow.st <<'End'
  692. "
  693.     this is useful only if the plot(3) routines work
  694. "
  695. Class Main
  696. | bic show |
  697. [
  698.     init
  699.         bic <- Pen new.
  700.         show <- PenShow new.
  701.         show withPen: bic.
  702.         bic extent: 0 @ 0 to: 500 @ 500.
  703. |
  704.     main
  705.         self init.
  706.         self polyShow.
  707.         self spiralShow.
  708.         self formShow.
  709. |
  710.     polyShow
  711.         bic erase.
  712.         bic up.
  713.         bic goTo: 50 @ 50.
  714.         bic down.
  715.         (3 to: 8) do: [:i |
  716.             show poly: i length: 10 ].
  717. |
  718.     spiralShow
  719.         bic erase.
  720.         bic up.
  721.         bic goTo: 250 @ 250.
  722.         bic down.
  723.         show spiral: 150 angle: 89
  724. |
  725.     formShow    | newForm saveBic |
  726.         newForm <- Form new.
  727.         saveBic <- bic.
  728.         bic <- PenSave new.
  729.         bic setForm: newForm.
  730.         bic direction: 0.0.
  731.         bic down.
  732.         show withPen: bic.
  733.         self polyShow.
  734.         bic <- saveBic.
  735.         bic down.
  736.         newForm with: bic displayAt: -15 @ ( -15 ).
  737.         newForm with: bic displayAt: 0 @ 0.
  738.         newForm with: bic displayAt: 20 @ ( -20 ).
  739.         ^ newForm
  740. ]
  741. End
  742. echo unbundling phil.st 1>&2
  743. cat >phil.st <<'End'
  744. Class  Main
  745. [
  746.     main
  747.         ( DiningPhilosophers new: 5 ) dine: 4
  748. ]
  749.  
  750. Class  DiningPhilosophers
  751. | diners  forks  philosophers |
  752. [
  753.     new: aNumber
  754.         diners <- aNumber.
  755.         forks <- Array new: aNumber.
  756.         philosophers <- Array new: aNumber.
  757.         (1 to: diners) do:
  758.         [ :p | forks at: p put: (Semaphore new: 1).
  759.                philosophers at: p put: (Philosopher new: p)]
  760.  
  761. |
  762.     dine: time
  763.         (1 to: diners) do:
  764.         [ :p | (philosophers at: p)
  765.                 leftFork: (forks at: p)
  766.                 rightFork: (forks at: ((p \\ diners) + 1))].
  767.         time timesRepeat:
  768.         [(1 to: diners) do: [ :p | (philosophers at: p) philosophize]].
  769.         (1 to: diners) do:
  770.         [ :p | (philosophers at: p) sleep]
  771. ]
  772.  
  773. Class  Philosopher
  774. | leftFork  rightFork  myName  myPhilosophy |
  775. [
  776.     new:  name
  777.         myName <- name.
  778.         myPhilosophy <- [[true] whileTrue:
  779.                 [self think.
  780.                  self getForks.
  781.                  self eat.
  782.                  self releaseForks.
  783.                  selfProcess suspend]
  784.                 ] newProcess
  785.  
  786. |
  787.     leftFork: lfork  rightFork: rfork
  788.         leftFork <- lfork.
  789.         rightFork <- rfork
  790. |
  791.     getForks
  792.         ((myName \\ 2) == 0)
  793.         ifTrue: [leftFork wait.  rightFork wait]
  794.         ifFalse: [rightFork wait.  leftFork wait]
  795. |
  796.     releaseForks
  797.         leftFork signal.
  798.         rightFork signal
  799.  
  800. |
  801.     think
  802.         ('Philosopher ',(myName asString),' is thinking.') print.
  803.         10 timesRepeat: [selfProcess yield]
  804. |
  805.     eat
  806.         ('Philosopher ',(myName asString),' is eating.') print.
  807.         10 timesRepeat: [selfProcess yield]
  808.  
  809. |
  810.     philosophize
  811.         myPhilosophy resume
  812. |
  813.     sleep
  814.         myPhilosophy terminate.
  815.         ('Philosopher ',(myName asString),' is sleeping.') print.
  816.         myPhilosophy <- nil
  817. ]
  818. End
  819. echo unbundling plane.st 1>&2
  820. cat >plane.st <<'End'
  821. Class Main
  822. [
  823.     main    | i |
  824.         i <- Plane new.
  825.         i init.
  826.         i fly.
  827.         i bomb.
  828. ]
  829. Class Plane
  830. | plane bomb cloud |
  831. [
  832.     init
  833.         plane <- Form new.
  834.         plane row:  1 put: '                    '.
  835.         plane row:  2 put: '   \                '.
  836.         plane row:  3 put: '   |\       --------'.
  837.         plane row:  4 put: '   |\\________/ /___|'.
  838.         plane row:  5 put: '   | -- SU   / /    0'.
  839.         plane row:  6 put: '   <--------/ /-----|'.
  840.         plane row:  7 put: '         --------    '.
  841.         plane row:  8 put: '            rm *'.
  842.         bomb <- 'rm *'.
  843.         cloud <- Form new.
  844.         cloud row:  1 put: '   (  ) )'.
  845.         cloud row:  2 put: ' (  *  )  )'.
  846.         cloud row:  3 put: '( { } ) * )'.
  847.         cloud row:  4 put: ' ( - ) ) )'.
  848.         cloud row:  5 put: '   ( )'.
  849.         ^ plane
  850. |
  851.     bomb            | location bombLocation |
  852.         smalltalk clearScreen.
  853.         'FILES' printAt: 23 @ 60.
  854.         cloud printAt: 1@30.
  855.         location <- 1 @ 1.
  856.         plane printAt: location.
  857.         (1 to: 8) do: [:j |
  858.             location <- j @ (j * 3).
  859.             plane printAt: location].
  860.         plane row: 8 put: '                 '.
  861.         bombLocation <- (location x + 7) @ (location y + 10).
  862.         (7 to: 2 by: -1) do: [:j |
  863.             location <- j @ (location y + 3).
  864.             plane printAt: location.
  865.             '         ' printAt: bombLocation.
  866.             bombLocation <- (bombLocation x + 1) @
  867.                     (bombLocation y + 3).
  868.             bomb printAt: bombLocation ].
  869.         '        ' printAt: bombLocation.
  870.         '*****OPPS*****' printAt: 23 @ 55.
  871.         ' ' printAt: 21 @ 0.
  872. |
  873.     fly            | sky |
  874.         smalltalk clearScreen.
  875.         (10 to: 50 by: 5) do: [:i |
  876.             sky <- Form new.
  877.             sky placeForm: cloud at: 10 @ 40.
  878.             sky overLayForm: plane at: 10 @ i.
  879.             sky printAt: 1 @ 1
  880.             ].
  881.         ' ' printAt: 21 @ 0
  882. |
  883.     display
  884.         plane printAt: 10@10 . '   ' print
  885. ]
  886. End
  887. echo unbundling prime.st 1>&2
  888. cat >prime.st <<'End'
  889. Class Main
  890. [
  891.     main    | x gen |
  892.         gen <- Primes new.
  893.         (smalltalk time: [ x <- gen first.
  894.         [x < 300]
  895.             whileTrue: [ x print. x <- gen next] ] ) print.
  896. ]
  897. Class Primes
  898. | lastPrime |
  899. [
  900.     first
  901.         ^ lastPrime <- 2
  902. |
  903.     next
  904.         [lastPrime <- lastPrime + 1.
  905.          self testNumber: lastPrime]
  906.             whileFalse.
  907.         ^ lastPrime
  908. |
  909.     testNumber: n
  910.         (Primes new) do: [:x |
  911.             (x squared > n) ifTrue: [ ^ true ].
  912.             (n \\ x = 0) ifTrue: [ ^ false ] ]
  913. ]
  914. End
  915. echo unbundling prime3.st 1>&2
  916. cat >prime3.st <<'End'
  917. Class Main
  918. [
  919.     main    | x gen |
  920.         gen <- Primes new.
  921.         (smalltalk time: [
  922.         x <- gen first.
  923.         [x < 300]
  924.             whileTrue: [ x print. x <- gen next] ]) print
  925. ]
  926. Class Primes
  927. | prevPrimes lastPrime |
  928. [
  929.     first
  930.         prevPrimes <- LinkedList new.
  931.         prevPrimes add: (lastPrime <- 2).
  932.         ^ lastPrime
  933. |
  934.     next
  935.         [lastPrime <- lastPrime + 1.
  936.          self testNumber: lastPrime]
  937.             whileFalse.
  938.         prevPrimes addLast: lastPrime.
  939.         ^ lastPrime
  940. |
  941.     testNumber: n
  942.         prevPrimes do: [:x |
  943.             (x squared > n) ifTrue: [ ^ true ].
  944.             (n \\ x = 0) ifTrue: [ ^ false ] ]
  945. ]
  946. End
  947. echo unbundling prime4.st 1>&2
  948. cat >prime4.st <<'End'
  949. Class Main
  950. [
  951.     main    | x gen |
  952.         gen <- Primes new.
  953.         (smalltalk time: [x <- gen first.
  954.         [x < 300]
  955.             whileTrue: [ x print. x <- gen next] ] ) print
  956. ]
  957. Class Primes
  958. | prevPrimes lastPrime |
  959. [
  960.     first
  961.         prevPrimes <- Set new.
  962.         prevPrimes add: (lastPrime <- 2).
  963.         ^ lastPrime
  964. |
  965.     next
  966.         [lastPrime <- lastPrime + 1.
  967.          self testNumber: lastPrime]
  968.             whileFalse.
  969.         prevPrimes add: lastPrime.
  970.         ^ lastPrime
  971. |
  972.     testNumber: n
  973.         prevPrimes do: [:x |
  974.             (n \\ x = 0) ifTrue: [ ^ false ] ].
  975.         ^ true
  976. ]
  977. End
  978. echo unbundling primes.st 1>&2
  979. cat >primes.st <<'End'
  980. Class Main
  981. [
  982.     main
  983.         (Primes new) do: [:x | x print]
  984. ]
  985. Class Primes
  986. | primeGenerator lastFactor |
  987. [
  988.     first
  989.         primeGenerator <- 2 to: 300.
  990.         lastFactor <- primeGenerator first.
  991.         ^ lastFactor
  992. |
  993.     next
  994.         primeGenerator <- (Factor new ;
  995.                     remove: lastFactor
  996.                     from:   primeGenerator ).
  997.         ^ lastFactor <- primeGenerator next.
  998. ]
  999.  
  1000. Class Factor
  1001. | myFactor generator |
  1002. [
  1003.     remove: factorValue from: generatorValue
  1004.         myFactor <- factorValue.
  1005.         generator <- generatorValue
  1006. |
  1007.     next        | possible |
  1008.         [(possible <- generator next) notNil]
  1009.             whileTrue:
  1010.                 [(possible \\ myFactor ~= 0)
  1011.                     ifTrue: [ ^ possible] ].
  1012.         ^ nil
  1013. ]
  1014.  
  1015.  
  1016. End
  1017. echo unbundling prob.st 1>&2
  1018. cat >prob.st <<'End'
  1019. Class DiscreteProbability
  1020.     | randnum |
  1021. [
  1022.     initialize
  1023.         randnum <- Random new
  1024.  
  1025. |    next
  1026.         ^ self inverseDistribution: randnum next
  1027.  
  1028. |    computeSample: m outOf: n    
  1029.         m > n ifTrue: [^ 0.0]
  1030.         ^ n factorial / (n - m) factorial
  1031. ]
  1032.  
  1033. Class Geometric    :DiscreteProbability
  1034.     | prob |    
  1035.  
  1036. [
  1037.     mean: m
  1038.         prob <- m
  1039.  
  1040. |    mean
  1041.         ^ 1.0 / prob
  1042.  
  1043. |    variance
  1044.         ^ (1.0 - prob) / prob * prob
  1045.  
  1046. |    density: x
  1047.         x > 0 ifTrue: [^prob * ((1.0-prob) raisedTo: x-1)]
  1048.               ifFalse: [^1.0]
  1049.  
  1050. |    inverseDistribution: x
  1051.         ^ (x ln / (1.0 - prob) ln) ceiling
  1052. ]
  1053.  
  1054. Class Binomial    :DiscreteProbability
  1055.     | number prob |
  1056. [
  1057.     events: num mean: p
  1058.         (p between: 0.0 and: 1.0)
  1059.            ifFalse: [self error: 'mean must be > 0'].
  1060.         number <- num.
  1061.         prob <- p
  1062.  
  1063. |    mean
  1064.         ^ prob
  1065.  
  1066. |    variance
  1067.         ^ prob * (1 - prob)
  1068.  
  1069. |    density: x
  1070.         (x between: 0.0 and number)
  1071.            ifTrue: [^((self computeSample: x outOf: number)
  1072.             / (self computeSample: x outOf: x))
  1073.             * (prob raisedTo: x) * ((1 - prob) raisedTo: number - x)]
  1074.            ifFalse: [^0.0]
  1075.  
  1076. |    inverseDistribution: x
  1077.         x <= prob
  1078.             ifTrue: [^ 1]
  1079.             ifFalse: [^ 0]
  1080.  
  1081. |    next
  1082.     | t |
  1083.         t <- 0.
  1084.         number timesRepeat: [t <- t + super next].
  1085.         ^ t
  1086. ]
  1087. End
  1088. echo unbundling sim1.st 1>&2
  1089. cat >sim1.st <<'End'
  1090. "
  1091.     Simple Minded simulation from Chapter 6 of book
  1092. "
  1093. Class Main
  1094. [
  1095.     main        | i |
  1096.         i <- IceCreamStore new.
  1097.         [i time < 25] whileTrue: [ i proceed ].
  1098.         i reportProfits
  1099. ]
  1100.  
  1101. Class Simulation
  1102. | currentTime nextEvent nextEventTime |
  1103. [
  1104.     new
  1105.         currentTime <- 0
  1106. |
  1107.  
  1108.     time
  1109.         ^ currentTime
  1110. |
  1111.     addEvent: event at: eventTime
  1112.         nextEvent <- event.
  1113.         nextEventTime <- eventTime
  1114. |
  1115.     proceed
  1116.         currentTime <- nextEventTime.
  1117.         self processEvent: nextEvent
  1118. ]
  1119.  
  1120. Class IceCreamStore :Simulation
  1121. | profit rand |
  1122. [
  1123.     new
  1124.         profit <- 0.
  1125.         rand <- Random new.
  1126.         "rand randomize.  taken out so results remain the same"
  1127.         self scheduleArrival
  1128. |
  1129.     scheduleArrival
  1130.         self addEvent: Customer new
  1131.             at: (self time + (rand randInteger: 5))
  1132. |
  1133.     processEvent: event
  1134.         ('customer received at ', self time printString) print.
  1135.         profit <- profit + ( event numberOfScoops * 0.17 ).
  1136.         self scheduleArrival
  1137. |
  1138.     reportProfits
  1139.         ('profits are ', profit printString) print
  1140. ]
  1141.  
  1142. Class Customer
  1143. | rand |
  1144. [
  1145.     new
  1146.         (rand <- Random new) "--randomize (taken out)"
  1147. |
  1148.     numberOfScoops        | number |
  1149.         number <- rand randInteger: 3.
  1150.         ('customer has ', number printString , ' scoops ') print.
  1151.         ^ number
  1152. ]
  1153. End
  1154. echo unbundling sim2.st 1>&2
  1155. cat >sim2.st <<'End'
  1156. "
  1157.     Simple Minded simulation from Chapter 6 of book
  1158.  
  1159.     IceCream Store -
  1160.         single event queue
  1161.         multiple group size
  1162.         discrete probability on number of scoops selected
  1163. "
  1164. Class Main
  1165. [
  1166.     main        | i |
  1167.         i <- IceCreamStore new.
  1168.         [i time < 25] whileTrue: [ i proceed ].
  1169.         i reportProfits
  1170. ]
  1171.  
  1172. Class Simulation
  1173. | currentTime nextEvent nextEventTime |
  1174. [
  1175.     new
  1176.         currentTime <- 0
  1177. |
  1178.     time
  1179.         ^ currentTime
  1180. |
  1181.     addEvent: event at: eventTime
  1182.         nextEvent <- event.
  1183.         nextEventTime <- eventTime
  1184. |
  1185.     proceed
  1186.         currentTime <- nextEventTime.
  1187.         self processEvent: nextEvent
  1188. ]
  1189.  
  1190. Class IceCreamStore :Simulation
  1191. | profit rand scoopDistribution |
  1192. [
  1193.     new
  1194.         profit <- 0.
  1195.         rand <- Random new.
  1196.         (scoopDistribution <- DiscreteProbability new)
  1197.             defineWeights: #(65 25 10).
  1198.         self scheduleArrival
  1199. |
  1200.     scheduleArrival
  1201.         self addEvent: Customer new
  1202.             at: (self time + (rand randInteger: 5))
  1203. |
  1204.     processEvent: event
  1205.         ('customer received at ', self time printString) print.
  1206.         profit <- profit + ((self scoopsFor: event groupSize)  * 0.17 ).
  1207.         self scheduleArrival
  1208. |    
  1209.     scoopsFor: group        | number |
  1210.         number <- 0.
  1211.         group timesRepeat:
  1212.             [number <- number + scoopDistribution next].
  1213.         ('group of ', group printString, ' have ', number
  1214.         printString, ' scoops ') print.
  1215.         ^ number
  1216.  
  1217. |
  1218.     reportProfits
  1219.         ('profits are ', profit printString) print
  1220. ]
  1221.  
  1222. Class Customer
  1223. | groupSize |
  1224. [
  1225.     new
  1226.         groupSize <- (Random new "randomize" ) randInteger: 8
  1227. |
  1228.     groupSize
  1229.         ^ groupSize
  1230. ]
  1231.  
  1232. Class DiscreteProbability
  1233. | weights rand max |
  1234. [
  1235.     defineWeights: anArray
  1236.         weights <- anArray.
  1237.         (rand <- Random new) "randomize".
  1238.         max <- anArray inject: 0 into: [:x :y | x + y]
  1239. |
  1240.     next    | index value |
  1241.         value <- rand randInteger: max.
  1242.         index <- 1.
  1243.         [value > (weights at: index)]
  1244.             whileTrue: [value <- value - (weights at: index).
  1245.                     index <- index + 1].
  1246.         ^ index
  1247. ]
  1248.  
  1249. End
  1250. echo unbundling sim3.st 1>&2
  1251. cat >sim3.st <<'End'
  1252. "
  1253.     Simple Minded simulation from Chapter 6 of book
  1254.  
  1255.     IceCream Store -
  1256.         multiple event queue
  1257. "
  1258. Class Main
  1259. [
  1260.     main        | i |
  1261.         i <- IceCreamStore new.
  1262.         [i time < 60] whileTrue: [ i proceed ].
  1263.         i reportProfits
  1264. ]
  1265.  
  1266. Class Simulation
  1267. | currentTime eventQueue |
  1268. [
  1269.     new
  1270.         eventQueue <- Dictionary new.
  1271.         currentTime <- 0
  1272. |
  1273.     time
  1274.         ^ currentTime
  1275. |
  1276.     addEvent: event at: eventTime
  1277.         (eventQueue includesKey: eventTime)
  1278.             ifTrue: [(eventQueue at: eventTime) add: event]
  1279.             ifFalse: [eventQueue at: eventTime
  1280.                     put: (Set new ; add: event)]
  1281. |    
  1282.     addEvent: event next: timeIncrement
  1283.         self addEvent: event at: currentTime + timeIncrement
  1284. |
  1285.     proceed        | minTime eventset event |
  1286.         minTime <- 99999.
  1287.         eventQueue keysDo:
  1288.             [:x | (x < minTime) ifTrue: [minTime <- x]].
  1289.         currentTime <- minTime.
  1290.         eventset <- eventQueue at: minTime ifAbsent: [^nil].
  1291.         event <- eventset first.
  1292.         eventset remove: event.
  1293.         (eventset isEmpty) ifTrue: [eventQueue removeKey: minTime].
  1294.         self processEvent: event
  1295. ]
  1296.  
  1297. Class IceCreamStore :Simulation
  1298. | profit arrivalDistribution rand scoopDistribution remainingChairs |
  1299. [
  1300.     new
  1301.         profit <- 0.
  1302.         remainingChairs <- 15.
  1303.         rand <- Random new.
  1304.         (arrivalDistribution <- Normal new)
  1305.             setMean: 3.0 deviation: 1.0.
  1306.         (scoopDistribution <- DiscreteProbability new)
  1307.             defineWeights: #(65 25 10).
  1308.         self scheduleArrival
  1309. |
  1310.     scheduleArrival            | newcustomer  time |
  1311.         newcustomer <- Customer new.
  1312.         time <- self time + (arrivalDistribution next).
  1313.         (time < 15) ifTrue: [
  1314.             self addEvent: [self customerArrival: newcustomer]
  1315.                 at: time ]
  1316. |
  1317.     processEvent: event
  1318.         ('event received at ', self time printString) print.
  1319.         event value.
  1320.         self scheduleArrival
  1321. |
  1322.     customerArrival: customer    | size |
  1323.         size <- customer groupSize.
  1324.         ('group of size ', size printString , ' arrives') print.
  1325.         (size < remainingChairs)
  1326.             ifTrue: [remainingChairs <- remainingChairs - size.
  1327.                  'take chairs, schedule order' print.
  1328.                  self addEvent:
  1329.                     [self customerOrder: customer]
  1330.                     next: (rand randInteger: 3).
  1331.                 ]
  1332.             ifFalse: ['finds no chairs, leave' print]
  1333. |
  1334.     customerOrder: customer        | size numScoops |
  1335.         size <- customer groupSize.
  1336.         numScoops <- 0.
  1337.         size timesRepeat:
  1338.             [numScoops <- numScoops + scoopDistribution next].
  1339.         ('group of size ', size printString, ' orders ' ,
  1340.         numScoops printString, ' scoops') print.
  1341.         profit <- profit + (numScoops * 0.17).
  1342.         self addEvent:
  1343.             [self customerLeave: customer]
  1344.             next: (rand randInteger: 5)
  1345. |
  1346.     customerLeave: customer        | size |
  1347.         size <- customer groupSize.
  1348.         ('group of size ', size printString, ' leaves') print.
  1349.         remainingChairs <- remainingChairs + customer groupSize
  1350. |
  1351.     reportProfits
  1352.         ('profits are ', profit printString) print
  1353. ]
  1354.  
  1355. Class Customer
  1356. | groupSize |
  1357. [
  1358.     new
  1359.         groupSize <- (Random new "randomize") randInteger: 8
  1360. |
  1361.     groupSize
  1362.         ^ groupSize
  1363. ]
  1364.  
  1365. Class DiscreteProbability
  1366. | weights rand max |
  1367. [
  1368.     defineWeights: anArray
  1369.         weights <- anArray.
  1370.         (rand <- Random new) "randomize".
  1371.         max <- anArray inject: 0 into: [:x :y | x + y]
  1372. |
  1373.     next    | index value |
  1374.         value <- rand randInteger: max.
  1375.         index <- 1.
  1376.         [value > (weights at: index)]
  1377.             whileTrue: [value <- value - (weights at: index).
  1378.                     index <- index + 1].
  1379.         ^ index
  1380. ]
  1381.  
  1382. Class Normal :Random
  1383. | mean deviation |
  1384. [
  1385.     new
  1386.         self setMean: 1.0 deviation: 0.5
  1387. |
  1388.     setMean: m deviation: s
  1389.         mean <- m.
  1390.         deviation <- s
  1391. |
  1392.     next        | v1 v2 s u |
  1393.         s <- 1.
  1394.         [s >= 1] whileTrue:
  1395.             [v1 <- (2 * super next) - 1.
  1396.              v2 <- (2 * super next) - 1.
  1397.               s <- v1 squared + v2 squared ].
  1398.         u <- (-2.0 * s ln / s) sqrt.
  1399.         ^ mean + (deviation * v1 * u)
  1400. ]
  1401. End
  1402. echo unbundling super.st 1>&2
  1403. cat >super.st <<'End'
  1404. Class One
  1405. [
  1406.         test
  1407.                 ^ 1
  1408. |       result1
  1409.                 ^ self test
  1410. ]
  1411.  
  1412. Class Two :One
  1413. [
  1414.         test
  1415.                 ^ 2
  1416. ]
  1417.  
  1418. Class Three :Two
  1419. [
  1420.         result2
  1421.                 ^ self result1
  1422. |       result3
  1423.                 ^ super test
  1424. ]
  1425.  
  1426. Class Four :Three
  1427. [
  1428.         test
  1429.                 ^ 4
  1430. ]
  1431.  
  1432. Class Main
  1433. | example1 example2 example3 example4 |
  1434. [
  1435.         main
  1436.                 example1 <- One new.
  1437.                 example2 <- Two new.
  1438.                 example3 <- Three new.
  1439.                 example4 <- Four new.
  1440.                 example1 test print.
  1441.                 example1 result1 print.
  1442.                 example2 test print.
  1443.                 example2 result1 print.
  1444.                 example3 test print.
  1445.                 example4 result1 print.
  1446.                 example3 result2 print.
  1447.                 example4 result2 print.
  1448.                 example3 result3 print.
  1449.                 example4 result3 print
  1450. ]
  1451. End
  1452. echo unbundling temp.st 1>&2
  1453. cat >temp.st <<'End'
  1454. Class Main
  1455. [
  1456.     main        | i |
  1457.  
  1458.         i <- 1.
  1459.         [i < 3] whileTrue: [i print. i <- i + 1]
  1460. ]
  1461.  
  1462. End
  1463. echo unbundling turing.st 1>&2
  1464. cat >turing.st <<'End'
  1465. "
  1466.     Turing machine simulator contributed by Jan Gray,
  1467.         the University of Waterloo
  1468. "
  1469. Class Main
  1470. [
  1471.     main            | tm |
  1472.         tm <- TuringMachine new initialize.
  1473.         tm delta state: 0 input: $# nextState: 1 output: $L.
  1474.         tm delta state: 1 input: $I nextState: 1 output: $i.
  1475.         tm delta state: 1 input: $i nextState: 1 output: $L.
  1476.         tm delta state: 1 input: $# nextState: 2 output: $R.
  1477.         tm delta state: 2 input: $i nextState: 2 output: $R.
  1478.         tm delta state: 2 input: $# nextState: 'halt' output: $#.
  1479.         tm tape: 'IIIIII'.
  1480.         tm delta print.
  1481.         tm run
  1482. ]
  1483. Class TuringMachine
  1484. |       tape            "Infinite tape"
  1485.         state           "Current state, TM continues if state is a number"
  1486.         delta           "A TransitionTable, which for each (state, input)
  1487.                          gives (next state, output)"
  1488.         tapeMoves       "A Dictionary which maps L and R into [tape left]
  1489.                          and [tape right]"
  1490. |
  1491. [
  1492.         initialize
  1493.                 tapeMoves <- Dictionary new.
  1494.                 tapeMoves at: $L put: [tape left].
  1495.                 tapeMoves at: $R put: [tape right].
  1496.                 delta <- TransitionTable new.
  1497.                 self tape: ''.
  1498.                 self state: 0
  1499. |
  1500.         tape: aString
  1501.                 tape <- Tape new with: aString
  1502. |
  1503.         state: aState
  1504.                 state <- aState
  1505. |
  1506.         delta
  1507.                 ^ delta
  1508. |
  1509.         step
  1510.                 | next |
  1511.                 next <- delta atState: state input: tape read.
  1512.                 state <- next state.
  1513.                 (state isKindOf: Number)
  1514.                         ifTrue: [(tapeMoves includesKey: next symbol)
  1515.                                         ifTrue:  [(tapeMoves at: next symbol) value]
  1516.                                         ifFalse: [tape write: next symbol]]
  1517. |
  1518.         run
  1519.                 state <- 0.
  1520.                 self print.
  1521.                 [state isKindOf: Number] whileTrue: [self step print]
  1522. |
  1523.         printString
  1524.                 ^ 'State ', state printString, ', Tape ', tape printString
  1525. ]
  1526. Class Pair    :Magnitude
  1527. | state symbol |
  1528. [
  1529.         state: aState symbol: aSymbol
  1530.                 state <- aState.
  1531.                 symbol <- aSymbol
  1532. |
  1533.         state
  1534.                 ^ state
  1535. |
  1536.         symbol
  1537.                 ^ symbol
  1538. |
  1539.     < aPair
  1540.         ^ state < aPair state or:
  1541.             [state = aPair state and: [symbol < aPair symbol]]
  1542. |
  1543.         printString
  1544.                 ^ state printString, '    ', symbol printString
  1545. ]
  1546. Class TransitionTable :Dictionary
  1547. [
  1548.         state: aState input: in nextState: nextState output: out
  1549.                 self at: (Pair new state: aState symbol: in)
  1550.                      put: (Pair new state: nextState symbol: out).
  1551.         ^ nil
  1552. |
  1553.         atState: aState input: in
  1554.                 ^ self at: (Pair new state: aState symbol: in)
  1555.                        ifAbsent: [^ Pair new state: 'hung' symbol: nil].
  1556. |
  1557.         print
  1558.                 'State    Read    Next    Write' print.
  1559.         self binaryDo: [:x :y |
  1560.             (x printString , '    ', y printString) print]
  1561. ]
  1562. Class Tape :Object
  1563. | tape position |
  1564. [
  1565.         with: aString
  1566.                 tape <- '#', aString, '#'.
  1567.                 position <- tape size
  1568. |
  1569.         read
  1570.                 ^ tape at: position
  1571. |
  1572.         write: aChar
  1573.                 tape at: position put: aChar.
  1574. |
  1575.         left
  1576.                 (position > 1)
  1577.                         ifTrue: [position <- position - 1]
  1578. |
  1579.         right
  1580.                 (position = tape size)
  1581.                         ifTrue: [tape <- tape, '#'].
  1582.                 position <- position + 1
  1583. |
  1584.         printString
  1585.                 ^ (tape copyFrom: 1 to: position - 1), '{',
  1586.                   ((tape at: position) asString), '}',
  1587.                   (tape copyFrom: position + 1 to: tape size)
  1588. ]
  1589. End
  1590. echo unbundling visitor.st 1>&2
  1591. cat >visitor.st <<'End'
  1592. Class SimulationObject :Object    
  1593.     | sizeDist waitDist |
  1594. [
  1595.     init
  1596.         sizeDist <- Binomial new initialize events: 5 mean: 0.4.
  1597.         waitDist <- Random new    "uniform distribution"
  1598.  
  1599. |    size
  1600.         ^ sizeDist next
  1601.  
  1602. |    wait: sizeGroup      "uniform distribution from 1 to 6"
  1603.         ^ waitDist next * sizeGroup * 6
  1604. ]
  1605.  
  1606. Class Visitor    :SimulationObject
  1607.     | sizeGroup wait alreadyEaten |
  1608. [
  1609.     initialize: superClass
  1610.         sizeGroup <- superClass size.
  1611.         wait <- superClass wait: sizeGroup.
  1612.         alreadyEaten <- false
  1613.  
  1614. |    entering
  1615.         (alreadyEaten == false)
  1616.              ifTrue: [alreadyEaten <- true. ^ true].
  1617.         ^ false
  1618.  
  1619. |    time    
  1620.         ^ wait
  1621.  
  1622. |    groupSize
  1623.         ^ sizeGroup
  1624.  
  1625. ]
  1626. End
  1627. echo unbundling 4queen.out 1>&2
  1628. cat >4queen.out <<'End'
  1629. Little Smalltalk
  1630.     Col 1 Row 2
  1631. Col 2 Row 4
  1632. Col 3 Row 1
  1633. Col 4 Row 3
  1634. Main
  1635.     
  1636.  
  1637. End
  1638. echo unbundling basic.out 1>&2
  1639. cat >basic.out <<'End'
  1640. Little Smalltalk
  1641.     88
  1642. 3.14159
  1643. this is it
  1644. #( #this #is #also #it )
  1645. True
  1646. shallowCopy
  1647. respondsTo:
  1648. printString
  1649. print
  1650. notNil
  1651. next
  1652. isNil
  1653. isMemberOf:
  1654. isKindOf:
  1655. first
  1656. error:
  1657. do:
  1658. deepCopy
  1659. copy
  1660. class
  1661. asSymbol
  1662. asString
  1663. ~=
  1664. =
  1665. ~~
  1666. ==
  1667. #( 22 17 )
  1668. time:
  1669. sh:
  1670. perform:withArguments:
  1671. noDisplay
  1672. doPrimitive:withArguments:
  1673. displayAssign
  1674. display
  1675. debug:
  1676. date
  1677. clearScreen
  1678. Main
  1679.     
  1680.  
  1681. End
  1682. echo unbundling blocks.out 1>&2
  1683. cat >blocks.out <<'End'
  1684. Little Smalltalk
  1685.     correct-1
  1686. correct-2
  1687. correct-3
  1688. correct-4
  1689. correct-5
  1690. correct-6
  1691. correct-7
  1692. correct-8
  1693. Main
  1694.     
  1695.  
  1696. End
  1697. echo unbundling collect.out 1>&2
  1698. cat >collect.out <<'End'
  1699. Little Smalltalk
  1700.     example
  1701. 7
  1702. #( $e $x $a $m $p $l $e )
  1703. 2
  1704. Bag ( $x $l $m $p $a $e $e )
  1705. Set ( $l $p $m $a $x $e )
  1706. exampl
  1707. Dictionary ( 1 @ $e 2 @ $x 3 @ $a 4 @ $m 5 @ $p 6 @ $l 7 @ $e )
  1708. List ( $e $x $a $m $p $l $e )
  1709. List ( 0.666667 $e $x $a $m $p $l $e 12.5 13.25 14 14.75 )
  1710. 14.75
  1711. List ( 0.666667 $e $x $a $m $p $l $e 12.5 13.25 14 $a 7 )
  1712. xmpl
  1713. xampl
  1714. aeelmpx
  1715. xpmleea
  1716. Set ( 7 6 5 4 3 2 1 )
  1717. Bag ( $x $l $m $p $a $e $e )
  1718. xxxmxlx
  1719. Bag ( 1 2 3 4 5 6 )
  1720. 6
  1721. Bag ( 1 3 5 )
  1722. Set ( 2 1 0 )
  1723. 3
  1724. read
  1725. Main
  1726.     
  1727.  
  1728. End
  1729. echo unbundling copy.out 1>&2
  1730. cat >copy.out <<'End'
  1731. Little Smalltalk
  1732.     test value test value 17
  1733. test value test value 12
  1734. #( test value 17 )
  1735. #( test value 12 )
  1736. Main
  1737.     
  1738.  
  1739. End
  1740. echo unbundling file.out 1>&2
  1741. cat >file.out <<'End'
  1742. Little Smalltalk
  1743.     niaM ssalC
  1744. [
  1745. | g f |        niam    
  1746. .'ts.elif' :nepo ; wen eliF -< f        
  1747. .'w' :rof 'oof' :nepo ; wen eliF -< g        
  1748. .]desrever x :etirw g | x:[ :od f        
  1749. .'r' :rof 'oof' :nepo ; wen eliF -< g        
  1750. .]tnirp x | x:[ :od g        
  1751. .retcarahCedom f        
  1752. .tnirp tsrif f        
  1753. .] tnirp txen f [ :taepeRsemit 01        
  1754. .tnirp )2 :ta f(        
  1755. .tnirp yeKtnerruc f        
  1756. .tnirp ezis f        
  1757. ]
  1758.  
  1759. $C
  1760. $l
  1761. $a
  1762. $s
  1763. $s
  1764. $
  1765. $M
  1766. $a
  1767. $i
  1768. $n
  1769. $
  1770.  
  1771. $a
  1772. 3
  1773. 335
  1774. Main
  1775.     
  1776.  
  1777. End
  1778. echo unbundling fork.out 1>&2
  1779. cat >fork.out <<'End'
  1780. Little Smalltalk
  1781.     17
  1782. 23
  1783. 17
  1784. 23
  1785. 17
  1786. 23
  1787. 17
  1788. 23
  1789. 17
  1790. 23
  1791. 17
  1792. 23
  1793. 17
  1794. 23
  1795. 17
  1796. 23
  1797. 17
  1798. 23
  1799. 17
  1800. 23
  1801. Main
  1802.     
  1803.  
  1804. End
  1805. echo unbundling new.out 1>&2
  1806. cat >new.out <<'End'
  1807. Little Smalltalk
  1808.     correct
  1809. correct
  1810. Main
  1811.     
  1812.  
  1813. End
  1814. echo unbundling num.out 1>&2
  1815. cat >num.out <<'End'
  1816. Little Smalltalk
  1817.     $a
  1818. True
  1819. False
  1820. 65
  1821. A
  1822. $A
  1823. True
  1824. 10
  1825. 7.1
  1826. 23.1406
  1827. 23.1407
  1828. 3.5 radians
  1829. 15
  1830. 10
  1831. 7.1
  1832. 7
  1833. True
  1834. False
  1835. True
  1836. 1
  1837. 7
  1838. -6
  1839. 16rFE
  1840. 0.2
  1841. -2
  1842. -1
  1843. 1
  1844. -1
  1845. 24
  1846. 19.4481
  1847. 0.523599 radians
  1848. 2.07364
  1849. 2.40824
  1850. 12.6709
  1851. 16rE.8A71DE
  1852. 0.500001
  1853. 12 @ 100
  1854. Main
  1855.     
  1856.  
  1857. End
  1858. echo unbundling phil.out 1>&2
  1859. cat >phil.out <<'End'
  1860. Little Smalltalk
  1861.     Philosopher 1 is thinking.
  1862. Philosopher 2 is thinking.
  1863. Philosopher 3 is thinking.
  1864. Philosopher 4 is thinking.
  1865. Philosopher 1 is eating.
  1866. Philosopher 5 is thinking.
  1867. Philosopher 3 is eating.
  1868. Philosopher 5 is eating.
  1869. Philosopher 2 is eating.
  1870. Philosopher 4 is eating.
  1871. Philosopher 1 is thinking.
  1872. Philosopher 2 is thinking.
  1873. Philosopher 3 is thinking.
  1874. Philosopher 4 is thinking.
  1875. Philosopher 1 is eating.
  1876. Philosopher 5 is thinking.
  1877. Philosopher 3 is eating.
  1878. Philosopher 5 is eating.
  1879. Philosopher 2 is eating.
  1880. Philosopher 4 is eating.
  1881. Philosopher 1 is sleeping.
  1882. Philosopher 2 is sleeping.
  1883. Philosopher 3 is sleeping.
  1884. Philosopher 4 is sleeping.
  1885. Philosopher 5 is sleeping.
  1886. Main
  1887.     
  1888.  
  1889. End
  1890. echo unbundling primes.out 1>&2
  1891. cat >primes.out <<'End'
  1892. Little Smalltalk
  1893.     2
  1894. 3
  1895. 5
  1896. 7
  1897. 11
  1898. 13
  1899. 17
  1900. 19
  1901. 23
  1902. 29
  1903. 31
  1904. 37
  1905. 41
  1906. 43
  1907. 47
  1908. 53
  1909. 59
  1910. 61
  1911. 67
  1912. 71
  1913. 73
  1914. 79
  1915. 83
  1916. 89
  1917. 97
  1918. 101
  1919. 103
  1920. 107
  1921. 109
  1922. 113
  1923. 127
  1924. 131
  1925. 137
  1926. 139
  1927. 149
  1928. 151
  1929. 157
  1930. 163
  1931. 167
  1932. 173
  1933. 179
  1934. 181
  1935. 191
  1936. 193
  1937. 197
  1938. 199
  1939. 211
  1940. 223
  1941. 227
  1942. 229
  1943. 233
  1944. 239
  1945. 241
  1946. 251
  1947. 257
  1948. 263
  1949. 269
  1950. 271
  1951. 277
  1952. 281
  1953. 283
  1954. 293
  1955. Main
  1956.     
  1957.  
  1958. End
  1959. echo unbundling sim1.out 1>&2
  1960. cat >sim1.out <<'End'
  1961. Little Smalltalk
  1962.     customer received at 4
  1963. customer has 3 scoops
  1964. customer received at 5
  1965. customer has 3 scoops
  1966. customer received at 8
  1967. customer has 3 scoops
  1968. customer received at 10
  1969. customer has 3 scoops
  1970. customer received at 13
  1971. customer has 3 scoops
  1972. customer received at 14
  1973. customer has 3 scoops
  1974. customer received at 19
  1975. customer has 3 scoops
  1976. customer received at 23
  1977. customer has 3 scoops
  1978. customer received at 27
  1979. customer has 3 scoops
  1980. profits are 4.59
  1981. Main
  1982.     
  1983.  
  1984. End
  1985. echo unbundling sim2.out 1>&2
  1986. cat >sim2.out <<'End'
  1987. Little Smalltalk
  1988.     customer received at 4
  1989. group of 7 have 10 scoops
  1990. customer received at 5
  1991. group of 7 have 9 scoops
  1992. customer received at 8
  1993. group of 7 have 11 scoops
  1994. customer received at 10
  1995. group of 7 have 7 scoops
  1996. customer received at 13
  1997. group of 7 have 9 scoops
  1998. customer received at 14
  1999. group of 7 have 10 scoops
  2000. customer received at 19
  2001. group of 7 have 11 scoops
  2002. customer received at 23
  2003. group of 7 have 8 scoops
  2004. customer received at 27
  2005. group of 7 have 8 scoops
  2006. profits are 14.11
  2007. Main
  2008.     
  2009.  
  2010. End
  2011. echo unbundling sim3.out 1>&2
  2012. cat >sim3.out <<'End'
  2013. Little Smalltalk
  2014.     event received at 3.46877
  2015. group of size 7 arrives
  2016. take chairs, schedule order
  2017. event received at 5.81336
  2018. group of size 7 arrives
  2019. take chairs, schedule order
  2020. event received at 6.46877
  2021. group of size 7 orders 10 scoops
  2022. event received at 6.81336
  2023. group of size 7 orders 9 scoops
  2024. event received at 8.81336
  2025. group of size 7 leaves
  2026. event received at 8.91228
  2027. group of size 7 arrives
  2028. take chairs, schedule order
  2029. event received at 9.46877
  2030. group of size 7 leaves
  2031. event received at 10.9123
  2032. group of size 7 orders 11 scoops
  2033. event received at 10.9499
  2034. group of size 7 arrives
  2035. take chairs, schedule order
  2036. event received at 11.1909
  2037. group of size 7 arrives
  2038. finds no chairs, leave
  2039. event received at 11.9123
  2040. group of size 7 leaves
  2041. event received at 11.9204
  2042. group of size 7 arrives
  2043. take chairs, schedule order
  2044. event received at 12.3266
  2045. group of size 7 arrives
  2046. finds no chairs, leave
  2047. event received at 13.1723
  2048. group of size 7 arrives
  2049. finds no chairs, leave
  2050. event received at 13.6961
  2051. group of size 7 arrives
  2052. finds no chairs, leave
  2053. event received at 13.7641
  2054. group of size 7 arrives
  2055. finds no chairs, leave
  2056. event received at 13.9204
  2057. group of size 7 orders 7 scoops
  2058. event received at 13.9499
  2059. group of size 7 orders 9 scoops
  2060. event received at 14.3689
  2061. group of size 7 arrives
  2062. finds no chairs, leave
  2063. event received at 14.3911
  2064. group of size 7 arrives
  2065. finds no chairs, leave
  2066. event received at 16.9499
  2067. group of size 7 leaves
  2068. event received at 17.9204
  2069. group of size 7 leaves
  2070. profits are 7.82
  2071. Main
  2072.     
  2073.  
  2074. End
  2075. echo unbundling super.out 1>&2
  2076. cat >super.out <<'End'
  2077. Little Smalltalk
  2078.     1
  2079. 1
  2080. 2
  2081. 2
  2082. 2
  2083. 4
  2084. 2
  2085. 4
  2086. 2
  2087. 2
  2088. Main
  2089.     
  2090.  
  2091. End
  2092.