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

  1. : To unbundle, sh this file
  2. echo unbundling Makefile 1>&2
  3. cat >Makefile <<'End'
  4. .SUFFIXES : .st .p
  5. PREPATH = /userfs3/abc/budd/newst/prelude
  6. BINDIR = ../bin
  7.  
  8. PARSED = class.p object.p \
  9. string.p larray.p nil.p array.p\
  10. boolean.p true.p false.p block.p symbol.p \
  11. magnitude.p number.p integer.p char.p float.p radian.p point.p random.p \
  12. collection.p bag.p set.p kcollection.p dictionary.p scollection.p interval.p \
  13. list.p acollection.p file.p bytearray.p \
  14. semaphore.p process.p smalltalk.p
  15.  
  16. .st.p:
  17.     $(BINDIR)/parse $(PREPATH)/$*.st >$*.p
  18.  
  19. install: standard
  20.     -make fastsave
  21.  
  22. bundle: *.st Makefile savescript
  23.     bundle Makefile savescript init *.st >../prelude.bundle
  24.  
  25. standard: $(PARSED)
  26.     cat $(PARSED) init >standard
  27.  
  28. newstd: $(PARSED)
  29.     cat $(PARSED) >newstd
  30.  
  31. fastsave: standard
  32.     $(BINDIR)/st -m <savescript
  33.  
  34. clean:
  35.     -rm *.p
  36.  
  37. # the following are libraries that can be included using the -g switch
  38. #    or using the )g directive
  39.  
  40. #  form - simple ascii graphics using the curses routines
  41. form: form.p
  42.     mv form.p form
  43.  
  44. #  pen - line drawing with the plot(3) routines
  45. pen: pen.p
  46.     mv pen.p pen
  47. End
  48. echo unbundling savescript 1>&2
  49. cat >savescript <<'End'
  50. )s stdsave
  51. End
  52. echo unbundling init 1>&2
  53. cat >init <<'End'
  54. smalltalk new
  55. End
  56. echo unbundling acollection.st 1>&2
  57. cat >acollection.st <<'End'
  58. Class ArrayedCollection :SequenceableCollection
  59. | current |
  60. [
  61.        = anArray                       | i |
  62.                 (self size ~= anArray size) ifTrue: [^ false].
  63.                 i <- 0.
  64.                 self do: [:x | (x ~= (anArray at: (i <- i + 1)))
  65.                                 ifTrue: [^ false]].
  66.         ^ true
  67. |
  68.         at: key ifAbsent: exceptionBlock
  69.         ((key <= 0) or: [key > self size])
  70.             ifTrue: [^ exceptionBlock value].
  71.                 ^ self at: key
  72. |
  73.     coerce: aCollection        | temp |
  74.         temp <- self class new: aCollection size.
  75.         temp replaceFrom: 1 to: aCollection size with: aCollection.
  76.         ^ temp
  77. |
  78.        copyFrom: start to: stop                | size temp |
  79.         size <- stop - start + 1.
  80.         temp <- self class new: size.
  81.         temp replaceFrom: 1 to: size with: self startingAt: start.
  82.         ^ temp
  83. |
  84.         currentKey
  85.                 ^ current
  86. |
  87.     deepCopy        | newobj |
  88.         newobj <- self class new: self size.
  89.         (1 to: self size) do:
  90.             [:i | newobj at: i
  91.                 put: (self at: i) copy ].
  92.         ^ newobj
  93. |
  94.        do: aBlock
  95.                 (1 to: self size)
  96.             do: [:i | current <- i.
  97.                 aBlock value: (self at: i)]
  98. |
  99.        first
  100.                 current <- 1.
  101.                 ^ (current <= self size)
  102.             ifTrue: [ self at: current]
  103. |
  104.     firstKey
  105.         ^ 1
  106. |
  107.     lastKey
  108.         ^ self size
  109. |
  110.     next
  111.                 current <- current + 1.
  112.                 ^ (current <= self size)
  113.             ifTrue: [ self at: current]
  114. |
  115.     padTo: length
  116.         ^ (self size < length)
  117.             ifTrue: [ self ,
  118.                 (self class new: (length - self size) ) ]
  119.             ifFalse: [ self ]
  120. |
  121.     shallowCopy        | newobj |
  122.         newobj <- self class new: self size.
  123.         (1 to: self size) do:
  124.             [:i | newobj at: i
  125.                 put: (self at: i) ].
  126.         ^ newobj
  127. ]
  128. End
  129. echo unbundling array.st 1>&2
  130. cat >array.st <<'End'
  131. Class Array :ArrayedCollection
  132. [
  133.     new: aValue
  134.         ^ <NewArray aValue>
  135. |
  136.     at: aNumber
  137.         ( (aNumber < 1) or: [aNumber > <Size self> ] )
  138.             ifTrue: [ self error: 'index error'. ^nil ].
  139.         ^ <At self aNumber >
  140. |
  141.     at: aNumber put: aValue
  142.         ( (aNumber < 1) or: [aNumber > <Size self> ] )
  143.             ifTrue: [ self error: 'index error'. ^nil ].
  144.         <AtPut self aNumber aValue >.
  145.         ^ aValue
  146. |
  147.     grow: newObject
  148.         ^ <Grow self newObject>
  149. |
  150.     printString        | value i |
  151.         value <- ')'.
  152.         i <- <Size self>.
  153.         [i > 0] whileTrue:
  154.             [ value <- <At self i>  printString ,
  155.                     ' ', value.
  156.                     i <- i - 1].
  157.         ^ '#( ' , value
  158. |
  159.     size
  160.         ^ <Size self>
  161. ]
  162. End
  163. echo unbundling bag.st 1>&2
  164. cat >bag.st <<'End'
  165. Class Bag :Collection
  166. | dict count |
  167. [
  168.         new
  169.                 dict <- Dictionary new
  170.  
  171. |       add: newElement
  172.                 dict at: newElement
  173.                      put: (1 + (dict at: newElement ifAbsent: [0]))
  174.  
  175. |       add: newObj withOccurrences: anInteger
  176.                 anInteger timesRepeat: [ self add: newObj ].
  177.                 ^ newObj
  178.  
  179. |       remove: oldElement ifAbsent: exceptionBlock   | i |
  180.                 i <- dict at: oldElement
  181.                           ifAbsent: [ ^ exceptionBlock value].
  182.                 (1 = i) ifTrue:  [dict removeKey: oldElement]
  183.                         ifFalse: [dict at: oldElement put: i - 1 ]
  184.  
  185. |       size
  186.                 ^ dict inject: 0 into: [:x :y | x + y]
  187.  
  188. |       occurrencesOf: anElement
  189.                 ^ dict at: anElement ifAbsent: [0]
  190.  
  191. |       first
  192.         (count <- dict first) isNil ifTrue: [^ nil].
  193.         count <- count - 1.
  194.         ^ dict currentKey
  195.  
  196. |       next
  197.         [count notNil] whileTrue:
  198.            [ (count > 0)
  199.                 ifTrue: [count <- count - 1. ^ dict currentKey]
  200.             ifFalse: [(count <- dict next) isNil
  201.                     ifTrue: [^ nil] ]].
  202.         ^ nil
  203.  
  204. ]
  205. End
  206. echo unbundling block.st 1>&2
  207. cat >block.st <<'End'
  208. "
  209.     Class Block.
  210.  
  211.     Note how whileTrue: and whileFalse: depend upon the parser
  212.     optimizing the loops into control flow, rather than message
  213.     passing.  If this were not the case, whileTrue: would have to
  214.     be implemented using recursion, as follows:
  215.  
  216.     whileTrue: aBlock
  217.         (self value) ifFalse: [^nil].
  218.         aBlock value.
  219.         ^ self whileTrue: aBlock
  220. "
  221. Class Block
  222. [
  223.     newProcess
  224.         ^ <NewProcess  self>
  225. |
  226.     newProcessWith: argumentArray
  227.         ^ <NewProcess  self argumentArray>
  228. |
  229.     fork
  230.         self newProcess resume.
  231.         ^ nil
  232. |
  233.     forkWith: argumentArray
  234.         (self newProcessWith: argumentArray) resume.
  235.         ^ nil
  236. |
  237.     whileTrue
  238.         ^ [self value ] whileTrue: []
  239. |
  240.     whileTrue: aBlock
  241.         ^ [ self value ] whileTrue: [ aBlock value ]
  242. |
  243.     whileFalse
  244.         ^ [ self value ] whileFalse: []
  245. |
  246.     whileFalse: aBlock
  247.         ^ [ self value ] whileFalse: [ aBlock value ]
  248. |
  249.      value
  250.         <BlockExecute  0>
  251. |
  252.     value: a
  253.         <BlockExecute  1>
  254. |
  255.     value: a value: b
  256.         <BlockExecute  2>
  257. |
  258.     value: a value: b value: c
  259.         <BlockExecute  3>
  260. |
  261.     value: a value: b value: c value: d
  262.         <BlockExecute  4>
  263. |
  264.     value: a value: b value: c value: d value: e
  265.         <BlockExecute  5>
  266. ]
  267. End
  268. echo unbundling boolean.st 1>&2
  269. cat >boolean.st <<'End'
  270. Class Boolean
  271. [
  272.         &    aBoolean
  273.         ^ self and: [aBoolean]
  274.  
  275. |       |    aBoolean
  276.         ^ self or: [aBoolean]
  277.  
  278. |       and: aBlock
  279.         ^ self and: [aBlock value]
  280.  
  281. |       or:  aBlock
  282.         ^ self or: [aBlock value]
  283.  
  284. |    eqv: aBoolean
  285.         ^ self == aBoolean
  286.  
  287. |    xor: aBoolean
  288.         ^ self ~~ aBoolean
  289. ]
  290. End
  291. echo unbundling bytearray.st 1>&2
  292. cat >bytearray.st <<'End'
  293. Class ByteArray :ArrayedCollection
  294. [
  295.     new: size
  296.         ^ <NewByteArray size>
  297. |
  298.     at: index
  299.         ^ <ByteArrayAt self index>
  300. |
  301.     at: index put: value
  302.         <ByteArrayAtPut self index value>
  303. |
  304.     printString    | str |
  305.         str <- '#[ '.
  306.         (1 to: self size)
  307.             do: [:i | str <- str , (self at: i) printString , ' '].
  308.         ^ str , ']'
  309. |
  310.     size
  311.         ^ <ByteArraySize self>
  312. ]
  313.  
  314. End
  315. echo unbundling char.st 1>&2
  316. cat >char.st <<'End'
  317. Class Char :Magnitude
  318. [
  319.     == aChar
  320.         ^ <SameTypeOfObject self aChar>
  321.             ifTrue:  [<CharacterEquality self aChar>]
  322.             ifFalse: [false]
  323. |    < aChar
  324.         ^ <SameTypeOfObject self aChar>
  325.             ifTrue:  [<CharacterLessThan self aChar>]
  326.             ifFalse: [self compareError]
  327. |
  328.     = aChar
  329.         ^ <SameTypeOfObject self aChar>
  330.             ifTrue:  [<CharacterEquality self aChar>]
  331.             ifFalse: [self compareError]
  332. |    > aChar
  333.         ^ <SameTypeOfObject self aChar>
  334.             ifTrue:  [<CharacterGreaterThan self aChar>]
  335.             ifFalse: [self compareError]
  336. |
  337.     asciiValue
  338.         ^ <CharacterToInteger self>
  339. |
  340.     asLowercase
  341.         ^ <IsUpper self>
  342.             ifTrue:  [<ChangeCase self>]
  343.             ifFalse: [self]
  344. |
  345.     asUppercase
  346.         ^ <IsLower self>
  347.             ifTrue:  [<ChangeCase self>]
  348.             ifFalse: [self]
  349. |
  350.     asString
  351.         ^ <CharacterToString self>
  352. |
  353.     compareError
  354.         ^ self error: 'char cannot be compared to non char'
  355. |
  356.     digitValue        | i |
  357.         ((i <- <DigitValue self>) isNil)
  358.             ifTrue: [self error: 'digitValue on nondigit char'].
  359.         ^ i
  360. |
  361.     isAlphaNumeric
  362.         ^ <IsAlnum self>
  363. |
  364.     isDigit
  365.         ^ self between: $0 and: $9
  366. |
  367.     isLetter
  368.         ^ self isLowercase or: [self isUppercase]
  369. |
  370.     isLowercase
  371.         ^ self between: $a and: $z
  372. |
  373.     isSeparator
  374.         ^ <IsSpace self>
  375. |
  376.     isUppercase
  377.         ^ (self between: $A and: $Z)
  378. |
  379.     isVowel
  380.         ^ <IsVowel self>
  381. |
  382.     printString
  383.         ^ '$' , <CharacterToString self>
  384. ]
  385. End
  386. echo unbundling class.st 1>&2
  387. cat >class.st <<'End'
  388. Class Class
  389. [
  390.     edit
  391.         <ClassEdit self>
  392. |
  393.     list
  394.         <ClassList self>
  395. |
  396.      new        | superclass newinstance |
  397.         superclass <- <SuperClass self>.
  398.         <RespondsToNew superclass >
  399.             ifTrue: [newinstance <- superclass new ].
  400.         newinstance <- <ClassNew self newinstance >.
  401.         <RespondsTo self #new >
  402.             ifTrue: [newinstance <- newinstance new].
  403.         ^ newinstance
  404. |
  405.      new: aValue         | superclass newinstance |
  406.         superclass <- <SuperClass self>.
  407.         <RespondsToNew superclass >
  408.             ifTrue: [newinstance <- superclass new ].
  409.         newinstance <- <ClassNew self newinstance >.
  410.         <RespondsTo self #new: >
  411.             ifTrue: [newinstance <- newinstance new: aValue ].
  412.         ^ newinstance
  413. |
  414.      printString
  415.         ^ <ClassName self >
  416. |
  417.     respondsTo
  418.         <PrintMessages self>
  419. |
  420.     respondsTo: aSymbol        | aClass |
  421.         aClass <- self.
  422.         [aClass notNil] whileTrue:
  423.             [ <RespondsTo aClass aSymbol> ifTrue: [ ^ true ].
  424.              aClass <- aClass superClass ].
  425.         ^ false
  426. |
  427.     superClass
  428.         ^ <SuperClass self>
  429.  
  430. |
  431.     variables
  432.         ^ <Variables self>
  433. |
  434.     view
  435.         <ClassView self>
  436. ]
  437. End
  438. echo unbundling collection.st 1>&2
  439. cat >collection.st <<'End'
  440. Class Collection
  441. [
  442.         addAll: aCollection
  443.                 aCollection do: [:x | self add: x ]
  444.  
  445. |
  446.     asArray
  447.         ^ Array new: self size ;
  448.             replaceFrom: 1 to: self size with: self
  449. |
  450.     asBag
  451.                 ^ Bag new addAll: self
  452. |
  453.     asSet
  454.                 ^ Set new addAll: self
  455. |
  456.     asList
  457.                 ^ List new addAllLast: self
  458. |
  459.     asString
  460.         ^ String new: self size ;
  461.             replaceFrom: 1 to: self size with: self
  462. |
  463.     coerce: aCollection    | newobj |
  464.         newobj <- self class new.
  465.         aCollection do: [:x | newobj add: x].
  466.         ^ newobj
  467. |
  468.     collect: aBlock
  469.         ^ self inject: self class new
  470.                into: [:x :y | x add: (aBlock value: y). x ]
  471. |
  472.     deepCopy        | newobj |
  473.         newobj <- List new .
  474.         self do: [:x | newobj addLast: x copy ].
  475.         ^ self coerce: newobj
  476. |
  477.     detect: aBlock
  478.         ^ self detect: aBlock
  479.         ifAbsent: [self error: 'no object found matching detect']
  480.  
  481. |
  482.         detect: aBlock ifAbsent: exceptionBlock
  483.                 self do: [:x |
  484.                           (aBlock value: x) ifTrue: [^ x]].
  485.                 ^ exceptionBlock value
  486. |
  487.      first
  488.         ^ self error: 'subclass should implement first'
  489. |
  490.         includes: anObject
  491.         self do: [:x | (x == anObject) ifTrue: [^ true]].
  492.         ^ false
  493. |
  494.         inject: thisValue into: binaryBlock     | last |
  495.                 last <- thisValue.
  496.                 self do: [:x | last <- binaryBlock value: last value: x].
  497.                 ^ last
  498. |
  499.         isEmpty
  500.                 ^ (self size = 0)
  501. |
  502.     occurrencesOf: anObject
  503.         ^ self inject: 0
  504.                        into: [:x :y | (y = anObject)
  505.                                          ifTrue: [x + 1]
  506.                                          ifFalse: [x] ]
  507. |
  508.     printString
  509.         ^ ( self inject: self class printString , ' ('
  510.              into: [:x :y | x , ' ' , y printString]), ' )'
  511. |
  512.     reject: aBlock
  513.         ^ self select: [:x | (aBlock value: x) not ]
  514. |
  515.         remove: oldObject
  516.                 self remove: oldObject ifAbsent:
  517.                   [^ self error:
  518.             'attempt to remove object not found in collection' ].
  519.                 ^ oldObject
  520. |
  521.     remove: oldObject ifAbsent: exceptionBlock
  522.         ^ (self includes: oldObject)
  523.             ifTrue: [self remove: oldObject]
  524.             ifFalse: exceptionBlock
  525. |
  526.     select: aBlock
  527.         ^ self inject: self class new
  528.                into: [:x :y | (aBlock value: y)
  529.                                         ifTrue: [x add: y]. x]
  530. |
  531.     shallowCopy        | newobj |
  532.         newobj <- List new .
  533.         self do: [:x | newobj addLast: x].
  534.         ^ self coerce: newobj
  535. |
  536.     size        | i |
  537.         i <- 0.
  538.         self do: [:x | i <- i + 1 ].
  539.         ^ i
  540. ]
  541. End
  542. echo unbundling dictionary.st 1>&2
  543. cat >dictionary.st <<'End'
  544. "
  545.     Dictionarys are implemented using Points in order to reduce
  546.     the number of classes in the standard prelude
  547.  
  548.     this also has the advantage of making the output appear in
  549.         key @ value
  550.     form
  551. "
  552. Class Dictionary :KeyedCollection
  553. | hashTable currentBucket currentList |
  554. [
  555.     new
  556.         hashTable <- Array new: 17
  557. |
  558.     hashNumber: aKey
  559.         ^ ( <HashNumber aKey> \\ hashTable size) + 1
  560. |
  561.     getList: aKey            | list bucketNumber |
  562.         bucketNumber <- self hashNumber: aKey.
  563.         list <- hashTable at: bucketNumber.
  564.         (list isNil)
  565.             ifTrue: [list <- List new.
  566.                  hashTable at: bucketNumber put: list].
  567.         ^ list
  568.  
  569. |
  570.     at: aKey put: anObject            | list anAssoc |
  571.  
  572.         list <- self getList: aKey.
  573.         anAssoc <- self findAssociation: aKey inList: list.
  574.         (anAssoc isNil)
  575.             ifTrue:  [anAssoc <- (Point new x: aKey) y: anObject.
  576.                   list add: anAssoc]
  577.             ifFalse: [anAssoc y: anObject].
  578.         ^ anObject
  579. |
  580.     at: aKey ifAbsent: exceptionBlock    | list anAssoc |
  581.  
  582.         list <- self getList: aKey.
  583.         anAssoc <- self findAssociation: aKey inList: list.
  584.         (anAssoc isNil)
  585.             ifTrue: [^ exceptionBlock value].
  586.         ^ anAssoc y
  587. |
  588.     removeKey: aKey ifAbsent: exceptionBlock     | list anAssoc|
  589.         
  590.         list <- self getList: aKey.
  591.         anAssoc <- self findAssociation: aKey inList: list.
  592.         (anAssoc isNil)
  593.             ifTrue: [^ exceptionBlock value].
  594.         ^ ( list remove: anAssoc
  595.              ifAbsent: [ ^ exceptionBlock value ] ) y
  596. |
  597.     findAssociation: aKey inList: linkedList
  598.  
  599.         linkedList do:
  600.             [:item | (item x = aKey) ifTrue: [^ item]].
  601.         ^ nil
  602. |
  603.     first                | item |
  604.  
  605.         (1 to: 17) do:
  606.             [:i | ((item <- self checkBucket: i) notNil)
  607.                         ifTrue: [ ^ item y] ] .
  608.         ^ nil
  609. |
  610.     next                | item |
  611.  
  612.         ((item <- currentList next) notNil)
  613.             ifTrue: [ ^ item y ].
  614.         [currentBucket < 17] whileTrue:
  615.             [currentBucket <- currentBucket + 1.
  616.              ((item <- self checkBucket: currentBucket) notNil)
  617.                 ifTrue: [ ^ item y ] ].
  618.         ^ nil
  619. |
  620.     printString
  621.         ^ (self inject: (self class printString) , ' ( '
  622.             into: [ :aString :aValue |
  623.                 aString , self currentKey printString ,
  624.                     ' @ ' , aValue printString , ' ' ]
  625.             ) , ')'
  626. |
  627.     currentKey    | clist|
  628.         ^ (currentList notNil)
  629.             ifTrue: [clist <- currentList current.
  630.                  (clist notNil) ifTrue: [clist x]
  631.                     ]
  632. |
  633.     checkBucket: bucketNumber
  634.  
  635.         ((currentList <- hashTable at:
  636.                 (currentBucket <- bucketNumber)) isNil)
  637.             ifTrue: [ ^ nil ].
  638.         ^ currentList first
  639. ]
  640. End
  641. echo unbundling false.st 1>&2
  642. cat >false.st <<'End'
  643. Class False :Boolean
  644. [
  645.         ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
  646.                 ^ falseAlternativeBlock value
  647.  
  648. !       ifFalse: falseAlternativeBlock ifTrue: trueAlternativeBlock
  649.                 ^ falseAlternativeBlock value
  650.  
  651. !       ifTrue: trueAlternativeBlock
  652.                 ^ nil
  653.  
  654. !       ifFalse: falseAlternativeBlock
  655.                 ^ falseAlternativeBlock value
  656.  
  657. !       not
  658.                 ^ true
  659. ]
  660. End
  661. echo unbundling file.st 1>&2
  662. cat >file.st <<'End'
  663. Class File :SequenceableCollection
  664. [
  665.     modeCharacter
  666.         <FileSetMode self 0>
  667. |
  668.     modeInteger
  669.         <FileSetMode self 2>
  670. |
  671.     modeString
  672.         <FileSetMode self 1>
  673. |
  674.     at: aPosition
  675.         <FileSetPosition self aPosition>.
  676.         ^ self read
  677. |
  678.     at: aPosition put: anObject
  679.         <FileSetPosition self aPosition>.
  680.         ^ self write: anObject
  681. |
  682.     currentKey
  683.         ^ <FileFindPosition self>
  684. |
  685.     first
  686.         ^ self at: 0
  687. |
  688.     next
  689.         ^ self read
  690. |
  691.     open: aName
  692.         <FileOpen self aName 'r' >
  693. |
  694.     open: aName for: opType
  695.         <FileOpen self aName opType >
  696. |
  697.     read
  698.         ^ <FileRead self>
  699. |
  700.     size
  701.         ^ <FileSize self>
  702. |
  703.     write: anObject
  704.         ^ <FileWrite self anObject>
  705. ]
  706. End
  707. echo unbundling float.st 1>&2
  708. cat >float.st <<'End'
  709. Class Float :Number
  710. [
  711.     = aNumber
  712.         ^ <SameTypeOfObject self aNumber>
  713.             ifTrue:  [<FloatEquality self aNumber>]
  714.             ifFalse: [super = aNumber]
  715. |
  716.     < aNumber
  717.         ^ <SameTypeOfObject self aNumber>
  718.             ifTrue:  [<FloatLessThan self aNumber>]
  719.             ifFalse: [super < aNumber]
  720. |
  721.     > aNumber
  722.         ^ <SameTypeOfObject self aNumber>
  723.             ifTrue:  [<FloatGreaterThan self aNumber>]
  724.             ifFalse: [ super > aNumber]
  725. |
  726.     + aNumber
  727.         ^ <SameTypeOfObject self aNumber>
  728.             ifTrue:  [<FloatAddition self aNumber>]
  729.             ifFalse: [super + aNumber]
  730. |
  731.     - aNumber
  732.         ^ <SameTypeOfObject self aNumber>
  733.             ifTrue:  [<FloatSubtraction self aNumber>]
  734.             ifFalse: [super - aNumber]
  735. |
  736.     * aNumber
  737.         ^ <SameTypeOfObject self aNumber>
  738.             ifTrue:  [<FloatMultiplication self aNumber>]
  739.             ifFalse: [super * aNumber]
  740. |
  741.     / aNumber
  742.         ^ <SameTypeOfObject self aNumber>
  743.             ifTrue:  [<FloatDivision self aNumber>]
  744.             ifFalse: [super / aNumber]
  745. |
  746.     ^ aNumber
  747.         ^ <SameTypeOfObject self aNumber>
  748.             ifTrue:  [<Power self aNumber>]
  749.             ifFalse: [super raisedTo: aNumber]
  750. |
  751.     arcCos
  752.         ^ Radian new: <ArcCos self>
  753. |
  754.     arcSin
  755.         ^ Radian new: <ArcSin self>
  756. |
  757.     arcTan
  758.         ^ Radian new: <ArcTan self>
  759. |
  760.     asFloat
  761.         ^ self
  762. |
  763.     asString
  764.         ^ <FloatToString self>
  765. |
  766.     ceiling
  767.         ^ <Ceiling self>
  768. |
  769.     coerce: aNumber
  770.         ^ aNumber asFloat
  771. |
  772.     exp
  773.         ^ <Exponent self>
  774. |
  775.     floor
  776.         ^ <Floor self>
  777. |
  778.     fractionPart
  779.         ^ <FractionalPart self>
  780. |
  781.     gamma
  782.         ^ <Gamma self>
  783. |
  784.     integerPart
  785.         ^ <IntegerPart self>
  786. |
  787.     ln
  788.         ^ <Log self>
  789. |
  790.     radix: aNumber
  791.         ^ <FloatRadixPrint self aNumber>
  792. |
  793.     rounded
  794.         ^ <Floor (self + 0.5)>
  795. |
  796.     sqrt
  797.         ^ <SquareRoot self>
  798. |
  799.     truncated
  800.         ^ (self < 0.0)  ifTrue:  [<Ceiling self>]
  801.                 ifFalse: [<Floor self>]
  802. ]
  803. End
  804. echo unbundling form.st 1>&2
  805. cat >form.st <<'End'
  806. Class Form
  807. | text |
  808. [
  809.     new
  810.         text <- Array new: 0
  811. |
  812.     clipFrom: upperLeft to: lowerRight    
  813.         | newForm newRow rsize left top rText |
  814.  
  815.         left <- upperLeft y - 1.  " left hand side"
  816.         top <- upperLeft x - 1.
  817.         rsize <- lowerRight y - left.
  818.         newForm <- Form new.
  819.         (upperLeft x to: lowerRight x) do: [:i |
  820.             newRow <- String new: rsize.
  821.             rText <- self row: i.
  822.             (1 to: rsize) do: [:j |
  823.                 newRow at: j
  824.                     put: (rText at: (left + j)
  825.                         ifAbsent: [$ ])].
  826.             newForm row: (i - top) put: newRow ].
  827.         ^ newForm
  828. |
  829.     columns
  830.         ^ text inject: 0 into: [:x :y | x max: y size ]
  831. |
  832.     display
  833.         smalltalk clearScreen.
  834.         self printAt: 1 @ 1.
  835.         '  ' printAt: 20 @ 0
  836. |
  837.     eraseAt: aPoint        | location |
  838.         location <- aPoint copy.
  839.         text do: [:x | (String new: (x size)) printAt: location.
  840.                 location x: (location x + 1) ]
  841. |
  842.     extent
  843.         ^ self rows @ self columns
  844. |
  845.     first
  846.         ^ text first
  847. |
  848.     next
  849.         ^ text next
  850. |
  851.     overLayForm: sourceForm at: startingPoint
  852.         | newRowNumber rowText left rowSize |
  853.  
  854.         newRowNumber <- startingPoint x.
  855.         left <- startingPoint y - 1.
  856.         sourceForm do: [:sourceRow |
  857.             rowText <- self row: newRowNumber.
  858.             rowSize <- sourceRow size.
  859.             rowText <- rowText padTo: (left + rowSize).
  860.             (1 to: rowSize) do: [:i |
  861.                 ((sourceRow at: i) ~= $ )
  862.                 ifTrue: [ rowText at: (left + i)
  863.                         put: (sourceRow at: i)]].
  864.             self row: newRowNumber put: rowText.
  865.             newRowNumber <- newRowNumber + 1]
  866. |
  867.     placeForm: sourceForm at: startingPoint
  868.         | newRowNumber rowText left rowSize |
  869.  
  870.         newRowNumber <- startingPoint x.
  871.         left <- startingPoint y - 1.
  872.         sourceForm do: [:sourceRow |
  873.             rowText <- self row: newRowNumber.
  874.             rowSize <- sourceRow size.
  875.             rowText <- rowText padTo: (left + rowSize).
  876.             (1 to: rowSize) do: [:i |
  877.                 rowText at: (left + i)
  878.                     put: (sourceRow at: i)].
  879.             self row: newRowNumber put: rowText.
  880.             newRowNumber <- newRowNumber + 1]
  881. |
  882.     reversed        | newForm columns newRow |
  883.         columns <- self columns.
  884.         newForm <- Form new.
  885.         (1 to: self rows) do: [:i |
  886.             newRow <- text at: i.
  887.             newRow <- newRow ,
  888.                 (String new: (columns - newRow size)).
  889.             newForm row: i put: newRow reversed ].
  890.         ^ newForm
  891.  
  892. |
  893.     rotated            | newForm rows newRow |
  894.         rows <- self rows.
  895.         newForm <- Form new.
  896.         (1 to: self columns) do: [:i |
  897.             newRow <- String new: rows.
  898.             (1 to: rows) do: [:j |
  899.                 newRow at: ((rows - j) + 1)
  900.                     put: ((text at: j)
  901.                         at: i ifAbsent: [$ ])].
  902.             newForm row: i put: newRow ].
  903.         ^ newForm
  904. |
  905.     row: index
  906.         ^ text at: index ifAbsent: ['']
  907. |
  908.     row: index put: aString
  909.         (index > text size)
  910.             ifTrue: [ [text size < index] whileTrue:
  911.                     [text <- text grow: ''] ].
  912.         text at: index put: aString
  913. |
  914.     rows
  915.         ^ text size
  916. |
  917.     printAt: aPoint        | location |
  918.         location <- aPoint copy.
  919.         text do: [:x | x printAt: location.
  920.                 location x: (location x + 1) ]
  921. ]
  922. End
  923. echo unbundling integer.st 1>&2
  924. cat >integer.st <<'End'
  925. Class Integer :Number
  926. [
  927.     = aNumber
  928.         ^ <SameTypeOfObject self aNumber>
  929.             ifTrue:  [ <IntegerEquality self aNumber> ]
  930.             ifFalse: [ super = aNumber ]
  931. |
  932.     > aNumber
  933.         ^ <SameTypeOfObject self aNumber>
  934.             ifTrue:  [ <IntegerGreaterThan self aNumber> ]
  935.             ifFalse: [ super > aNumber ]
  936. |
  937.     < aNumber
  938.         ^ <SameTypeOfObject self aNumber>
  939.             ifTrue:  [ <IntegerLessThan self aNumber> ]
  940.             ifFalse: [ super < aNumber ]
  941. |
  942.     + aNumber
  943.         ^ <SameTypeOfObject self aNumber>
  944.             ifTrue:  [ <IntegerAddition self aNumber> ]
  945.             ifFalse: [ super + aNumber ]
  946. |
  947.     - aNumber
  948.         ^ <SameTypeOfObject self aNumber>
  949.             ifTrue:  [<IntegerSubtraction self aNumber>]
  950.             ifFalse: [ super - aNumber ]
  951. |
  952.     * aNumber
  953.         ^ <SameTypeOfObject self aNumber>
  954.             ifTrue:  [<IntegerMultiplication self aNumber>]
  955.             ifFalse: [ super * aNumber ]
  956. |
  957.     / aNumber
  958.         ^ self asFloat / aNumber
  959. |
  960.     // aNumber
  961.         ^ <SameTypeOfObject self aNumber>
  962.             ifTrue:  [<IntegerSlash self aNumber>]
  963.             ifFalse: [self opError]
  964. |
  965.     \\ aNumber            | i |
  966.         ^ <SameTypeOfObject self aNumber>
  967.             ifTrue:  [i <- self * ( (self < 0)
  968.                         ifTrue:  [ -1 ]
  969.                         ifFalse: [ 1 ] ).
  970.                   i rem: aNumber]
  971.             ifFalse:  [self opError]
  972. |
  973.     allMask: anInteger
  974.         ^ anInteger = <BitAND self anInteger>
  975. |
  976.     anyMask: anInteger
  977.         ^ 0 ~= <BitAND self anInteger>
  978. |
  979.     asCharacter
  980.         ^ <IntegerToCharacter self>
  981. |
  982.     asFloat
  983.         ^ <IntegerToFloat self >
  984. |
  985.     asInteger
  986.         ^ self
  987. |
  988.     asString
  989.         ^ <IntegerToString self>
  990. |
  991.     bitAnd: anInteger
  992.         ^ <BitAND self anInteger>
  993. |
  994.     bitAt: anInteger
  995.         ^ <BitAt self anInteger>
  996. |
  997.     bitInvert
  998.         ^ <BitInverse self>
  999. |
  1000.     bitOr: anInteger
  1001.         ^ <BitOR self anInteger>
  1002. |
  1003.     bitShift: anInteger
  1004.         ^ <BitShift self anInteger>
  1005. |
  1006.     bitXor: anInteger
  1007.         ^ <BitXOR self anInteger>
  1008. |
  1009.     even
  1010.         ^ (self rem: 2) = 0
  1011. |
  1012.     factorial
  1013.         ^ <Factorial self>
  1014. |
  1015.     gcd: anInteger
  1016.         ^ <SameTypeOfObject self anInteger>
  1017.             ifTrue:  [<GCD self anInteger>]
  1018.             ifFalse: [self opError]
  1019. |
  1020.     highBit
  1021.         ^ <HighBit self>
  1022. |
  1023.     lcm: anInteger
  1024.         ^ <SameTypeOfObject self anInteger>
  1025.             ifTrue:  [self * anInteger quo:
  1026.                     (self gcd: anInteger)]
  1027.             ifFalse: [self opError]
  1028. |
  1029.     noMask: anInteger
  1030.         ^ 0 = (self bitAnd: anInteger)
  1031. |
  1032.     odd
  1033.         ^ (self rem: 2) ~= 0
  1034. |
  1035.     quo: anInteger
  1036.         ^ <SameTypeOfObject self anInteger>
  1037.             ifTrue:  [<IntegerDivision self anInteger>]
  1038.             ifFalse: [self opError]
  1039. |
  1040.     radix: aNumber
  1041.         ^ <RadixPrint self aNumber>
  1042. |
  1043.     rem: anInteger
  1044.         ^ <SameTypeOfObject self anInteger>
  1045.             ifTrue:  [<IntegerMod self anInteger>]
  1046.             ifFalse: [self opError]
  1047. |
  1048.     timesRepeat: aBlock        | i |
  1049.         i <- 0.
  1050.         [i < self] whileTrue:
  1051.             [aBlock value. i <- i + 1]
  1052. ]
  1053. End
  1054. echo unbundling interval.st 1>&2
  1055. cat >interval.st <<'End'
  1056. Class Interval :SequenceableCollection
  1057. | lower upper step current |
  1058. [
  1059.     from: lowerBound to: upperBound by: stepSize
  1060.         current <- lower <- lowerBound.
  1061.         upper <- upperBound.
  1062.         step  <- stepSize
  1063.  
  1064. |    size    
  1065.         ^ ((step strictlyPositive)
  1066.             ifTrue: [upper < lower]
  1067.             ifFalse: [lower < upper] )
  1068.            ifTrue: [ 0 ]
  1069.            ifFalse: [upper - lower // step + 1]
  1070.  
  1071. |    inRange: value
  1072.         ^ (step strictlyPositive)
  1073.             ifTrue: [(value >= lower) and: [value <= upper]]
  1074.             ifFalse: [(value >= upper) and: [value <= lower]]
  1075.  
  1076. |       first
  1077.                 current <- lower.
  1078.         ^ (self inRange: current) ifTrue: [current]
  1079.  
  1080. |       next
  1081.                 current <- current + step.
  1082.         ^ (self inRange: current) ifTrue: [current]
  1083.  
  1084. |    at: index ifAbsent: exceptionBlock    | val |
  1085.         val <- lower + (step * (index - 1)).
  1086.         ^ (self inRange: val)
  1087.            ifTrue: [ val ]
  1088.            ifFalse: [exceptionBlock value]
  1089.  
  1090. |    printString
  1091.         ^ 'Interval ', lower printString , ' to ',
  1092.                      upper printString , ' by ' , step printString
  1093.  
  1094. |    coerce: newcollection
  1095.         ^ newcollection asArray
  1096.  
  1097. |    at: index put: val
  1098.         ^ self error: 'cannot store into Interval'
  1099.  
  1100. |    add: val
  1101.         ^ self error: 'cannot store into Interval'
  1102.  
  1103. |    removeKey: key ifAbsent: exceptionBlock
  1104.         self error: 'cannot remove from Interval'.
  1105.         ^ exceptionBlock value
  1106. |
  1107.     deepCopy
  1108.         ^ lower to: upper by: step
  1109. |    
  1110.     shallowCopy
  1111.         ^ lower to: upper by: step
  1112. ]
  1113. End
  1114. echo unbundling kcollection.st 1>&2
  1115. cat >kcollection.st <<'End'
  1116. Class KeyedCollection :Collection
  1117. [
  1118.     add: anElement
  1119.         ^ self error: 'Must add with explicit key'
  1120. |
  1121.     addAll: aCollection
  1122.                 aCollection binaryDo: [:x :y | self at: x put: y].
  1123.                 ^ aCollection
  1124. |
  1125.     asDictionary            | newCollection |
  1126.         newCollection <- Dictionary new.
  1127.         self binaryDo:
  1128.             [:key :val | newCollection at: key put: val].
  1129.         ^ newCollection
  1130. |
  1131.     at: key
  1132.                 ^ self at: key ifAbsent:
  1133.                    [self error:
  1134.                          (key printString , ': association not found').
  1135.                     ^ key]
  1136. |
  1137.     atAll: aCollection put: anObject
  1138.         aCollection do: [:x | self at: x put: anObject]
  1139. |
  1140.     binaryDo: aBlock                | item |
  1141.         self do: [:x | aBlock value: self currentKey
  1142.                     value: x ].
  1143.                 ^ nil
  1144. |
  1145.     coerce: aCollection    | newobj |
  1146.         newobj <- self class new.
  1147.         aCollection binaryDo: [:x :y | newobj at: x put: y].
  1148.         ^ newobj
  1149. |
  1150.     collect: aBlock
  1151.         ^ self coerce:
  1152.              (self inject: Dictionary new
  1153.                            into: [:x :y | x at: self currentKey
  1154.                         put: (aBlock value: y) . x ] )
  1155. |
  1156.     includesKey: key
  1157.                 self at: key ifAbsent: [^ false].
  1158.                 ^ true
  1159. |
  1160.     indexOf: anElement
  1161.         ^ self indexOf: anElement
  1162.         ifAbsent: [self error: 'indexOf element not found']
  1163. |
  1164.     indexOf: anElement ifAbsent: exceptionBlock
  1165.                 self do: [:x | (x = anElement)
  1166.                     ifTrue: [ ^ self currentKey ]].
  1167.                  ^ exceptionBlock value
  1168. |
  1169.     keys                             | newset |
  1170.                 newset <- Set new.
  1171.                 self keysDo: [:x | newset add: x].
  1172.                 ^ newset
  1173. |
  1174.     keysDo: aBlock
  1175.                 ^ self do: [ :x | aBlock value: self currentKey ]
  1176. |
  1177.     keysSelect: aBlock
  1178.         ^ self coerce:
  1179.              (self inject: Dictionary new
  1180.                            into: [:x :y | (aBlock value: y currentKey)
  1181.                                            ifTrue: [x at: self currentKey
  1182.                                                       put: y]. x ] )
  1183. |
  1184.     remove: anElement
  1185.         ^ self error: 'object must be removed with explicit key'
  1186. |
  1187.     removeKey: key
  1188.                 ^ self removeKey: key ifAbsent:
  1189.                    [self error: 'no element associated with key'. ^ key]
  1190. |
  1191.     removeKey: key ifAbsent: exceptionBlock
  1192.         ^ self error: 'subclass should implement RemoveKey:ifAbsent:'
  1193. |
  1194.     select: aBlock
  1195.         ^ self coerce:
  1196.              (self inject: Dictionary new
  1197.                            into: [:x :y | (aBlock value: y)
  1198.                                            ifTrue: [x at: self currentKey
  1199.                                                       put: y]. x ] )
  1200. |
  1201.     values                           | newbag |
  1202.                 newbag <- Bag new.
  1203.                 self do: [:x | newbag add: x].
  1204.                 ^ newbag
  1205. ]
  1206. End
  1207. echo unbundling larray.st 1>&2
  1208. cat >larray.st <<'End'
  1209. Class ArrayedCollection
  1210. " This is just a null version of ArrayedCollection to serve as a place
  1211. holder until the real version is read in during the prelude "
  1212. [
  1213.     nothing
  1214.         1
  1215. ]
  1216.  
  1217. End
  1218. echo unbundling list.st 1>&2
  1219. cat >list.st <<'End'
  1220. "
  1221.     Lists are implemented using Points in order to
  1222.     reduce the number of classes in the standard prelude
  1223. "
  1224. Class List :SequenceableCollection
  1225. | first current |
  1226. [
  1227.     add: anItem
  1228.         first <- (Point new x: anItem ) y: first .
  1229.         ^ anItem
  1230. |
  1231.     addFirst: anItem
  1232.         first <- (Point new x: anItem ) y: first .
  1233.         ^ anItem
  1234. |
  1235.     addLast: anItem
  1236.         (first isNil)
  1237.             ifTrue: [^ self addFirst: anItem].
  1238.         (self findLast) y: ((Point new x: anItem) y: nil).
  1239.         ^ anItem
  1240. |
  1241.     addAllFirst: aCollection
  1242.         aCollection do: [:x | self addFirst: x]
  1243. |    
  1244.     addAllLast: aCollection
  1245.         aCollection do: [:x | self addLast: x]
  1246. |
  1247.     coerce: aCollection        | newList |
  1248.         newList <- List new.
  1249.         aCollection do: [:x | newList addLast: x].
  1250.         ^ newList
  1251. |
  1252.     findLast        | item |
  1253.         ((item <- first) isNil)
  1254.             ifTrue: [^ nil].
  1255.         [(item y) notNil]
  1256.             whileTrue: [item <- item y].
  1257.         ^ item
  1258. |
  1259.     remove: anItem
  1260.         ^ self remove: anItem
  1261.             ifAbsent: [self error: 'cant find item']
  1262. |
  1263.     remove: anItem ifAbsent: exceptionBlock
  1264.         (first isNil)
  1265.             ifTrue: [^ exceptionBlock value].
  1266.         self inject: nil into: [:prev :current |
  1267.             (current x == anItem)
  1268.                 ifTrue: [(prev isNil)
  1269.                         ifTrue: [first <- current y]
  1270.                         ifFalse: [prev y: (current y)].
  1271.                      ^ anItem].
  1272.             current ] .
  1273.         ^ exceptionBlock value
  1274. |
  1275.     removeError
  1276.         ^ self error: 'cannot remove from an empty list'
  1277. |
  1278.     removeFirst    | item |
  1279.         (first isNil)
  1280.             ifTrue: [^ self removeError].
  1281.         item <- first.
  1282.         first <- first y.
  1283.         ^ item x
  1284. |
  1285.     removeLast
  1286.         (first isNil)
  1287.             ifTrue: [^ self removeError].
  1288.         ^ self remove: self last
  1289.             ifAbsent: [self removeError]
  1290. |
  1291.     first
  1292.         ^ ((current <- first) notNil)
  1293.             ifTrue: [ current x ]
  1294. |
  1295.     next
  1296.         ^ ((current <- current y) notNil)
  1297.             ifTrue: [ current x ]
  1298. |
  1299.     current
  1300.         ^ current x
  1301. |
  1302.     last
  1303.         (first isNil)
  1304.             ifTrue: [^ nil].
  1305.         ^ self findLast x
  1306. |
  1307.     isEmpty
  1308.         ^ first == nil
  1309. ]
  1310. End
  1311. echo unbundling magnitude.st 1>&2
  1312. cat >magnitude.st <<'End'
  1313. Class Magnitude
  1314. [
  1315.     <= arg
  1316.         ^ (self < arg) or: [self = arg]
  1317.  
  1318. |    < arg
  1319.         ^ (arg > self)
  1320.  
  1321. |    = arg
  1322.         ^ (self > arg or: [self < arg]) not
  1323.  
  1324. |    ~= arg
  1325.         ^ (self = arg) not
  1326.  
  1327. |    >= arg
  1328.         ^ (self > arg) or: [self = arg]
  1329.  
  1330. |    > arg
  1331.         ^ arg < self
  1332.  
  1333. |    between: low and: high
  1334.         ^ (self >= low) and: [self <= high]
  1335.  
  1336. |    min: arg
  1337.         ^ (self < arg) ifTrue: [self] ifFalse: [arg]
  1338.  
  1339. |    max: arg
  1340.         ^ (self > arg) ifTrue: [self] ifFalse: [arg]
  1341. ]
  1342. End
  1343. echo unbundling nil.st 1>&2
  1344. cat >nil.st <<'End'
  1345. Class UndefinedObject
  1346. [
  1347.         isNil
  1348.                 ^ true
  1349. |
  1350.         notNil
  1351.                 ^ false
  1352. |
  1353.         printString
  1354.                 ^ 'nil'
  1355. ]
  1356. End
  1357. echo unbundling number.st 1>&2
  1358. cat >number.st <<'End'
  1359. Class Number :Magnitude
  1360. [
  1361.     maxtype: aNumber
  1362.         ^ <GeneralityTest self aNumber>
  1363.             ifTrue:  [self]
  1364.             ifFalse: [aNumber coerce: self ]
  1365. |
  1366.     = aNumber
  1367.         ^ (self maxtype: aNumber) = (aNumber maxtype: self)
  1368. |
  1369.     < aNumber
  1370.         ^ (self maxtype: aNumber) < (aNumber maxtype: self)
  1371. |
  1372.     > aNumber
  1373.         ^ (self maxtype: aNumber) > (aNumber maxtype: self)
  1374. |
  1375.     + aNumber
  1376.         ^ (self maxtype: aNumber) + (aNumber maxtype: self)
  1377. |
  1378.     - aNumber
  1379.         ^ (self maxtype: aNumber) - (aNumber maxtype: self)
  1380. |
  1381.     * aNumber
  1382.         ^ (self maxtype: aNumber) * (aNumber maxtype: self)
  1383. |
  1384.     / aNumber
  1385.         ^ (self maxtype: aNumber) / (aNumber maxtype: self)
  1386. |
  1387.     ^ aNumber
  1388.         ^ self asFloat ^ aNumber asFloat
  1389. |
  1390.     @ aNumber
  1391.         ^ ( Point new x: self ) y: aNumber
  1392. |
  1393.     abs
  1394.         ^ (self < 0)
  1395.             ifTrue:  [ 0 - self ]
  1396.             ifFalse: [ self ]
  1397. |
  1398.     exp
  1399.         ^ self asFloat exp
  1400. |
  1401.     gamma
  1402.         ^ self asFloat gamma
  1403. |
  1404.     ln
  1405.         ^ self asFloat ln
  1406. |
  1407.     log: aNumber
  1408.         ^ self ln / aNumber ln
  1409. |
  1410.     negated
  1411.         ^ 0 - self
  1412. |
  1413.     negative
  1414.         ^ self < 0
  1415. |
  1416.     pi
  1417.         ^ self * 3.1415926
  1418. |
  1419.     positive
  1420.         ^ self >= 0
  1421. |
  1422.     radians
  1423.         ^ Radian new: self asFloat
  1424. |
  1425.     raisedTo: aNumber
  1426.         ^ self asFloat ^ aNumber asFloat
  1427. |
  1428.     reciprocal
  1429.         ^ 1.00 / self
  1430. |
  1431.     roundTo: aNumber
  1432.         ^ (self / aNumber) rounded * aNumber
  1433. |
  1434.     sign
  1435.         ^ (self < 0)
  1436.             ifTrue: [ -1 ]
  1437.             ifFalse: [ (self > 0)
  1438.                     ifTrue: [ 1 ]
  1439.                     ifFalse: [ 0 ] ]
  1440. |
  1441.     sqrt
  1442.         ^ self asFloat sqrt
  1443. |
  1444.     squared
  1445.         ^ self * self
  1446. |
  1447.     strictlyPositive
  1448.         ^ self > 0
  1449. |
  1450.     to: highValue
  1451.         ^ Interval new ; from: self to: highValue by: 1
  1452. |
  1453.     to: highValue by: stepSize
  1454.         ^ Interval new ; from: self to: highValue by: stepSize
  1455. |
  1456.     truncateTo: aNumber
  1457.         ^ (self / aNumber) truncated * aNumber
  1458. ]
  1459. End
  1460. echo unbundling object.st 1>&2
  1461. cat >object.st <<'End'
  1462. Class Object
  1463. [
  1464.      == anObject
  1465.         ^ <Equality self anObject >
  1466. |
  1467.        ~~ x
  1468.                 ^ (self == x) not
  1469. |
  1470.      = x
  1471.         ^ (self == x)
  1472. |
  1473.      ~= x
  1474.         ^ (self = x) not
  1475. |
  1476.      asString
  1477.         ^ self class printString
  1478. |
  1479.         asSymbol
  1480.                 ^ self asString asSymbol
  1481. |
  1482.     class
  1483.         ^ <Class self >
  1484. |
  1485.         copy
  1486.                 ^ self shallowCopy
  1487. |
  1488.         deepCopy        | size newobj |
  1489.         size <- <Size self>.
  1490.         (size < 0)
  1491.             ifTrue: [^ self] "if special just copy object"
  1492.             ifFalse: [ newobj <- self class new.
  1493.             (1 to: size) do: [:i |
  1494.                 <AtPut newobj i
  1495.                     ( <At self i > copy ) > ].
  1496.                 ^ newobj ]
  1497. |
  1498.      do: aBlock            | item |
  1499.         item <- self first.
  1500.         ^ [item notNil] whileTrue:
  1501.             [aBlock value: item.  item <- self next]
  1502. |
  1503.     error: aString
  1504.         <Error aString self>
  1505. |
  1506.         first
  1507.                 ^ self
  1508. |
  1509.         isKindOf: aClass                | objectClass |
  1510.                 objectClass <- self class.
  1511.                 [objectClass notNil] whileTrue:
  1512.                         [(objectClass == aClass) ifTrue: [^ true].
  1513.                          objectClass <- objectClass superClass].
  1514.                 ^ false
  1515. |
  1516.         isMemberOf: aClass
  1517.                 ^ aClass == self class
  1518.  
  1519. |
  1520.         isNil
  1521.                 ^ false
  1522. |
  1523.         next
  1524.                 ^ nil
  1525. |
  1526.         notNil
  1527.                 ^ true
  1528. |
  1529.      print
  1530.         <PrintWithReturn (self printString) >
  1531. |
  1532.      printString
  1533.         ^ self asString
  1534.  
  1535. |       respondsTo: cmd
  1536.                 ^ self class respondsTo: cmd
  1537.  
  1538. |       shallowCopy        | size newobj |
  1539.         size <- <Size self>.
  1540.         (size < 0)
  1541.             ifTrue: [^ self] "if special just copy object"
  1542.             ifFalse: [ newobj <- self class new.
  1543.                 (1 to: size) do: [:i |
  1544.                     <AtPut newobj i
  1545.                         <At self i > > ].
  1546.                     ^ newobj ]
  1547. ]
  1548. End
  1549. echo unbundling pen.st 1>&2
  1550. cat >pen.st <<'End'
  1551. "
  1552.     the following use the primitives interfacing to the plot(3)
  1553.     routines
  1554. "
  1555.  
  1556. " pen - a simple drawing instrument "
  1557. Class Pen
  1558. | x y up direction |
  1559. [
  1560.     new
  1561.         self up.
  1562.         self direction: 0.0.
  1563.         self goTo: 100 @ 100.
  1564. |
  1565.     circleRadius: rad
  1566.         <primitive 174 x y rad>
  1567. |
  1568.     direction
  1569.         ^ direction
  1570. |
  1571.     direction: radians
  1572.         direction <- radians
  1573. |
  1574.     down
  1575.         up <- false.
  1576. |
  1577.     erase    
  1578.         <primitive 170>
  1579. |
  1580.     extent: lowerLeft to: upperRight
  1581.         <primitive 176 (lowerLeft x) (lowerLeft y)
  1582.             (upperRight x) (upperRight y)>
  1583. |
  1584.     go: anAmount        | newx newy |
  1585.         newx <- (direction radians sin * anAmount) rounded + x.
  1586.         newy <- (direction radians cos * anAmount) rounded + y.
  1587.         self goTo: newx @ newy
  1588. |
  1589.     goTo: aPoint
  1590.         up ifFalse: [<primitive 177 x y (aPoint x) (aPoint y)>].
  1591.         x <- aPoint x.
  1592.         y <- aPoint y.
  1593. |
  1594.     isUp
  1595.         ^ up
  1596. |
  1597.     location
  1598.         ^ x @ y
  1599. |
  1600.     turn: radians
  1601.         direction <- direction + radians
  1602. |
  1603.     up
  1604.         up <- true.
  1605. ]
  1606.  
  1607. " penSave - a way to save the drawings made by a pen "
  1608. Class PenSave    :Pen
  1609. | saveForm |
  1610. [
  1611.     setForm: aForm
  1612.         saveForm <- aForm
  1613. |
  1614.     goTo: aPoint
  1615.         (self isUp)
  1616.             ifTrue: [ super goTo: aPoint ]
  1617.             ifFalse: [ saveForm add: self location to: aPoint.
  1618.                     self up.
  1619.                     super goTo: aPoint.
  1620.                     self down ]
  1621. ]
  1622.  
  1623. " Form - a collection of lines "
  1624. Class Form
  1625. | lines |
  1626. [
  1627.     new
  1628.         lines <- Bag new
  1629. |
  1630.     add: startingPoint to: endingPoint
  1631.         lines add: ( Point new ;
  1632.                 x: startingPoint ;
  1633.                 y: endingPoint )
  1634. |
  1635.     with: aPen displayAt: location    | xOffset yOffset sPoint ePoint |
  1636.         xOffset <- location x.
  1637.         yOffset <- location y.
  1638.         lines do: [:pair |
  1639.             sPoint <- pair x.
  1640.             ePoint <- pair y.
  1641.             aPen up.
  1642.             aPen goTo:
  1643.                 (sPoint x + xOffset) @ (sPoint y + yOffset).
  1644.             aPen down.
  1645.             aPen goTo:
  1646.                 (ePoint x + xOffset) @ (ePoint y + yOffset).
  1647.             ].
  1648. ]
  1649. "
  1650.     pen show - show off some of the capabilities of pens.
  1651. "
  1652. Class PenShow
  1653. | bic |
  1654. [
  1655.     withPen: aPen
  1656.         bic <- aPen
  1657. |
  1658.     poly: nSides length: length
  1659.  
  1660.         nSides timesRepeat:
  1661.             [ bic go: length ;
  1662.                 turn: 2 pi / nSides ]
  1663. |
  1664.     spiral: n angle: a
  1665.         ( 1 to: n ) do:
  1666.             [:i | bic go: i ; turn: a]
  1667. ]
  1668. End
  1669. echo unbundling point.st 1>&2
  1670. cat >point.st <<'End'
  1671. Class Point :Magnitude
  1672. | xvalue yvalue |
  1673. [
  1674.     < aPoint
  1675.         ^ (xvalue < aPoint x) and: [yvalue < aPoint y]
  1676. |
  1677.     <= aPoint
  1678.         ^ (xvalue <= aPoint x) and: [yvalue < aPoint y]
  1679. |
  1680.     >= aPoint
  1681.         ^ (xvalue >= aPoint x) and: [yvalue >= aPoint y]
  1682. |
  1683.     = aPoint
  1684.         ^ (xvalue = aPoint x) and: [yvalue = aPoint y]
  1685. |
  1686.     * scale
  1687.         ^ (Point new x: (xvalue * scale)) y: (yvalue * scale)
  1688. |
  1689.     + delta
  1690.         ^ (Point new x: (xvalue + delta x)) y: (yvalue + delta y)
  1691. |
  1692.     - delta
  1693.         ^ (Point new x: (xvalue - delta x)) y: (yvalue - delta y)
  1694. |
  1695.     / scale
  1696.         ^ (Point new x: (xvalue / scale)) y: (yvalue / scale)
  1697. |
  1698.     // scale
  1699.         ^ (Point new x: (xvalue // scale)) y: (yvalue // scale)
  1700. |
  1701.     abs
  1702.         ^ (Point new x: xvalue abs) y: (yvalue abs)
  1703. |
  1704.     asString
  1705.         ^ xvalue asString , ' @ ' , (yvalue asString)
  1706. |
  1707.     dist: aPoint
  1708.         ^ ((xvalue - aPoint x) squared +
  1709.             (yvalue - aPoint y) squared) sqrt
  1710. |
  1711.     max: aPoint
  1712.         ^ (Point new x: (xvalue max: aPoint x))
  1713.             y: (yvalue max: aPoint y)
  1714. |
  1715.     min: aPoint
  1716.         ^ (Point new x: (xvalue min: aPoint x))
  1717.             y: (yvalue min: aPoint y)
  1718. |
  1719.     printString
  1720.         ^ xvalue printString , ' @ ' , (yvalue printString)
  1721. |
  1722.     transpose
  1723.         ^ (Point new x: yvalue) y: xvalue
  1724. |
  1725.     x
  1726.         ^ xvalue
  1727. |
  1728.     x: aValue
  1729.         xvalue <- aValue
  1730. |
  1731.     x: xValue y: yValue
  1732.         xvalue <- xValue.
  1733.         yvalue <- yValue
  1734. |
  1735.     y
  1736.         ^ yvalue
  1737. |
  1738.     y: aValue
  1739.         yvalue <- aValue
  1740. ]
  1741. End
  1742. echo unbundling process.st 1>&2
  1743. cat >process.st <<'End'
  1744. Class  Process
  1745.  
  1746. [  block
  1747.     (self state == #TERMINATED)
  1748.         ifTrue: [self termErr: 'block'.  ^ nil].
  1749.     <SetProcessState  self 2>.
  1750.     ^ self state
  1751.  
  1752. |  resume
  1753.     (self state == #TERMINATED)
  1754.         ifTrue: [self termErr: 'resume'.  ^ nil].
  1755.     <SetProcessState  self 0>.
  1756.     ^ self state
  1757.  
  1758. |  suspend
  1759.     (self state == #TERMINATED)
  1760.         ifTrue: [self termErr: 'suspend'.  ^ nil].
  1761.     <SetProcessState  self 1>.
  1762.     ^ self state
  1763.  
  1764. |  state  | pstate |
  1765.     pstate <- <ReturnProcessState  self>.
  1766.     (pstate = 0) ifTrue: [pstate <- #READY.  ^ pstate].
  1767.     (pstate = 1) ifTrue: [pstate <- #SUSPENDED.  ^ pstate].
  1768.     (pstate = 2) ifTrue: [pstate <- #BLOCKED.  ^ pstate].
  1769.     (pstate = 3) ifTrue: [pstate <- #BLOCKED.  ^ pstate].
  1770.     (pstate >= 4) ifTrue: [pstate <- #TERMINATED.  ^ pstate]
  1771.  
  1772. |  terminate
  1773.     <Terminate self>.
  1774.     ^ self state
  1775.  
  1776. |  termErr: msgName
  1777.     ('Cannot ',msgName,' a terminated process.') print
  1778.  
  1779. |  unblock
  1780.     (self state == #TERMINATED)
  1781.         ifTrue: [self termErr: 'unblock'.  ^ nil].
  1782.     <SetProcessState  self 3>.
  1783.     ^ self state
  1784.  
  1785. |  yield
  1786.     ^ nil
  1787. ]
  1788. End
  1789. echo unbundling radian.st 1>&2
  1790. cat >radian.st <<'End'
  1791. Class Radian :Magnitude
  1792. | value |
  1793. [
  1794.         new: x
  1795.                 value <- <NormalizeRadian (x asFloat) >
  1796.  
  1797. |    < arg
  1798.         ^ value < arg asFloat
  1799.  
  1800. |    = arg
  1801.         ^ value = arg asFloat
  1802.  
  1803. |       sin
  1804.                 ^ <Sin value>
  1805.  
  1806. |       cos
  1807.                 ^ <Cos value>
  1808.  
  1809. |       tan
  1810.                 ^ <Sin value> / <Cos value>
  1811.  
  1812. |       asFloat
  1813.                 ^ value
  1814.  
  1815. |       printString
  1816.                 ^ value asString , ' radians'
  1817. ]
  1818. End
  1819. echo unbundling random.st 1>&2
  1820. cat >random.st <<'End'
  1821. Class Random
  1822. | seed |
  1823. [
  1824.         new
  1825.                 seed <- 1
  1826. |
  1827.     randomize
  1828.         seed <- <TimeCounter>
  1829. |
  1830.         first
  1831.                 ^ <RandomFloat (seed <- <Random seed > ) >
  1832. |
  1833.         next
  1834.                 ^ <RandomFloat (seed <- <Random seed > ) >
  1835. |
  1836.     between: low and: high
  1837.         ^ (self next * (high - low)) + low
  1838. |
  1839.     randInteger: limit
  1840.         ^ (self next * limit) truncated + 1
  1841. |
  1842.     next: n            | newa |
  1843.         newa <- Array new: n.
  1844.         (1 to: n) do: [:x | newa at: x put: self next].
  1845.         ^ newa
  1846. ]
  1847. End
  1848. echo unbundling scollection.st 1>&2
  1849. cat >scollection.st <<'End'
  1850. Class SequenceableCollection :KeyedCollection
  1851. [
  1852.     , aCollection
  1853.         ^ self coerce: (List new ;
  1854.                     addAllLast: self ;
  1855.                     addAllLast: aCollection )
  1856. |
  1857.         collect: aBlock
  1858.         ^ self coerce:
  1859.              (self inject: List new
  1860.                            into: [:x :y | x addLast: (aBlock value: y) . x ] )
  1861. |
  1862.     copyFrom: start to: stop                | newcol |
  1863.                 newcol <- List new.
  1864.         (start to: stop) do: [:i | newcol addLast: (self at: i)].
  1865.                 ^ self coerce: newcol
  1866. |
  1867.     copyWith: newElement
  1868.         ^ self coerce: (List new ;
  1869.                     addAllLast: self ;
  1870.                     addLast: newElement )
  1871. |
  1872.     copyWithout: oldElement                 | newcol |
  1873.                 newcol <- List new.
  1874.                 self do: [ :x | (x == oldElement)
  1875.                                 ifFalse: [ newcol addLast: x ]].
  1876.                 ^ self coerce: newcol
  1877. |
  1878.     equals: aSubCollection startingAt: anIndex      | i |
  1879.                 i <- 0.
  1880.                 self do: [:x |
  1881.                         (x = (aSubCollection at: (anIndex + i)
  1882.                                             ifAbsent: [^ false]))
  1883.                                 ifFalse: [^ false].
  1884.                         i <- i + 1].
  1885.                 ^ true
  1886. |
  1887.     findFirst: aBlock
  1888.         ^ self findFirst: aBlock
  1889.             ifAbsent: [self error: 'first element not found']
  1890. |
  1891.     findFirst: aBlock ifAbsent: exceptionBlock
  1892.                 self do: [:x | (aBlock value: x)
  1893.                 ifTrue: [ ^ self currentKey]].
  1894.                 ^ exceptionBlock value
  1895. |
  1896.     findLast: aBlock
  1897.         self findLast: aBlock
  1898.             ifAbsent: [self error: 'last element not found']
  1899. |
  1900.     findLast: aBlock ifAbsent: exceptionBlock
  1901.                 self reverseDo: [:x | (aBlock value: x)
  1902.                                         ifTrue: [ ^ self currentKey]].
  1903.                 ^ exceptionBlock value
  1904. |
  1905.     indexOfSubCollection: aSubCollection
  1906.     startingAt: anIndex
  1907.     ifAbsent: exceptionBlock              | n m |
  1908.  
  1909.                 n <- anIndex.
  1910.                 m <- self size - aSubCollection size.
  1911.                 [n <= m] whileTrue:
  1912.                         [(aSubCollection equals: self startingAt: n)
  1913.                                 ifTrue: [^ n].
  1914.                          n <- n + 1].
  1915.                 ^ exceptionBlock value
  1916. |
  1917.     indexOfSubCollection: aSubCollection startingAt: anIndex
  1918.                 ^ self indexOfSubCollection: aSubCollection
  1919.                startingAt: anIndex
  1920.                        ifAbsent: [ self error: 'element not found'. nil]
  1921. |
  1922.     last
  1923.                 ^ (0 = self size) ifFalse: [ self at: self lastKey ]
  1924. |
  1925.     replaceFrom: start to: stop with: repcol
  1926.         repcol inject: start
  1927.                into: [:x :y | self at: x put: y. x + 1]
  1928. |
  1929.     replaceFrom: first to: stop with: repcol startingAt: repStart | i |
  1930.                 i <- 0 .
  1931.                 [(first + i) <= stop] whileTrue:
  1932.                         [self at: (first + i)
  1933.                               put: (repcol at: i + repStart).
  1934.              i <- i + 1 ]
  1935. |
  1936.         reverseDo: aBlock                       | n m |
  1937.                 n <- self lastKey.  m <- self firstKey.
  1938.                 [n >= m] whileTrue:
  1939.                         [(self includesKey: n) ifTrue:
  1940.                                 [aBlock value: (self at: n)].
  1941.                          n <- n - 1].
  1942.                 ^ nil
  1943. |
  1944.     reversed                | newar i |
  1945.                 newar <- Array new: (i <- self size).
  1946.                 self do: [:x | newar at: i put: x. i <- i - 1].
  1947.                 ^ self coerce: newar
  1948. |
  1949.     select: aBlock
  1950.         ^ self coerce:
  1951.              (self inject: List new
  1952.                            into: [:x :y | (aBlock value: y)
  1953.                                            ifTrue: [x addLast: y]. x ] )
  1954. |
  1955.     sort
  1956.         ^ self sort: [:x :y | x <= y]
  1957. |
  1958.     sort: sortBlock        | index temp newArray |
  1959.         newArray <- self asArray.
  1960.         (2 to: newArray size) do:
  1961.           [ :highIndex | index <- highIndex - 1.
  1962.             [(index >= 1) and:
  1963.                [(sortBlock value: (newArray at: index)
  1964.                       value: (newArray at: (index + 1))) not]]
  1965.                whileTrue: [temp <- newArray at: index.
  1966.                        newArray at: index
  1967.                         put: (newArray at: index + 1).
  1968.                        newArray at: index + 1 put: temp.
  1969.                        index <- index - 1 ]].
  1970.         ^ self coerce: newArray
  1971.  
  1972. |
  1973.     with: aSequenceableCollection do: aBlock        | arg1 arg2 |
  1974.                 arg1 <- self first. arg2 <- aSequenceableCollection first.
  1975.                 [ arg1 notNil] whileTrue:
  1976.                         [ aBlock value: arg1 value: arg2.
  1977.                           arg1 <- self next.
  1978.                           arg2 <- aSequenceableCollection next].
  1979.                 ^ nil
  1980.  
  1981. ]
  1982. End
  1983. echo unbundling semaphore.st 1>&2
  1984. cat >semaphore.st <<'End'
  1985. Class  Semaphore :List
  1986. | excessSignals |
  1987.  
  1988. [  new
  1989.     excessSignals <- 0
  1990.  
  1991. |  new: aNumber
  1992.     excessSignals <- aNumber
  1993.  
  1994. |  signal
  1995.     <StartAtomic>.    "start atomic action"
  1996.     (self isEmpty)
  1997.       ifTrue: [excessSignals <- excessSignals + 1]
  1998.       ifFalse: [self removeFirst unblock].
  1999.     <EndAtomic>        "end atomic action"
  2000.  
  2001. |  wait
  2002.     <StartAtomic>.    "start atomic actions"
  2003.     (excessSignals = 0)
  2004.       ifTrue: [self addLast: selfProcess.
  2005.            selfProcess block]
  2006.       ifFalse: [excessSignals <- excessSignals - 1].
  2007.     <EndAtomic>        "end atomic actions"
  2008. ]
  2009. End
  2010. echo unbundling set.st 1>&2
  2011. cat >set.st <<'End'
  2012. Class Set :Collection
  2013. | list |
  2014. [
  2015.         new
  2016.                 list <- List new
  2017.  
  2018. |       add: newElement
  2019.         (list includes: newElement)
  2020.             ifFalse: [list add: newElement]
  2021.  
  2022. |       remove: oldElement ifAbsent: exceptionBlock
  2023.         list remove: oldElement ifAbsent: exceptionBlock
  2024.  
  2025. |       size
  2026.                 ^ list size
  2027.  
  2028. |       occurrencesOf: anElement
  2029.                 ^ (list includes: anElement) ifTrue: [1] ifFalse: [0]
  2030.  
  2031. |       first
  2032.                 ^ list first
  2033.  
  2034. |       next
  2035.                 ^ list next
  2036. ]
  2037. End
  2038. echo unbundling smalltalk.st 1>&2
  2039. cat >smalltalk.st <<'End'
  2040. Class Smalltalk :Dictionary
  2041. [
  2042.     clearScreen
  2043.         <Clear>
  2044. |
  2045.     date
  2046.         ^ <CurrentTime >
  2047. |
  2048.     debug: n
  2049.         ^ <Debug 2 n>
  2050. |
  2051.     display
  2052.         ^ <Debug 1 1>
  2053. |
  2054.     displayAssign
  2055.         ^ <Debug 1 2>
  2056. |
  2057.     doPrimitive: primNumber withArguments: argArray
  2058.         ^ <DoPrimitive primNumber argArray>
  2059. |
  2060.     getString
  2061.         ^ <primitive 163>
  2062. |
  2063.     noDisplay
  2064.         ^ <Debug 1 0>
  2065. |
  2066.     perform: aMessage withArguments: argArray
  2067.         ^ <Perform argArray aMessage >
  2068. |
  2069.     sh: command
  2070.         ^ <System command >
  2071. |
  2072.     time: aBlock        | start |
  2073.         start <- <TimeCounter>.
  2074.         aBlock value.
  2075.         ^ <TimeCounter> - start
  2076. ]
  2077. End
  2078. echo unbundling string.st 1>&2
  2079. cat >string.st <<'End'
  2080. Class String :ArrayedCollection
  2081. [
  2082.     , aString
  2083.         ^ <StringCatenation self
  2084.             (<SameTypeOfObject self aString>
  2085.                 ifTrue:  [aString]
  2086.                 ifFalse: [aString printString])>
  2087. |
  2088.     = aString
  2089.         ^ <SameTypeOfObject self aString>
  2090.             ifTrue:  [<StringCompare self aString> = 0]
  2091.             ifFalse: [self compareError]
  2092. |
  2093.     < aString
  2094.         ^ <SameTypeOfObject self aString>
  2095.             ifTrue:  [<StringCompare self aString> < 0]
  2096.             ifFalse: [self compareError]
  2097. |
  2098.     <=  aString
  2099.         ^ <SameTypeOfObject self aString>
  2100.             ifTrue:  [<StringCompare self aString> <= 0]
  2101.             ifFalse: [self compareError]
  2102. |
  2103.     >=  aString
  2104.         ^ <SameTypeOfObject self aString>
  2105.             ifTrue:  [<StringCompare self aString> >= 0]
  2106.             ifFalse: [self compareError]
  2107. |
  2108.     >  aString
  2109.         ^ <SameTypeOfObject self aString>
  2110.             ifTrue:  [<StringCompare self aString> > 0]
  2111.             ifFalse: [self compareError]
  2112. |
  2113.     asInteger
  2114.         ^ <primitive 164 self>
  2115. |
  2116.     asFloat
  2117.         ^ <primitive 165 self>
  2118. |
  2119.     asSymbol
  2120.         ^ <StringAsSymbol self>
  2121. |
  2122.     at: aNumber
  2123.         ^ <StringAt self aNumber>
  2124. |
  2125.     at: aNumber put: aChar
  2126.         <StringAtPut self aNumber aChar>
  2127. |
  2128.     compareError
  2129.         ^ self error: 'strings can only be compared to strings'
  2130. |
  2131.     copyFrom: start to: stop
  2132.         ^ <CopyFromLength self start (stop - start + 1) >
  2133. |
  2134.     copyFrom: start length: len
  2135.         ^ <CopyFromLength self start len >
  2136. |
  2137.     deepCopy
  2138.         ^ <StringCopy self >
  2139. |
  2140.     new: size
  2141.         ^ <NewString size>
  2142. |
  2143.     printAt: aPoint
  2144.         <PrintAt self (aPoint x) (aPoint y)>
  2145. |
  2146.     printString
  2147.         ^ <StringPrintString self>
  2148. |
  2149.     print
  2150.         <PrintWithReturn self>
  2151. |
  2152.     printNoReturn
  2153.         <PrintNoReturn self>
  2154. |
  2155.     size
  2156.         ^ <StringLength self>
  2157. |
  2158.     sameAs: aString
  2159.         ^ <SameTypeOfObject self aString>
  2160.             ifTrue:  [<StringCompareWithoutCase self aString>]
  2161.             ifFalse: [self compareError]
  2162. ]
  2163. End
  2164. echo unbundling symbol.st 1>&2
  2165. cat >symbol.st <<'End'
  2166. Class Symbol
  2167. [
  2168.     == aSymbol
  2169.         ^ <SameTypeOfObject self aSymbol >
  2170.             ifTrue:  [<SymbolCompare self aSymbol >]
  2171.             ifFalse: [false]
  2172. |
  2173.     printString
  2174.         ^ <SymbolPrintString self>
  2175. |
  2176.     asString
  2177.         ^ <SymbolAsString self>
  2178. ]
  2179.  
  2180. End
  2181. echo unbundling true.st 1>&2
  2182. cat >true.st <<'End'
  2183. Class True :Boolean
  2184. [
  2185.         ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
  2186.                 ^ trueAlternativeBlock value
  2187.  
  2188. !       ifFalse: falseAlternativeBlock ifTrue: trueAlternativeBlock
  2189.                 ^ trueAlternativeBlock value
  2190.  
  2191. !       ifTrue: trueAlternativeBlock
  2192.                 ^ trueAlternativeBlock value
  2193.  
  2194. !       ifFalse: falseAlternativeBlock
  2195.                 ^ nil
  2196.  
  2197. |       not
  2198.                 ^ false
  2199. ]
  2200. End
  2201.