sr SmallObjectUD[datat[LSmallObject;LobjClasst LSmallObject;xpur[LSmallObject;3$hxpsq~uq~srSmallByteArray}[valuest[Bxq~uq~sq~uq~sq~uq~q~ ur[BTxpStringsq~uq~sq~uq~q~ uq~Arraysq~uq~sq~uq~q~ uq~Indexedsq~uq~sq~uq~q~ uq~ Collectionsq~uq~sq~uq~q~ uq~ Magnatudesq~uq~sq~uq~q~ uq~Objectq~sq~uq~sq~uq~sq~uq~q~ uq~=sq~uq~sq~uq~sq~uq~q~ uq~ ByteArrayq~sq~uq~sq~uq~sq~uq~q~ uq~asCodesq~uq~q~4uq~ @p 01AC1DFp0Hsq~uq~ sq~uq~q~ uq~(srSmallIntBoLIvaluexq~uq~sq~uq~sq~uq~q~ uq~SmallIntsq~uq~sq~uq~q~ uq~Integersq~uq~sq~uq~q~ uq~Numberq~!sq~uq~sq~uq~sq~uq~q~ uq~abssq~uq~q~4uq~ sq~uq~sq~uq~q~ uq~negativesq~uq~q~ uq~negatedq~sq~Huq~q~Ksq~Huq~q~Kq~Usq~uq~q~ uq~>abs ^ self negative ifTrue: [ self negated] ifFalse: [ self ]sq~uq~sq~uq~q~ uq~Methodq~&sq~uq~sq~uq~sq~uq~q~ uq~ byteCodessq~uq~q~4uq~sq~uq~q~sq~Huq~q~Kq~nq~ssq~uq~q~ uq~byteCodes ^ byteCodes q~ssq~uq~sq~uq~q~ uq~literalssq~uq~q~4uq~q~sq~Huq~q~Kq~nq~ssq~uq~q~ uq~literals ^ literals q~ssq~uq~sq~uq~q~ uq~namesq~uq~q~4uq~q~sq~Huq~q~Kq~nq~ssq~uq~q~ uq~ name ^ name q~ssq~uq~sq~uq~q~ uq~ printStringsq~uq~q~4uq~q~sq~Huq~q~Kq~nq~ssq~uq~q~ uq~printString ^ name q~ssq~uq~sq~uq~q~ uq~ stackSizesq~uq~q~4uq~q~sq~Huq~q~Kq~nq~ssq~uq~q~ uq~stackSize ^ stackSize q~ssq~uq~sq~uq~q~ uq~tempSizesq~uq~q~4uq~q~sq~Huq~q~Kq~nq~ssq~uq~q~ uq~tempSize ^ temporarySize q~ssq~uq~sq~uq~q~ uq~textsq~uq~q~4uq~q~sq~Huq~q~Kq~nq~ssq~uq~q~ uq~ text ^ text q~sq~q~lsq~uq~q~q~|q~q~sq~uq~q~ uq~ temporarySizesq~uq~q~ uq~classq~q~sq~uq~sq~uq~q~ uq~ MetaMethodsq~uq~sq~uq~q~ uq~ MetaObjectsq~uq~sq~uq~q~ uq~Classq~&sq~uq~sq~uq~sq~uq~q~ uq~addClassVariable:sq~uq~q~4uq~@ ZB U !Qcsq~uq~q~&sq~uq~q~ uq~in:add:q~&sq~uq~q~ uq~classsq~uq~q~ uq~classsq~uq~q~ uq~ variablessq~uq~q~ uq~add:sq~uq~q~ uq~ in:at:put:q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~addClassVariable: n " put new class variable in class - dangerous " Object in: self add: nil. Object in: self class at: 5 put: (self class variables add: n). size <- size + 1q~ssq~uq~sq~uq~q~ uq~addInstanceVariable:sq~uq~q~4uq~ !dQcsq~uq~sq~uq~q~ uq~add:q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~LaddInstanceVariable: n variables <- variables add: n. size <- size + 1q~ssq~uq~sq~uq~q~ uq~ allMethodssq~uq~q~4uq~ sq~uq~sq~uq~q~ uq~asListq~-q~%sq~uq~q~ uq~addAll:q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~zallMethods ^ parentClass isNil ifTrue: [ methods asList ] ifFalse: [ methods asList addAll: parentClass allMethods ] q~ssq~uq~sq~uq~q~ uq~compileMethod:sq~uq~q~4uq~5 !p0,100%23򂘁b0 J[sq~uq~ sq~uq~q~ uq~ parseMethod:sq~uq~q~ uq~namesq~uq~q~ uq~namesq~uq~q~ uq~~=sq~uq~q~ uq~select:sq~uq~q~ uq~add:sq~uq~q~ uq~namesq~uq~q~ uq~namesq~uq~q~ uq~ asOrdered:sq~uq~q~ uq~asArraysq~uq~q~ uq~cannot compile methodsq~uq~q~ uq~error:q~sq~Huq~q~Ksq~Huq~q~Kq~sq~uq~q~ uq~ compileMethod: aString | method | method <- self parseMethod: aString. method notNil ifTrue: [ methods <- (((methods select: [:m | m name ~= method name]) add: method) asOrdered: [:a :b | a name < b name]) asArray ] ifFalse: [ self error: 'cannot compile method']. ^ trueq~ssq~uq~sq~uq~q~ uq~editsq~uq~q~4uq~@Bp0DEHqJ'14r81  d 1  T UZ2  0   !Ō2 " #b2 $ %1& '0 ( )*+Ş1 , - ./0Ŭ 1 234 5 6 789 : ;<= > ? @AB C DEF0 G H$s0IJ3 K21 L M0 Nsq~uq~Osq~uq~sq~uq~q~ uq~Windowq~&sq~uq~sq~uq~sq~uq~q~ uq~addMenu:sq~uq~q~4uq~ !@sq~uq~q~sq~Huq~q~Kq~nq~wsq~uq~q~ uq~addMenu: m <64 self m>q~ssq~uq~sq~uq~q~ uq~closesq~uq~q~4uq~ \=sq~uq~q~q~q~nq~wsq~uq~q~ uq~close ^ <61 self false>q~ssq~uq~sq~uq~q~ uq~repaintsq~uq~q~4uq~ Bsq~uq~q~q~q~nq~wsq~uq~q~ uq~repaint <66 self>q~ssq~uq~sq~uq~q~ uq~setPane:sq~uq~q~4uq~ !>sq~uq~q~q~q~nq~wsq~uq~q~ uq~setPane: c <62 self c>q~ssq~uq~sq~uq~q~ uq~showsq~uq~q~4uq~ [=sq~uq~q~q~q~nq~wsq~uq~q~ uq~show <61 self true>q~ssq~uq~sq~uq~q~ uq~size:sq~uq~q~4uq~ !!sq~uq~sq~uq~q~ uq~xsq~uq~q~ uq~ysq~uq~q~ uq~ width:height:q~sq~Huq~q~K q~nq~wsq~uq~q~ uq~%size: p self width: p x height: p yq~ssq~uq~sq~uq~q~ uq~title:sq~uq~q~4uq~ !Asq~uq~q~q~q~nq~wsq~uq~q~ uq~title: t <65 self t>q~ssq~uq~sq~uq~q~ uq~ width:height:sq~uq~q~4uq~ "!?sq~uq~q~q~q~nq~wsq~uq~q~ uq~#width: w height: h <63 self h w>q~sq~q~nsq~uq~q~sq~uq~sq~uq~q~ uq~ MetaWindowq~sq~uq~sq~uq~sq~uq~q~ uq~eval:sq~uq~q~4uq~X@Bp0DEGr2I02LMq1O.2  1H!2   0  01 0 sq~uq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~Expression Windowsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Kdsq~uq~q~ uq~ width:height:sq~uq~sq~uq~q~ uq~Paneq~&sq~uq~ sq~uq~sq~uq~q~ uq~getIndexsq~uq~q~4uq~ Ssq~uq~q~q~q~nq~sq~uq~q~ uq~5getIndex " get index from list pane " ^ <83 self>q~ssq~uq~sq~uq~q~ uq~getSelectedTextsq~uq~q~4uq~@ Qsq~uq~q~ q~q~q~nq~sq~uq~q~ uq~&getSelectedText ^ <81 String self> q~ssq~uq~sq~uq~q~ uq~getTextsq~uq~q~4uq~@ Psq~uq~q~ q~q~q~nq~sq~uq~q~ uq~getText ^ <80 String self>q~ssq~uq~sq~uq~q~ uq~ onMouseDown:sq~uq~q~4uq~ !01Vsq~uq~sq~uq~q~ uq~@sq~uq~q~ uq~value:q~sq~Huq~q~K sq~Huq~q~Kq~sq~uq~q~ uq~HonMouseDown: b "add mouse action " <86 self [:x :y | b value: x@y] >q~ssq~uq~sq~uq~q~ uq~ onMouseMove:sq~uq~q~4uq~ 12p!0Xsq~uq~sq~uq~q~ uq~@sq~uq~q~ uq~value:q~q~sq~Huq~q~Kq~sq~uq~q~ uq~YonMouseMove: b "add mouse action " | t | <88 self [:x :y | t <- x@y. b value: t] >q~ssq~uq~sq~uq~q~ uq~ onMouseUp:sq~uq~q~4uq~ !01Wsq~uq~sq~uq~q~ uq~@sq~uq~q~ uq~value:q~q~Tq~Vq~sq~uq~q~ uq~MonMouseUp: b " on mouse up do action " <87 self [:x :y | b value: x@y] >q~ssq~uq~sq~uq~q~ uq~ setImage:sq~uq~q~4uq~ !Msq~uq~q~q~q~nq~sq~uq~q~ uq~5setImage: img " set image on pane " < 77 self img>q~ssq~uq~sq~uq~q~ uq~setList:sq~uq~q~4uq~ !Tsq~uq~q~q~q~nq~sq~uq~q~ uq~4setList: d "set data in list pane" ^ <84 self d>q~ssq~uq~sq~uq~q~ uq~setText:sq~uq~q~4uq~ !Rsq~uq~q~q~q~nq~sq~uq~q~ uq~5setText: s " set text in text pane " ^ <82 self s>q~sq~q~nsq~uq~q~sq~uq~sq~uq~q~ uq~MetaPaneq~sq~uq~sq~uq~sq~uq~q~ uq~column:sq~uq~q~4uq~ !Q!sq~uq~sq~uq~q~ uq~sizesq~uq~q~ uq~rows:columns:data:q~sq~Huq~q~K q~nq~sq~uq~q~ uq~2column: p ^ self rows: p size columns: 1 data: pq~ssq~uq~sq~uq~q~ uq~hSliderFrom:to:do:sq~uq~q~4uq~ \!"#Usq~uq~q~q~q~nq~sq~uq~q~ uq~\hSliderFrom: low to: high do: b " make horizontal slider " ^ <85 self false low high b>q~ssq~uq~sq~uq~q~ uq~image:sq~uq~q~4uq~ @!sq~uq~sq~uq~q~ uq~sq~uq~q~ uq~title:sq~uq~q~ uq~ setImage:q~q~q~nq~sq~uq~q~ uq~-image: img ^ (self title: '') setImage: imgq~ssq~uq~sq~uq~q~ uq~ list:action:sq~uq~q~4uq~ !"Ksq~uq~q~q~q~nq~sq~uq~q~ uq~:list: d action: b "create a list pane" ^ <75 self d b>q~ssq~uq~sq~uq~q~ uq~north:center:south:sq~uq~q~4uq~ !#ZZ"sq~uq~sq~uq~q~ uq~north:south:east:west:center:q~sq~Huq~q~K q~nq~sq~uq~q~ uq~Unorth: n center: c south: s ^ self north: n south: s east: nil west: nil center: cq~ssq~uq~sq~uq~q~ uq~north:south:east:west:center:sq~uq~q~4uq~ !"#$%Lsq~uq~q~q~q~nq~sq~uq~q~ uq~Dnorth: n south: s east: e west: w center: c ^ <76 self n s e w c>q~ssq~uq~sq~uq~q~ uq~row:sq~uq~q~4uq~ Q!!sq~uq~sq~uq~q~ uq~sizesq~uq~q~ uq~rows:columns:data:q~sq~Huq~q~K q~nq~sq~uq~q~ uq~/row: p ^ self rows: 1 columns: p size data: pq~ssq~uq~sq~uq~q~ uq~rows:columns:data:sq~uq~q~4uq~ "!#Jsq~uq~q~q~q~nq~sq~uq~q~ uq~.rows: r columns: c data: d ^ <74 self c r d>q~ssq~uq~sq~uq~q~ uq~textAreasq~uq~q~4uq~ Isq~uq~q~q~q~nq~sq~uq~q~ uq~9textArea " create a multi-line text area" ^ <73 self>q~ssq~uq~sq~uq~q~ uq~textLinesq~uq~q~4uq~ Hsq~uq~q~q~q~nq~sq~uq~q~ uq~5textLine "create a one-line text pane" ^ <72 self> q~ssq~uq~sq~uq~q~ uq~title:sq~uq~q~4uq~ !Fsq~uq~q~q~q~nq~sq~uq~q~ uq~8title: t "create a simple label pane " ^ <70 self t>q~ssq~uq~sq~uq~q~ uq~ title:action:sq~uq~q~4uq~ !"Gsq~uq~q~q~q~nq~sq~uq~q~ uq~=title: t action: b "create a button pane" ^ <71 self t b>q~ssq~uq~sq~uq~q~ uq~vSliderFrom:to:do:sq~uq~q~4uq~ [!"#Usq~uq~q~q~q~nq~sq~uq~q~ uq~YvSliderFrom: low to: high do: b " make vertical slider " ^ <85 self true low high b>q~ssq~uq~sq~uq~q~ uq~ west:east:sq~uq~q~4uq~ ZZ"!Zsq~uq~sq~uq~q~ uq~north:south:east:west:center:q~sq~Huq~q~K q~nq~sq~uq~q~ uq~Jwest: w east: e ^ self north: nil south: nil east: e west: w center: nilq~ssq~uq~sq~uq~q~ uq~west:east:center:sq~uq~q~4uq~ ZZ"!#sq~uq~sq~uq~q~ uq~north:south:east:west:center:q~sq~Huq~q~K q~nq~sq~uq~q~ uq~Rwest: w east: e center: c ^ self north: nil south: nil east: e west: w center: cq~sq~sq~Huq~q~Ksq~uq~q~q~sq~uq~q~ uq~textAreasq~uq~q~ uq~type expression heresq~uq~q~ uq~setText:sq~uq~q~ uq~setPane:sq~uq~sq~uq~q~ uq~Menuq~&sq~uq~sq~uq~sq~uq~q~ uq~on:do:sq~uq~q~4uq~ !"[sq~uq~q~q~q~nq~sq~uq~q~ uq~/on: title do: action <91 self title action >q~sq~q~nsq~uq~q~sq~uq~sq~uq~q~ uq~MetaMenuq~sq~uq~sq~uq~sq~uq~q~ uq~newsq~uq~q~4uq~ @sq~uq~sq~uq~q~ uq~menu must be created with new:sq~uq~q~ uq~error:q~q~lq~nq~sq~uq~q~ uq~2new self error: 'menu must be created with new:'q~ssq~uq~sq~uq~q~ uq~new:sq~uq~q~4uq~ !Zsq~uq~q~q~q~nq~sq~uq~q~ uq~new: t ^ <90 self t>q~sq~q~sq~uq~q~q~sq~uq~q~ uq~Editsq~uq~q~ uq~new:sq~uq~q~ uq~clearsq~uq~q~ uq~sq~uq~q~ uq~setText:sq~uq~q~ uq~on:do:sq~uq~q~ uq~Evaluate and Savesq~uq~q~ uq~getTextsq~uq~q~ uq~doItsq~uq~q~ uq~value:sq~uq~q~ uq~closesq~uq~q~ uq~on:do:sq~uq~q~ uq~addMenu:sq~uq~q~ uq~showq~sq~Huq~q~Kq~kq~sq~uq~q~ uq~Peval: cb | w m t | w <- Window new title: 'Expression Window'. w width: 300 height: 100. t <- Pane textArea. t setText: 'type expression here'. w setPane: t. m <- Menu new: 'Edit'. m on: 'clear' do: [ t setText: '' ]. m on: 'Evaluate and Save' do: [ cb value: t getText doIt. w close ]. w addMenu: m. w show q~ssq~uq~sq~uq~q~ uq~ getString:sq~uq~q~4uq~v Ap0CDFqHsJRr2QLM0013   2RJ0    0! 3QR2   0 !1 "sq~uq~#sq~uq~q~ uq~newsq~uq~q~ uq~ get stringsq~uq~q~ uq~title:sq~Huq~q~Ksq~Huq~q~Kdsq~uq~q~ uq~ width:height:sq~uq~sq~uq~q~ uq~ Semaphoreq~&sq~uq~sq~uq~sq~uq~q~ uq~set:sq~uq~q~4uq~ !fsq~uq~q~q~q~nq~6sq~uq~q~ uq~set: v <102 self v>q~ssq~uq~sq~uq~q~ uq~waitsq~uq~q~4uq~ esq~uq~q~q~q~nq~6sq~uq~q~ uq~wait ^ <101 self>q~sq~q~nsq~uq~q~sq~uq~sq~uq~q~ uq~ MetaSemaphoreq~sq~uq~sq~uq~sq~uq~q~ uq~newsq~uq~q~4uq~ dsq~uq~q~q~q~nq~Ysq~uq~q~ uq~new ^ <100 self>q~sq~q~sq~uq~q~q~sq~uq~q~ uq~newq~sq~uq~q~ uq~textLineq~sq~uq~q~ uq~new:q~sq~uq~q~ uq~returnsq~uq~q~ uq~closesq~uq~q~ uq~getTextsq~uq~q~ uq~set:sq~uq~q~ uq~ title:action:sq~uq~q~ uq~at:put:q~sq~uq~q~ uq~cancelsq~uq~q~ uq~closeq~&sq~uq~q~ uq~haltsq~uq~q~ uq~ title:action:sq~uq~q~ uq~at:put:q~q~sq~uq~q~ uq~title:q~sq~uq~q~ uq~rows:columns:data:sq~uq~q~ uq~north:center:south:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showsq~uq~q~ uq~waitq~sq~Huq~q~Kq~hq~sq~uq~q~ uq~getString: str |w s p t | " put up a window to ask question " w <- self new title: 'get string'. w width: 200 height: 100. s <- Semaphore new.t <- Pane textLine. p <- Array new: 2. p at: 1 put: (Pane title: 'return' action: [ w close. s set: t getText ]). p at: 2 put: (Pane title: 'cancel' action: [ w close. Object halt ]). w setPane: ( Pane north: (Pane title: str) center: t south: (Pane rows: 1 columns: 2 data: p)). w show. ^ s waitq~ssq~uq~sq~uq~q~ uq~newsq~uq~q~4uq~ q~ssq~uq~sq~uq~q~ uq~notify:sq~uq~q~4uq~-@Bp0DE0GZH!JK0򃝄0 !sq~uq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~notifysq~uq~q~ uq~title:sq~Huq~q~Ksq~Huq~q~Kdsq~uq~q~ uq~ width:height:q~q~sq~uq~q~ uq~title:q~sq~uq~q~ uq~closesq~uq~q~ uq~closesq~uq~q~ uq~ title:action:sq~uq~q~ uq~north:center:south:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showq~sq~Huq~q~Ksq~Huq~q~Kq~sq~uq~q~ uq~notify: str | w | " create a simple notification window" w <- Window new title: 'notify'. w width: 200 height: 100. w setPane: (Pane north: nil center: (Pane title: str) south: (Pane title: 'close' action: [ w close])). w show. ^ str q~ssq~uq~sq~uq~q~ uq~ question:sq~uq~q~4uq~ Ap0CDFqHSr2QJK(01[򃞃2R@0    2SZ0 1\   0! Z QS2 ! " #0 $1 %sq~uq~&sq~uq~q~ uq~newsq~uq~q~ uq~Questionsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Ksq~uq~q~ uq~ width:height:q~6sq~uq~q~ uq~newq~sq~uq~q~ uq~new:q~sq~uq~q~ uq~yessq~uq~q~ uq~closesq~uq~q~ uq~set:sq~uq~q~ uq~ title:action:sq~uq~q~ uq~at:put:q~sq~uq~q~ uq~cancelsq~uq~q~ uq~closeq~&sq~uq~q~ uq~haltsq~uq~q~ uq~ title:action:sq~uq~q~ uq~at:put:q~sq~uq~q~ uq~nosq~uq~q~ uq~closesq~uq~q~ uq~set:sq~uq~q~ uq~ title:action:sq~uq~q~ uq~at:put:q~q~sq~uq~q~ uq~title:q~sq~uq~q~ uq~rows:columns:data:sq~uq~q~ uq~north:center:south:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showsq~uq~q~ uq~waitq~sq~Huq~q~K!q~kq~sq~uq~q~ uq~question: str |w s p | " put up a window to ask question " w <- self new title: 'Question'. w width: 300 height: 150. s <- Semaphore new. p <- Array new: 3. p at: 1 put: (Pane title: 'yes' action: [ w close. s set: true ]). p at: 2 put: (Pane title: 'cancel' action: [ w close. Object halt ]). p at: 3 put: (Pane title: 'no' action: [ w close. s set: false ]). w setPane: ( Pane north: (Pane title: str) center: nil south: (Pane rows: 1 columns: 3 data: p)). w show. ^ s waitq~sq~q~sq~uq~q~q~sq~uq~q~ uq~newsq~uq~q~ uq~Class Editor: sq~uq~q~ uq~title:sq~Huq~q~Ksq~Huq~q~K,sq~uq~q~ uq~@sq~uq~q~ uq~size:q~sq~uq~q~ uq~textAreaq~sq~uq~q~ uq~ asStringArraysq~uq~q~ uq~at:sq~uq~q~ uq~textsq~uq~q~ uq~setText:sq~uq~q~ uq~ list:action:q~sq~uq~q~ uq~clear text areasq~uq~q~ uq~sq~uq~q~ uq~setText:sq~uq~q~ uq~ title:action:q~sq~uq~q~ uq~compilesq~uq~q~ uq~getTextsq~uq~q~ uq~compileMethod:q~wsq~uq~q~ uq~compiliation successfulsq~uq~q~ uq~notify:sq~uq~q~ uq~ asStringArraysq~uq~q~ uq~setList:sq~uq~q~ uq~repaintsq~uq~q~ uq~ title:action:q~sq~uq~q~ uq~ delete methodsq~uq~q~ uq~getIndexsq~uq~q~ uq~ removeAt:sq~uq~q~ uq~ asStringArraysq~uq~q~ uq~setList:sq~uq~q~ uq~sq~uq~q~ uq~setText:sq~uq~q~ uq~repaintsq~uq~q~ uq~ title:action:q~sq~uq~q~ uq~instance variablessq~uq~q~ uq~asStringsq~uq~q~ uq~setText:sq~uq~q~ uq~ title:action:q~sq~uq~q~ uq~edit class variablessq~uq~q~ uq~editClassVariablessq~uq~q~ uq~ title:action:q~sq~uq~q~ uq~examine superclasssq~uq~q~ uq~ superclasssq~uq~q~ uq~ superclasssq~uq~q~ uq~editq~wsq~uq~q~ uq~ no superclasssq~uq~q~ uq~notify:sq~uq~q~ uq~ title:action:q~sq~uq~q~ uq~examine metaclasssq~uq~q~ uq~classsq~uq~q~ uq~editsq~uq~q~ uq~ title:action:q~sq~uq~q~ uq~ object editsq~uq~q~ uq~editsq~uq~q~ uq~ title:action:q~sq~uq~q~ uq~closesq~uq~q~ uq~closesq~uq~q~ uq~ title:action:q~q~sq~uq~q~ uq~column:sq~uq~q~ uq~west:east:center:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showq~sq~Huq~q~K:q~q~sq~uq~q~ uq~edit | w t l ba | w <- Window new title: 'Class Editor: ' + name. w size: 500@300. t <- Pane textArea. l <- Pane list: methods asStringArray action: [:i | t setText: (methods at: i) text]. ba <- #((Pane title: 'clear text area' action: [ t setText: '' ]) (Pane title: 'compile' action: [ (self compileMethod: t getText) ifTrue: [ Window notify: 'compiliation successful' ]. l setList: methods asStringArray. w repaint]) (Pane title: 'delete method' action: [ methods <- methods removeAt: l getIndex. l setList: methods asStringArray. t setText: ''. w repaint ]) (Pane title: 'instance variables' action: [ t setText: variables asString]) (Pane title: 'edit class variables' action: [ self editClassVariables ]) (Pane title: 'examine superclass' action: [ self superclass notNil ifTrue: [ self superclass edit] ifFalse: [ Window notify: 'no superclass']]) (Pane title: 'examine metaclass' action: [ self class edit ]) (Pane title: 'object edit' action: [super edit]) (Pane title: 'close' action: [ w close]) ). w setPane: ( Pane west: (Pane column: ba) east: l center: t). w showq~ssq~uq~sq~uq~q~ uq~editClassVariablessq~uq~q~4uq~=@Bp0DEG -J 2U*L 2U3q01 0 sq~uq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~Class Variable Editor: sq~uq~q~ uq~title:sq~Huq~q~Ksq~Huq~q~Kdsq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~classsq~uq~q~ uq~ variablesq~&sq~uq~q~ uq~in:at:q~&sq~uq~q~ uq~ in:at:put:sq~uq~q~ uq~edit:sq~uq~q~ uq~ list:action:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showq~sq~Huq~q~Kq~hq~sq~uq~q~ uq~editClassVariables | w p | w <- Window new title: 'Class Variable Editor: ' + name. w width: 200 height: 100. p <- Pane list: self class variables action: [:i | (Object in: self at: i+5) edit: [:nv | Object in: self at: i+5 put: nv] ]. w setPane: p. w showq~ssq~uq~sq~uq~q~ uq~fileOutsq~uq~q~4uq~ @sq~uq~sq~uq~sq~uq~q~ uq~Fileq~&sq~uq~sq~uq~sq~uq~q~ uq~fileInsq~uq~q~4uq~ p0QTB0V0Z0QVHL0X0pL0< M0q1   MZ0QT  0V0  p0t 0  q1    ZZ sq~uq~!sq~uq~q~ uq~readLinesq~uq~q~ uq~from:to:sq~uq~q~ uq~EVALsq~uq~q~ uq~=sq~uq~q~ uq~sizesq~uq~q~ uq~from:to:sq~uq~q~ uq~doItsq~uq~q~ uq~from:to:sq~uq~q~ uq~METHODsq~uq~q~ uq~=sq~uq~q~ uq~sizesq~uq~q~ uq~from:to:q~sq~uq~q~ uq~unknown name in fileIn sq~uq~q~ uq~error:sq~uq~q~ uq~ at:ifAbsent:sq~uq~q~ uq~!sq~uq~q~ uq~readTo:sq~uq~q~ uq~compileMethod:sq~uq~q~ uq~from:to:sq~uq~q~ uq~METAsq~uq~q~ uq~=sq~uq~q~ uq~sizesq~uq~q~ uq~from:to:q~sq~uq~q~ uq~unknown name in fileIn sq~uq~q~ uq~error:sq~uq~q~ uq~ at:ifAbsent:sq~uq~q~ uq~classsq~uq~q~ uq~!sq~uq~q~ uq~readTo:sq~uq~q~ uq~compileMethod:sq~uq~q~ uq~File In Successfulq~sq~Huq~q~K"q~Vq~Zsq~uq~q~ uq~ifileIn | line cls | [(line <- self readLine) notNil] whileTrue: [ ((line from: 1 to: 4) = 'EVAL') ifTrue: [ (line from: 6 to: line size) doIt ]. ((line from: 1 to: 6) = 'METHOD') ifTrue: [ line <- line from: 8 to: line size. cls <- Class at: line ifAbsent: [ self error: 'unknown name in fileIn ' + line]. cls compileMethod: (self readTo: '!') ]. ((line from: 1 to: 4) = 'META') ifTrue: [ line <- line from: 6 to: line size. cls <- Class at: line ifAbsent: [ self error: 'unknown name in fileIn ' + line]. cls class compileMethod: (self readTo: '!') ] ]. ^ 'File In Successful' q~ssq~uq~sq~uq~q~ uq~readLinesq~uq~q~4uq~@ ,sq~uq~q~ q~sq~Huq~q~Kq~nq~Zsq~uq~q~ uq~readLine ^ <44 String self> q~ssq~uq~sq~uq~q~ uq~readTo:sq~uq~q~4uq~&@q p0!\ 10CqZ1sq~uq~sq~uq~q~ uq~sq~uq~q~ uq~readLinesq~uq~q~ uq~~=sq~uq~sq~uq~q~ uq~Charq~!sq~uq~ sq~uq~sq~uq~q~ uq~ q~sq~q~nq~sq~uq~sq~uq~q~ uq~MetaFileq~sq~uq~sq~uq~sq~uq~q~ uq~fileIn:sq~uq~q~4uq~@!sq~uq~q~Zsq~uq~q~ uq~ openRead:sq~uq~q~ uq~fileInq~q~lq~nq~5sq~uq~q~ uq~&fileIn: n (File openRead: n) fileInq~ssq~uq~sq~uq~q~ uq~ openRead:sq~uq~q~4uq~ !*sq~uq~q~q~sq~Huq~q~Kq~nq~5sq~uq~q~ uq~/openRead: name ^ <42 self (name printString)> q~ssq~uq~sq~uq~q~ uq~ openWrite:sq~uq~q~4uq~ !)sq~uq~q~q~sq~Huq~q~Kq~nq~5sq~uq~q~ uq~0openWrite: name ^ <41 self (name printString)> q~ssq~uq~sq~uq~q~ uq~ saveImage:sq~uq~q~4uq~!AB!D!sq~uq~sq~uq~q~ uq~ printStringq~wsq~uq~q~ uq~Image saved in file sq~uq~q~ uq~notify:sq~uq~q~ uq~Image saved in file q~sq~Huq~q~K q~nq~5sq~uq~q~ uq~tsaveImage: n <29 (n printString)>. Window notify: 'Image saved in file ' + n. ^ 'Image saved in file ' + n q~sq~q~q~q~sq~uq~q~ uq~ openWrite:sq~uq~q~ uq~fileTo:q~q~Tq~nq~sq~uq~q~ uq~LfileOut " file out class methods " ^ self fileTo: (File openWrite: name)q~ssq~uq~sq~uq~q~ uq~fileTo:sq~uq~q~4uq~!@BCEGHKMN       v!  0  !"# $ % & ' ( )!*+ , -1 ./ 0 123 4 5 6 78sq~uq~9sq~uq~q~ uq~EVAL Class addNewClass: ( sq~uq~q~ uq~namesq~uq~q~ uq~ subclass: sq~uq~sq~Huq~q~K'q~sq~uq~q~ uq~asStringsq~uq~sq~Huq~q~K'q~sq~uq~q~ uq~asStringsq~uq~q~ uq~ variables: sq~uq~sq~Huq~q~K'q~sq~uq~q~ uq~asStringsq~uq~q~ uq~asStringsq~uq~sq~Huq~q~K'q~sq~uq~q~ uq~asStringsq~uq~q~ uq~ classVariables: sq~uq~sq~Huq~q~K'q~sq~uq~q~ uq~asStringsq~uq~q~ uq~classsq~uq~q~ uq~ variablessq~uq~q~ uq~asStringsq~uq~sq~Huq~q~K'q~sq~uq~q~ uq~asStringsq~uq~q~ uq~)q~sq~uq~q~ uq~newlinesq~uq~q~ uq~asStringsq~uq~q~ uq~write:sq~uq~q~ uq~METHOD q~sq~uq~q~ uq~newlinesq~uq~q~ uq~asStringsq~uq~q~ uq~textq~sq~uq~q~ uq~newlinesq~uq~q~ uq~asStringsq~uq~q~ uq~!q~sq~uq~q~ uq~newlinesq~uq~q~ uq~asStringsq~uq~q~ uq~write:sq~uq~q~ uq~do:sq~uq~q~ uq~classsq~uq~q~ uq~methodssq~uq~q~ uq~META q~sq~uq~q~ uq~newlinesq~uq~q~ uq~asStringsq~uq~q~ uq~textq~sq~uq~q~ uq~newlinesq~uq~q~ uq~asStringsq~uq~q~ uq~!q~sq~uq~q~ uq~newlinesq~uq~q~ uq~asStringsq~uq~q~ uq~write:sq~uq~q~ uq~do:sq~uq~q~ uq~File out successfulq~sq~Huq~q~K_q~Vq~sq~uq~q~ uq~ufileTo: aFile aFile write: 'EVAL Class addNewClass: ( ' + parentClass name + ' subclass: ' + $' asString + name + $' asString + ' variables: ' + $' asString + variables asString + $' asString + ' classVariables: ' +$' asString + self class variables asString + $' asString + ')' + Char newline asString. methods do: [:m | aFile write: 'METHOD ' + name + Char newline asString + m text + Char newline asString + '!' + Char newline asString]. self class methods do: [:m | aFile write: 'META ' + name + Char newline asString + m text + Char newline asString + '!' + Char newline asString]. ^ 'File out successful' q~ssq~uq~sq~uq~q~ uq~ hierarchysq~uq~q~4uq~ Psq~uq~sq~uq~q~ uq~ hierarchy:q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~hierarchy ^ self hierarchy: 0 q~ssq~uq~q~ Fsq~uq~q~4uq~0@pQ! 0Ap0p )0D1!Qp0sq~uq~ sq~uq~q~ uq~sq~uq~q~ uq~ sq~uq~q~ uq~to:do:sq~uq~q~ uq~ subclassesq~q~ q~q~ Fsq~uq~q~ uq~do:q~sq~Huq~q~Kq~Vq~sq~uq~q~ uq~hierarchy: n | result | result <- ''. 1 to: n do: [:i | result <- result + ' ']. result <- result + name. self subclasses do: [:c | result <- result + Char newline asString + (c hierarchy: n+1) ] ^ result q~ssq~uq~sq~uq~q~ uq~instanceVariablessq~uq~q~4uq~  pAPp0pZ0sq~uq~q~ kq~q~q~sq~Huq~q~Kq~q~sq~uq~q~ uq~instanceVariables | names | " return all our variable names " parentClass notNil ifTrue: [ names <- parentClass instanceVariables ] ifFalse: [ names <- Array new: 0 ]. variables notNil ifTrue: [ names <- names + variables ]. ^ names q~ssq~uq~sq~uq~q~ uq~methodIncludesText:sq~uq~q~4uq~*@p#1!!0CF1p"Z0sq~uq~ sq~uq~q~ uq~sq~uq~q~ uq~textsq~uq~q~ uq~find:q~sq~uq~q~ uq~newlinesq~uq~q~ uq~asStringsq~uq~q~ uq~:sq~uq~q~ uq~namesq~uq~q~ uq~do:q~sq~Huq~q~Kq~Vq~sq~uq~q~ uq~methodIncludesText: str | r | r <- ''. methods do: [ :m | (m text find: str) notNil ifTrue: [ r <- r + Char newline asString + name + ':' + m name]]. ^ r q~ssq~uq~sq~uq~q~ uq~methodssq~uq~q~4uq~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~methods ^ methods q~ssq~uq~q~sq~uq~q~4uq~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~ name ^ name q~ssq~uq~sq~uq~q~ uq~name:sq~uq~q~4uq~!`sq~uq~q~q~q~nq~sq~uq~q~ uq~name: n name <- nq~ssq~uq~sq~uq~q~ uq~name:parent:variables:sq~uq~q~4uq~!`"a#dAPb"#csq~uq~sq~uq~q~ uq~breakq~sq~uq~q~ uq~new:sq~uq~q~ uq~sizesq~uq~q~ uq~sizeq~sq~Huq~q~K q~nq~sq~uq~q~ uq~name: n parent: p variables: v " private method used for initialization " name <- n. parentClass <- p. variables <- v break. methods <- Array new: 0. size <- p size + v size q~ssq~uq~q~sq~uq~q~4uq~ q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~ q~ssq~uq~sq~uq~q~ uq~ parseMethod:sq~uq~q~4uq~@! sq~uq~q~sq~uq~q~ uq~parsersq~uq~q~ uq~instanceVariablessq~uq~q~ uq~classsq~uq~q~ uq~ variablessq~uq~q~ uq~text:instanceVars:classVars:sq~uq~q~ uq~parse:q~sq~Huq~q~K q~nq~sq~uq~q~ uq~parseMethod: text ^ (Class parser text: text instanceVars: self instanceVariables classVars: self class variables) parse: self q~ssq~uq~q~sq~uq~q~4uq~sq~uq~q~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~ printString ^ name printString q~ssq~uq~sq~uq~q~ uq~ removeMethod:sq~uq~q~4uq~ 0!򂒁bsq~uq~sq~uq~q~ uq~namesq~uq~q~ uq~~=sq~uq~q~ uq~select:sq~uq~q~ uq~asArrayq~sq~Huq~q~K q~q~sq~uq~q~ uq~HremoveMethod: n methods <- (methods select: [:m | m name ~= n]) asArrayq~ssq~uq~sq~uq~q~ uq~sizesq~uq~q~4uq~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~ size ^ size q~ssq~uq~sq~uq~q~ uq~subclasssq~uq~q~4uq~@Bp0DEGqIrKsMXt4QO   u4R1 4S  4T2 4U  4V3 4W ! " #4X$%Ɣ5 1 &2 '3 ( ) *0 + , -0.TR4 / 00 15 2sq~uq~3q~wsq~uq~q~ uq~newsq~uq~q~ uq~Class Creation Formsq~uq~q~ uq~title:sq~Huq~q~Ksq~Huq~q~Ksq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~textLineq~sq~uq~q~ uq~textLineq~sq~uq~q~ uq~textLineq~sq~uq~q~ uq~new:q~sq~uq~q~ uq~namesq~uq~q~ uq~title:sq~uq~q~ uq~at:put:q~6sq~uq~q~ uq~newsq~uq~q~ uq~at:put:q~sq~uq~q~ uq~instance variablessq~uq~q~ uq~title:sq~uq~q~ uq~at:put:sq~uq~q~ uq~at:put:q~sq~uq~q~ uq~class variablessq~uq~q~ uq~title:sq~uq~q~ uq~at:put:sq~uq~q~ uq~at:put:q~sq~uq~q~ uq~sq~uq~q~ uq~title:sq~uq~q~ uq~at:put:q~sq~uq~q~ uq~ create classsq~uq~q~ uq~getTextsq~uq~q~ uq~getTextsq~uq~q~ uq~getTextsq~uq~q~ uq~"subclass:variables:classVariables:sq~uq~q~ uq~set:sq~uq~q~ uq~closesq~uq~q~ uq~ title:action:sq~uq~q~ uq~at:put:q~sq~uq~q~ uq~rows:columns:data:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showsq~uq~q~ uq~waitq~sq~Huq~q~K'q~q~sq~uq~q~ uq~subclass | w n iv cv a s | w <- Window new title: 'Class Creation Form'. w width: 400 height: 150. n <- Pane textLine. iv <- Pane textLine. cv <- Pane textLine. a <- Array new: 8. a at: 1 put: (Pane title: 'name'). s <- Semaphore new. a at: 2 put: n. a at: 3 put: (Pane title: 'instance variables'). a at: 4 put: iv. a at: 5 put: (Pane title: 'class variables'). a at: 6 put: cv. a at: 7 put: (Pane title: ''). a at: 8 put: (Pane title: 'create class' action: [ s set: (self subclass: n getText variables: iv getText classVariables: cv getText ). w close]). w setPane: (Pane rows: 4 columns: 2 data: a). w show. ^ s waitq~ssq~uq~sq~uq~q~ uq~"subclass:variables:classVariables:sq~uq~q~4uq~@B! #p0! "sq~uq~q~sq~uq~q~ uq~newsq~uq~q~ uq~Metasq~uq~q~ uq~ printStringsq~uq~q~ uq~classsq~uq~q~ uq~name:parent:variables:sq~uq~q~ uq~newsq~uq~q~ uq~name:parent:variables:q~sq~Huq~q~Kq~q~sq~uq~q~ uq~subclass: n variables: v classVariables: cv | meta | meta <- Class new name: 'Meta' + n printString parent: self class variables: cv. ^ meta new name: n parent: self variables: vq~ssq~uq~q~ ^sq~uq~q~4uq~@ 0 sq~uq~q~sq~uq~q~ uq~classessq~uq~q~ uq~ superclassq~/sq~uq~q~ uq~select:q~sq~Huq~q~Kq~q~sq~uq~q~ uq~?subclasses ^ Class classes select: [:c | c superclass = self] q~ssq~uq~q~ sq~uq~q~4uq~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~superclass ^ parentClass q~ssq~uq~sq~uq~q~ uq~ variablessq~uq~q~4uq~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~variables ^ variables q~sq~q~sq~uq~q~sq~uq~q~ uq~ parentClassq~ q~ 2q~ q~sq~uq~!sq~uq~sq~uq~q~ uq~ Applicationq~&sq~uq~sq~uq~sq~uq~q~ uq~repaintsq~uq~q~4uq~ Asq~uq~sq~uq~q~ uq~repaintsq~Huq~q~Kdsq~uq~q~ uq~sleepq~q~lq~nq~ sq~uq~q~ uq~6repaint " repaint window " ^ win repaint. 100 sleepq~ssq~uq~sq~uq~q~ uq~runsq~uq~q~4uq~Zsq~uq~q~q~q~nq~ sq~uq~q~ uq~;run " subclass must override to perform action " ^ nilq~ssq~uq~sq~uq~q~ uq~startsq~uq~q~4uq~Zsq~uq~q~q~q~nq~ sq~uq~q~ uq~Fstart " subclass should override and call title:size:pane: " ^ nilq~ssq~uq~sq~uq~q~ uq~title:size:pane:sq~uq~q~4uq~>@`!"#EFp0H"I0L-0 sq~uq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~title:sq~uq~q~ uq~size:sq~uq~q~ uq~setPane:q~sq~uq~q~ uq~runsq~uq~q~ uq~new:sq~uq~q~ uq~quitq~&sq~uq~q~ uq~haltsq~uq~q~ uq~on:do:sq~uq~q~ uq~closesq~uq~q~ uq~closesq~uq~q~ uq~on:do:sq~uq~q~ uq~addMenu:sq~uq~q~ uq~showq~sq~Huq~q~Kq~q~ sq~uq~q~ uq~title: t size: s pane: p | m | "create an application window " win <- Window new. win title: t. win size: s. win setPane: p. m <- Menu new: 'run'. m on: 'quit' do: [ Object halt ]. m on: 'close' do: [ win close ]. win addMenu: m. win show. ^ winq~sq~q~sq~uq~sq~uq~q~ uq~winq~sq~uq~sq~uq~q~ uq~MetaApplicationq~sq~uq~sq~uq~sq~uq~q~ uq~newsq~uq~q~4uq~ p000sq~uq~sq~uq~q~ uq~newsq~uq~q~ uq~startsq~uq~q~ uq~runq~q~q~q~ sq~uq~q~ uq~_new | r | " create and initialize a new application " r <- super new. r start. r run. ^ rq~sq~q~sq~uq~q~q~q~q~sq~uq~sq~uq~q~ uq~Blocksq~uq~sq~uq~q~ uq~Contextq~&sq~uq~sq~uq~sq~uq~q~ uq~ backtracesq~uq~q~4uq~*A01D򃕲FG%&Ksq~uq~ sq~uq~q~ uq~namesq~uq~q~ uq~[sq~uq~q~ uq~classsq~uq~q~ uq~ printStringsq~uq~q~ uq~,sq~uq~q~ uq~ inject:into:sq~uq~q~ uq~]q~sq~uq~q~ uq~newlinesq~uq~q~ uq~asStringsq~uq~q~ uq~ backtracesq~uq~q~ uq~ q~sq~Huq~q~Kq~Vq~ sq~uq~q~ uq~backtrace ^ method name + (arguments inject: '[' into: [:r :a | r + a class printString + ',']) + ']' + Char newline asString + (previousContext notNil ifTrue: [ previousContext backtrace ] ifFalse: [ ' '])q~ssq~uq~sq~uq~q~ uq~method:arguments:sq~uq~q~4uq~!`"a@!bPdCcPesq~uq~q~sq~uq~q~ uq~tempSizesq~uq~q~ uq~new:q~sq~uq~q~ uq~ stackSizesq~uq~q~ uq~new:q~sq~Huq~q~K q~nq~ sq~uq~q~ uq~method: aMethod arguments: a method <- aMethod. arguments <- a. temporaries <- Array new: aMethod tempSize. bytePointer <- 0. stack <- Array new: method stackSize. stackTop <- 0q~ssq~uq~sq~uq~q~ uq~perform:withArguments:sq~uq~q~4uq~"!`"a@!bPdCcPe sq~uq~q~q~q~q~q~q~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~perform: aMethod withArguments: a method <- aMethod. arguments <- a. temporaries <- Array new: aMethod tempSize. bytePointer <- 0. stack <- Array new: method stackSize. stackTop <- 0. ^ <6 self> q~sq~q~lsq~uq~sq~uq~q~ uq~methodsq~uq~q~ uq~ argumentssq~uq~q~ uq~ temporariessq~uq~q~ uq~stacksq~uq~q~ uq~ bytePointersq~uq~q~ uq~stackTopsq~uq~q~ uq~previousContextq~sq~uq~sq~uq~q~ uq~ MetaContextq~sq~uq~sq~uq~sq~uq~q~ uq~currentsq~uq~q~4uq~#sq~uq~q~q~q~nq~ &sq~uq~q~ uq~current ^ <35>q~sq~q~q~q~sq~uq~sq~uq~sq~uq~q~ uq~forksq~uq~q~4uq~ sq~uq~q~q~q~nq~ sq~uq~q~ uq~/fork " must be a no arg block " <19 self>q~ssq~uq~q~sq~uq~q~4uq~ q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~+value " start block execution " <8 self> q~ssq~uq~sq~uq~q~ uq~value:sq~uq~q~4uq~! q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~0value: a " start block execution " <8 a self> q~ssq~uq~sq~uq~q~ uq~ value:value:sq~uq~q~4uq~!" q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~;value: a value: b " start block execution " <8 a b self> q~ssq~uq~sq~uq~q~ uq~ whileFalse:sq~uq~q~4uq~ ! !Zsq~uq~q~q~q~ oq~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~TwhileFalse: aBlock self value ifFalse: [ aBlock value. ^ self whileFalse: aBlock ] q~ssq~uq~sq~uq~q~ uq~ whileTrue:sq~uq~q~4uq~ ! !Zsq~uq~q~q~q~ ~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~QwhileTrue: aBlock self value ifTrue: [ aBlock value. ^ self whileTrue: aBlock ] q~sq~sq~Huq~q~K sq~uq~sq~uq~q~ uq~argumentLocationsq~uq~q~ uq~creatingContextsq~uq~q~ uq~oldBytePointerq~sq~uq~sq~uq~q~ uq~ MetaBlockq~ &sq~uq~q~q~q~q~sq~uq~sq~uq~q~ uq~Booleanq~&sq~uq~sq~uq~sq~uq~q~ uq~and:sq~uq~q~4uq~ ! \sq~uq~q~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~Eand: aBlock ^ self ifTrue: [ aBlock value ] ifFalse: [ false ] q~ssq~uq~sq~uq~q~ uq~ifFalse:sq~uq~q~4uq~ Z !sq~uq~q~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~BifFalse: aBlock ^ self ifTrue: [ nil ] ifFalse: [ aBlock value ] q~ssq~uq~sq~uq~q~ uq~ifFalse:ifTrue:sq~uq~q~4uq~ " !sq~uq~q~q~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~iifFalse: falseBlock ifTrue: trueBlock ^ self ifTrue: [ trueBlock value ] ifFalse: [ falseBlock value ] q~ssq~uq~sq~uq~q~ uq~ifTrue:sq~uq~q~4uq~ ! Zsq~uq~q~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~AifTrue: aBlock ^ self ifTrue: [ aBlock value ] ifFalse: [ nil ] q~ssq~uq~sq~uq~q~ uq~notsq~uq~q~4uq~ \[q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~5not ^ self ifTrue: [ false ] ifFalse: [ true ] q~ssq~uq~sq~uq~q~ uq~or:sq~uq~q~4uq~ [ !sq~uq~q~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~Bor: aBlock ^ self ifTrue: [ true ] ifFalse: [ aBlock value ] q~sq~q~nq~sq~uq~sq~uq~q~ uq~ MetaBooleanq~sq~uq~q~q~q~q~q~4q~q~q~sq~uq~sq~uq~q~ uq~Colorq~&sq~uq~sq~uq~sq~uq~q~ uq~ asIntegersq~uq~q~4uq~sq~uq~q~q~q~nq~ sq~uq~q~ uq~asInteger ^ valueq~ssq~uq~sq~uq~q~ uq~ printStringsq~uq~q~4uq~@ABEFHJKMsq~uq~sq~uq~q~ uq~ Color [red sq~Huq~q~Ksq~Huq~q~Ksq~uq~q~ uq~*sq~uq~q~ uq~quo:sq~uq~q~ uq~ green sq~Huq~q~Ksq~uq~q~ uq~quo:sq~Huq~q~Ksq~uq~q~ uq~rem:sq~uq~q~ uq~ blue sq~Huq~q~Ksq~uq~q~ uq~rem:sq~uq~q~ uq~]q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~printString ^ 'Color [red ' + (value quo: 256*256) + ' green ' + ((value quo: 256) rem: 256) + ' blue ' + (value rem: 256) + ']'q~ssq~uq~sq~uq~q~ uq~ setValue:sq~uq~q~4uq~!`sq~uq~q~q~q~nq~ sq~uq~q~ uq~setValue: v value <- vq~sq~q~sq~uq~sq~uq~q~ uq~valueq~sq~uq~sq~uq~q~ uq~ MetaColorq~sq~uq~sq~uq~sq~uq~q~ uq~blacksq~uq~q~4uq~ PPPsq~uq~sq~uq~q~ uq~red:green:blue:q~q~Tq~nq~ _sq~uq~q~ uq~&black ^ self red: 0 green: 0 blue: 0q~ssq~uq~sq~uq~q~ uq~bluesq~uq~q~4uq~ PP@sq~uq~sq~Huq~q~Ksq~uq~q~ uq~red:green:blue:q~q~Tq~nq~ _sq~uq~q~ uq~'blue ^ self red: 0 green: 0 blue: 255q~ssq~uq~sq~uq~q~ uq~greensq~uq~q~4uq~ P@Psq~uq~sq~Huq~q~Ksq~uq~q~ uq~red:green:blue:q~q~Tq~nq~ _sq~uq~q~ uq~(green ^ self red: 0 green: 255 blue: 0q~ssq~uq~sq~uq~q~ uq~redsq~uq~q~4uq~ @PPsq~uq~sq~Huq~q~Ksq~uq~q~ uq~red:green:blue:q~q~Tq~nq~ _sq~uq~q~ uq~&red ^ self red: 255 green: 0 blue: 0q~ssq~uq~sq~uq~q~ uq~red:green:blue:sq~uq~q~4uq~ !A"C#sq~uq~sq~uq~q~ uq~newsq~Huq~q~Ksq~uq~q~ uq~*sq~Huq~q~Ksq~uq~q~ uq~*sq~uq~q~ uq~ setValue:q~sq~Huq~q~Kq~nq~ _sq~uq~q~ uq~Fred: r green: g blue: b ^ self new setValue: ((r * 256) + g)*256 + bq~ssq~uq~sq~uq~q~ uq~selectsq~uq~q~4uq~@ABqEy?G234v161PPNO  96  0 xP8 rP8 sP8 t w !" #p0$% &0'9()˓76 *0 + ,Z-234$ ./1 0 1 20 37 4sq~uq~5sq~uq~sq~uq~q~ uq~Imageq~&sq~uq~ sq~uq~sq~uq~q~ uq~ at:drawImage:sq~uq~q~4uq~ !!"qsq~uq~sq~uq~q~ uq~ysq~uq~q~ uq~xq~q~lq~nq~ sq~uq~q~ uq~7at: loc drawImage: img <113 self (loc y) (loc x) img>q~ssq~uq~sq~uq~q~ uq~ at:drawLine:sq~uq~q~4uq~ !!""Ussq~uq~sq~uq~q~ uq~ asIntegersq~uq~q~ uq~ysq~uq~q~ uq~xsq~uq~q~ uq~ysq~uq~q~ uq~xq~sq~Huq~q~K q~nq~ sq~uq~q~ uq~Tat: loc drawLine: to <115 self (color asInteger) (loc y) (loc x) (to y) (to x) 5>q~ssq~uq~sq~uq~q~ uq~ at:drawOval:sq~uq~q~4uq~ !!"!"!Qssq~uq~ sq~uq~q~ uq~ asIntegersq~uq~q~ uq~ysq~uq~q~ uq~xsq~uq~q~ uq~ysq~uq~q~ uq~ysq~uq~q~ uq~-sq~uq~q~ uq~xsq~uq~q~ uq~xsq~uq~q~ uq~-q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~`at: loc drawOval: s <115 self (color asInteger) (loc y) (loc x) (s y - loc y) (s x - loc x) 1>q~ssq~uq~sq~uq~q~ uq~ at:drawRect:sq~uq~q~4uq~ !!"!"!Sssq~uq~ sq~uq~q~ uq~ asIntegersq~uq~q~ uq~ysq~uq~q~ uq~xsq~uq~q~ uq~ysq~uq~q~ uq~ysq~uq~q~ uq~-sq~uq~q~ uq~xsq~uq~q~ uq~xsq~uq~q~ uq~-q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~`at: loc drawRect: s <115 self (color asInteger) (loc y) (loc x) (s y - loc y) (s x - loc x) 3>q~ssq~uq~sq~uq~q~ uq~ at:fillOval:sq~uq~q~4uq~ !!"!"!Rssq~uq~ sq~uq~q~ uq~ asIntegersq~uq~q~ uq~ysq~uq~q~ uq~xsq~uq~q~ uq~ysq~uq~q~ uq~ysq~uq~q~ uq~-sq~uq~q~ uq~xsq~uq~q~ uq~xsq~uq~q~ uq~-q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~`at: loc fillOval: s <115 self (color asInteger) (loc y) (loc x) (s y - loc y) (s x - loc x) 2>q~ssq~uq~sq~uq~q~ uq~ at:fillRect:sq~uq~q~4uq~ !!"!"!Tssq~uq~ sq~uq~q~ uq~ asIntegersq~uq~q~ uq~ysq~uq~q~ uq~xsq~uq~q~ uq~ysq~uq~q~ uq~ysq~uq~q~ uq~-sq~uq~q~ uq~xsq~uq~q~ uq~xsq~uq~q~ uq~-q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~`at: loc fillRect: s <115 self (color asInteger) (loc y) (loc x) (s y - loc y) (s x - loc x) 4>q~ssq~uq~sq~uq~q~ uq~at:text:sq~uq~q~4uq~ !!"rsq~uq~sq~uq~q~ uq~ asIntegersq~uq~q~ uq~ysq~uq~q~ uq~xq~q~q~nq~ sq~uq~q~ uq~@at: loc text: t <114 self (color asInteger) (loc y) (loc x) t>q~ssq~uq~sq~uq~q~ uq~editsq~uq~q~4uq~@Bp0DEG qZrIt1"5r1+Zr1E2C 277r0DZR s3Qb     3R|4 0   0ZZZ RQ3 !1 " #0 $4 %sq~uq~&q~wsq~uq~q~ uq~newsq~uq~q~ uq~ Image editorsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~K,sq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~image:q~6sq~uq~q~ uq~newsq~uq~q~ uq~ onMouseDown:sq~uq~q~ uq~ onMouseUp:sq~uq~q~ uq~ at:drawLine:sq~uq~q~ uq~repaintsq~uq~q~ uq~ onMouseMove:q~sq~uq~q~ uq~new:q~sq~uq~q~ uq~colorq~ sq~uq~q~ uq~selectsq~uq~q~ uq~ setColor:sq~uq~q~ uq~ title:action:sq~uq~q~ uq~at:put:q~sq~uq~q~ uq~closesq~uq~q~ uq~set:sq~uq~q~ uq~closesq~uq~q~ uq~ title:action:sq~uq~q~ uq~at:put:q~q~sq~uq~q~ uq~rows:columns:data:sq~uq~q~ uq~north:south:east:west:center:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showsq~uq~q~ uq~waitq~sq~Huq~q~K$q~q~ sq~uq~q~ uq~pedit | w p pp b s | w <- Window new title: 'Image editor'. w width: 300 height: 300. p <- Pane image: self. pp <- nil. s <- Semaphore new. p onMouseDown: [:np | pp <- np]. p onMouseUp: [:np | pp <- nil ]. p onMouseMove: [:np | pp notNil ifTrue: [ self at: pp drawLine: np. pp <- np. w repaint ] ]. b <- Array new: 2. b at: 1 put: (Pane title: 'color' action: [ self setColor: Color select ]). b at: 2 put: (Pane title: 'close' action: [ s set: self. w close ]). w setPane: (Pane north: nil south: nil east: nil west: (Pane rows: 2 columns: 1 data: b) center: p). w show. ^ s waitq~ssq~uq~sq~uq~q~ uq~ setColor:sq~uq~q~4uq~!`sq~uq~q~q~q~nq~ sq~uq~q~ uq~setColor: c color <- cq~sq~q~sq~uq~sq~uq~q~ uq~colorq~sq~uq~sq~uq~q~ uq~ MetaImageq~sq~uq~sq~uq~sq~uq~q~ uq~ fromFile:sq~uq~q~4uq~ !osq~uq~q~q~q~nq~Asq~uq~q~ uq~fromFile: n ^ <111 self n>q~ssq~uq~sq~uq~q~ uq~size:sq~uq~q~4uq~ !!sq~uq~sq~uq~q~ uq~xsq~uq~q~ uq~ysq~uq~q~ uq~ width:height:q~sq~Huq~q~K q~nq~Asq~uq~q~ uq~+size: s ^ self width: (s x) height: (s y)q~ssq~uq~sq~uq~q~ uq~ width:height:sq~uq~q~4uq~@ !"nAsq~uq~q~&q~ sq~uq~q~ uq~blacksq~uq~q~ uq~in:add:q~q~Tq~nq~Asq~uq~q~ uq~fwidth: w height: h " make a blank image of given size " ^ Object in: <110 self w h> add: Color blackq~sq~q~sq~uq~q~q~q~sq~Huq~q~Ksq~Huq~q~Ksq~uq~q~ uq~@sq~uq~q~ uq~size:q~sq~uq~q~ uq~textLineq~ sq~uq~q~ uq~getIndexsq~uq~q~ uq~getIndexsq~uq~q~ uq~getIndexsq~uq~q~ uq~red:green:blue:sq~uq~q~ uq~ setColor:sq~uq~q~ uq~@sq~Huq~q~Ksq~Huq~q~Ksq~uq~q~ uq~@sq~uq~q~ uq~ at:fillRect:sq~uq~q~ uq~ printStringsq~uq~q~ uq~setText:sq~uq~q~ uq~repaintq~sq~Huq~q~Ksq~uq~q~ uq~vSliderFrom:to:do:q~sq~Huq~q~Ksq~uq~q~ uq~vSliderFrom:to:do:q~sq~Huq~q~Ksq~uq~q~ uq~vSliderFrom:to:do:q~6sq~uq~q~ uq~newq~wsq~uq~q~ uq~newsq~uq~q~ uq~Color Selectorsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Ksq~uq~q~ uq~ width:height:q~q~sq~uq~q~ uq~returnsq~uq~q~ uq~set:sq~uq~q~ uq~closesq~uq~q~ uq~ title:action:q~sq~uq~q~ uq~row:q~sq~uq~q~ uq~image:sq~uq~q~ uq~north:south:east:west:center:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showsq~uq~q~ uq~waitq~sq~Huq~q~K(sq~Huq~q~K q~ _sq~uq~q~ uq~select | w i r g b p c s k t | " color selection window " i <- Image size: 200@200. t <- Pane textLine. k <- [:x | c <- Color red: r getIndex green: g getIndex blue: b getIndex. i setColor: c. i at: 0@0 fillRect: 200@200. t setText: c printString. w repaint ]. r <- Pane vSliderFrom: 0 to: 255 do: k. g <- Pane vSliderFrom: 0 to: 255 do: k. b <- Pane vSliderFrom: 0 to: 255 do: k. s <- Semaphore new. w <- Window new title: 'Color Selector'. w width: 300 height: 250. w setPane: (Pane north: t south: (Pane title: 'return' action: [ s set: c. w close ]) east: nil west: (Pane row: #(r g b)) center: (Pane image: i)). w show. ^ s waitq~ssq~uq~sq~uq~q~ uq~whitesq~uq~q~4uq~ @ABsq~uq~sq~Huq~q~Ksq~Huq~q~Ksq~Huq~q~Ksq~uq~q~ uq~red:green:blue:q~q~Tq~nq~ _sq~uq~q~ uq~,white ^ self red: 255 green: 255 blue: 255q~sq~q~sq~uq~q~q~q~q~ q~Zsq~uq~sq~uq~q~ uq~Floatq~Usq~uq~sq~uq~sq~uq~q~ uq~*sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~ multByFloat:q~q~lq~nq~sq~uq~q~ uq~* arg ^ arg multByFloat: selfq~ssq~uq~sq~uq~q~ uq~+sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~ addToFloat:q~q~lq~nq~sq~uq~q~ uq~+ arg ^ arg addToFloat: selfq~ssq~uq~sq~uq~q~ uq~-sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~subtractFromFloat:q~q~lq~nq~sq~uq~q~ uq~$- arg ^ arg subtractFromFloat: selfq~ssq~uq~sq~uq~q~ uq~/sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~divideByFloat:q~q~lq~nq~sq~uq~q~ uq~ / arg ^ arg divideByFloat: selfq~ssq~uq~sq~uq~q~ uq~q~ssq~uq~sq~uq~q~ uq~asFloatsq~uq~q~4uq~ sq~uq~q~q~q~nq~sq~uq~q~ uq~asFloat ^ selfq~ssq~uq~sq~uq~q~ uq~ asIntegersq~uq~q~4uq~ 9sq~uq~q~q~q~nq~sq~uq~q~ uq~5asInteger "convert self into integer" ^ <57 self>q~ssq~uq~sq~uq~q~ uq~divideByFloat:sq~uq~q~4uq~@ !6sq~uq~q~q~q~q~nq~sq~uq~q~ uq~)divideByFloat: arg ^ <54 Float self arg>q~ssq~uq~sq~uq~q~ uq~ equalToFloat:sq~uq~q~4uq~ !8sq~uq~q~q~q~nq~sq~uq~q~ uq~"equalToFloat: arg ^ <56 self arg>q~ssq~uq~sq~uq~q~ uq~lessThanFloat:sq~uq~q~4uq~ !7sq~uq~q~q~q~nq~sq~uq~q~ uq~#lessThanFloat: arg ^ <55 self arg>q~ssq~uq~sq~uq~q~ uq~lessThanSmallInt:sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~asFloatq~q~q~nq~sq~uq~q~ uq~(lessThanSmallInt: s ^ s asFloat < selfq~ssq~uq~sq~uq~q~ uq~ multByFloat:sq~uq~q~4uq~@ !5sq~uq~q~q~q~q~nq~sq~uq~q~ uq~'multByFloat: arg ^ <53 Float self arg>q~ssq~uq~sq~uq~q~ uq~ printStringsq~uq~q~4uq~@ ;sq~uq~q~ q~q~q~nq~sq~uq~q~ uq~printString ^ <59 String self>q~ssq~uq~sq~uq~q~ uq~subtractFromFloat:sq~uq~q~4uq~@ !4sq~uq~q~q~q~q~nq~sq~uq~q~ uq~-subtractFromFloat: arg ^ <52 Float self arg>q~sq~q~nsq~uq~q~sq~uq~sq~uq~q~ uq~ MetaFloatsq~uq~sq~uq~q~ uq~ MetaNumericq~sq~uq~q~q~q~q~sq~uq~sq~uq~sq~uq~q~ uq~newsq~uq~q~4uq~ @sq~uq~sq~uq~q~ uq~!floats cannot be created with newsq~uq~q~ uq~error:q~q~lq~nq~sq~uq~q~ uq~6new ^ self error: 'floats cannot be created with new'q~ssq~uq~sq~uq~q~ uq~randomsq~uq~q~4uq~ :sq~uq~q~q~q~nq~sq~uq~q~ uq~6random " return a new random number " ^ <58 self>q~sq~q~sq~uq~q~q~sq~uq~sq~uq~q~ uq~Fractionq~Usq~uq~sq~uq~sq~uq~q~ uq~*sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~multByFraction:q~q~lq~nq~7sq~uq~q~ uq~!* arg ^ arg multByFraction: selfq~ssq~uq~sq~uq~q~ uq~+sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~addToFraction:q~q~lq~nq~7sq~uq~q~ uq~ + arg ^ arg addToFraction: selfq~ssq~uq~sq~uq~q~ uq~-sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~subtractFromFraction:q~q~lq~nq~7sq~uq~q~ uq~'- arg ^ arg subtractFromFraction: selfq~ssq~uq~sq~uq~q~ uq~/sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~divideByFraction:q~q~lq~nq~7sq~uq~q~ uq~#/ arg ^ arg divideByFraction: selfq~ssq~uq~sq~uq~q~ uq~addToFraction:sq~uq~q~4uq~@!!!sq~uq~q~7sq~uq~q~ uq~bottomsq~uq~q~ uq~*sq~uq~q~ uq~topsq~uq~q~ uq~*sq~uq~q~ uq~bottomsq~uq~q~ uq~*sq~uq~q~ uq~ top:bottom:q~sq~Huq~q~Kq~nq~7sq~uq~q~ uq~eaddToFraction: arg ^ Fraction top: top * arg bottom + (bottom * arg top) bottom: bottom * arg bottomq~ssq~uq~sq~uq~q~ uq~addToSmallInt:sq~uq~q~4uq~ @! sq~uq~q~7sq~uq~q~ uq~top:q~q~q~nq~7sq~uq~q~ uq~0addToSmallInt: arg ^ (Fraction top: arg) + selfq~ssq~uq~sq~uq~q~ uq~asFloatsq~uq~q~4uq~ sq~uq~sq~uq~q~ uq~asFloatsq~uq~q~ uq~asFloatsq~uq~q~ uq~/q~q~Tq~nq~7sq~uq~q~ uq~'asFloat ^ top asFloat / bottom asFloatq~ssq~uq~sq~uq~q~ uq~bottomsq~uq~q~4uq~sq~uq~q~q~q~nq~7sq~uq~q~ uq~bottom ^ bottomq~ssq~uq~sq~uq~q~ uq~divideByFraction:sq~uq~q~4uq~@!!sq~uq~q~7sq~uq~q~ uq~topsq~uq~q~ uq~*sq~uq~q~ uq~bottomsq~uq~q~ uq~*sq~uq~q~ uq~ top:bottom:q~sq~Huq~q~K q~nq~7sq~uq~q~ uq~PdivideByFraction: arg ^ Fraction top: arg top * bottom bottom: arg bottom * topq~ssq~uq~sq~uq~q~ uq~divideBySmallInt:sq~uq~q~4uq~ @! sq~uq~q~7sq~uq~q~ uq~top:sq~uq~q~ uq~/q~q~q~nq~7sq~uq~q~ uq~3divideBySmallInt: arg ^ (Fraction top: arg) / selfq~ssq~uq~sq~uq~q~ uq~multByFraction:sq~uq~q~4uq~@!!sq~uq~q~7sq~uq~q~ uq~topsq~uq~q~ uq~*sq~uq~q~ uq~bottomsq~uq~q~ uq~*sq~uq~q~ uq~ top:bottom:q~sq~Huq~q~K q~nq~7sq~uq~q~ uq~NmultByFraction: arg ^ Fraction top: top * arg top bottom: bottom * arg bottomq~ssq~uq~sq~uq~q~ uq~multBySmallInt:sq~uq~q~4uq~ @! sq~uq~q~7sq~uq~q~ uq~top:sq~uq~q~ uq~*q~q~q~nq~7sq~uq~q~ uq~1multBySmallInt: arg ^ (Fraction top: arg) * selfq~ssq~uq~sq~uq~q~ uq~ printStringsq~uq~q~4uq~@BDsq~uq~sq~uq~q~ uq~(sq~uq~q~ uq~ printStringsq~uq~q~ uq~/sq~uq~q~ uq~ printStringsq~uq~q~ uq~)q~sq~Huq~q~Kq~nq~7sq~uq~q~ uq~EprintString ^ '(' + top printString + '/' + bottom printString + ')'q~ssq~uq~sq~uq~q~ uq~subtractFromFraction:sq~uq~q~4uq~@!!!sq~uq~ q~7sq~uq~q~ uq~topsq~uq~q~ uq~*sq~uq~q~ uq~bottomsq~uq~q~ uq~*sq~uq~q~ uq~-sq~uq~q~ uq~bottomsq~uq~q~ uq~*sq~uq~q~ uq~ top:bottom:q~sq~Huq~q~Kq~nq~7sq~uq~q~ uq~lsubtractFromFraction: arg ^ Fraction top: arg top * bottom - (top * arg bottom) bottom: bottom * arg bottomq~ssq~uq~sq~uq~q~ uq~subtractFromSmallInt:sq~uq~q~4uq~ @! sq~uq~q~7sq~uq~q~ uq~top:sq~uq~q~ uq~-q~q~q~nq~7sq~uq~q~ uq~7subtractFromSmallInt: arg ^ (Fraction top: arg) - selfq~ssq~uq~sq~uq~q~ uq~topsq~uq~q~4uq~sq~uq~q~q~q~nq~7sq~uq~q~ uq~ top ^ topq~sq~q~Vsq~uq~sq~uq~q~ uq~topsq~uq~q~ uq~bottomq~sq~uq~sq~uq~q~ uq~ MetaFractionq~ sq~uq~sq~uq~sq~uq~q~ uq~top:sq~uq~q~4uq~ Q!RQsq~uq~sq~uq~q~ uq~newsq~uq~q~ uq~ in:at:put:sq~uq~q~ uq~ in:at:put:q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~Atop: t ^ self in: (self in: super new at: 1 put: t) at: 2 put: 1q~ssq~uq~sq~uq~q~ uq~ top:bottom:sq~uq~q~4uq~,"P AZ!"p Q!0R"0sq~uq~ sq~uq~q~ uq~=sq~uq~q~ uq~ division by zero in fractionsq~uq~q~ uq~error:sq~uq~q~ uq~gcd:sq~uq~q~ uq~newsq~uq~q~ uq~quo:sq~uq~q~ uq~ in:at:put:sq~uq~q~ uq~quo:sq~uq~q~ uq~ in:at:put:q~sq~Huq~q~Kq~q~sq~uq~q~ uq~top: t bottom: b | r | b = 0 ifTrue: [ ^ self error: ' division by zero in fraction']. r <- t gcd: b. ^ self in: (self in: super new at: 1 put: (t quo: r)) at: 2 put: (b quo: r)q~sq~q~sq~uq~q~q~q~ q~q~Psq~uq~sq~uq~q~ uq~Intervalq~sq~uq~sq~uq~sq~uq~q~ uq~do:sq~uq~q~4uq~p0!00pZsq~uq~sq~uq~q~ uq~value:q~sq~Huq~q~K q~q~sq~uq~q~ uq~do: aBlock | current | current <- low. [ current <= high ] whileTrue: [ aBlock value: current. current <- current + step ] q~ssq~uq~sq~uq~q~ uq~ reverseDo:sq~uq~q~4uq~p0!00pZsq~uq~sq~uq~q~ uq~>=sq~uq~q~ uq~value:sq~uq~q~ uq~-q~q~Tq~q~sq~uq~q~ uq~reverseDo: aBlock | current | current <- high. [ current >= low ] whileTrue: [ aBlock value: current. current <- current - step ] q~sq~q~ksq~uq~sq~uq~q~ uq~lowsq~uq~q~ uq~highsq~uq~q~ uq~stepq~sq~uq~sq~uq~q~ uq~ MetaIntervalsq~uq~sq~uq~q~ uq~MetaCollectionq~sq~uq~q~q~q~q~sq~uq~sq~uq~sq~uq~q~ uq~ from:to:by:sq~uq~q~4uq~ Q!p 0R" 0S#0sq~uq~q~q~q~q~q~sq~Huq~q~Kq~q~)sq~uq~q~ uq~from: l to: h by: s | newInterval | newInterval <- self in: self new at: 1 put: l. self in: newInterval at: 2 put: h. self in: newInterval at: 3 put: s. ^ newInterval q~sq~q~q~q~sq~uq~sq~uq~q~ uq~ LargeNegativeq~Psq~uq~ sq~uq~sq~uq~q~ uq~*sq~uq~q~4uq~ !sq~uq~sq~uq~q~ uq~negatedsq~uq~q~ uq~*sq~uq~q~ uq~negatedq~q~q~nq~Fsq~uq~q~ uq~%* arg ^ (self negated * arg) negatedq~ssq~uq~sq~uq~q~ uq~+sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~negatedsq~uq~q~ uq~-q~q~q~nq~Fsq~uq~q~ uq~+ arg ^ arg - self negatedq~ssq~uq~sq~uq~q~ uq~-sq~uq~q~4uq~ !sq~uq~sq~uq~q~ uq~negatedsq~uq~q~ uq~negatedq~q~Tq~nq~Fsq~uq~q~ uq~%- arg ^ (self negated + arg) negatedq~ssq~uq~sq~uq~q~ uq~Pp@r!P$340q1Cp21E0P3204ZK2sq~uq~sq~uq~sq~uq~q~ uq~Listq~sq~uq~ sq~uq~sq~uq~q~ uq~add:sq~uq~q~4uq~ ZQa!sq~uq~q~ 2q~/sq~uq~q~ uq~ reallocateq~!q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~add: newElement (current = values size) ifTrue: [ self reallocate ]. current <- current + 1. values at: current put: newElement q~ssq~uq~sq~uq~q~ uq~ addFirst:sq~uq~q~4uq~ !Qsq~uq~sq~uq~q~ uq~ insert:at:q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~4addFirst: newElement self insert: newElement at: 1 q~ssq~uq~sq~uq~q~ uq~ at:ifAbsent:sq~uq~q~4uq~! !""sq~uq~sq~uq~q~ uq~ includesKey:q~q~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~at: position ifAbsent: exceptionBlock ^ (values includesKey: position) ifTrue: [ values at: position ifAbsent: exceptionBlock ] ifFalse: [ exceptionBlock value ] q~ssq~uq~q~!sq~uq~q~4uq~! !" Bsq~uq~q~q~!sq~uq~q~ uq~ Index errorsq~uq~q~ uq~error:q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~at: position put: newElement (values includesKey: position) ifTrue: [ values at: position put: newElement ] ifFalse: [ self error: 'Index error'] q~ssq~uq~q~sq~uq~q~4uq~G"Q "Q[ AZ% &Z"80Q0Qa"!sq~uq~ sq~uq~q~ uq~>sq~uq~q~ uq~invalid index for insert:at:q~q~ 2q~/q~sq~uq~q~ uq~to:sq~uq~q~ uq~at:q~!sq~uq~q~ uq~ reverseDo:q~!q~sq~Huq~q~Kq~q~sq~uq~q~ uq~Cinsert: value at: position ((position < 1) or: [ position > (current+1)]) ifTrue: [ self error: 'invalid index for insert:at:']. (current = values size) ifTrue: [ self reallocate ]. (position to: current) reverseDo: [:i | values at: i+1 put: (values at: i)]. current <- current + 1. values at: position put: value q~ssq~uq~q~sq~uq~q~4uq~ sq~uq~q~q~q~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~4printString ^ self class name + super printString q~ssq~uq~q~sq~uq~q~4uq~!@RpQ0110`sq~uq~q~q~ 2sq~uq~q~ uq~*q~q~ 2q~q~!q~ [q~sq~Huq~q~Kq~Vq~sq~uq~q~ uq~reallocate | newArray | newArray <- Array new: 2 * values size. 1 to: values size do: [:i | newArray at: i put: (values at: i) ]. values <- newArray q~ssq~uq~sq~uq~q~ uq~remove:sq~uq~q~4uq~ !Zsq~uq~sq~uq~q~ uq~remove:ifAbsent:q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~4remove: element self remove: element ifAbsent: [ ] q~ssq~uq~q~ sq~uq~q~4uq~ ! "򃑂sq~uq~q~sq~uq~q~ uq~indexOf:ifAbsent:sq~uq~q~ uq~ removeAt:q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~xremove: element ifAbsent: exceptionBlock self removeAt: (self indexOf: element ifAbsent: [ ^ exceptionBlock value]) q~ssq~uq~sq~uq~q~ uq~ removeAt:sq~uq~q~4uq~(!Q AZQa!$00Qsq~uq~sq~uq~q~ uq~ between:and:sq~uq~q~ uq~invalid index for removeAt:sq~uq~q~ uq~error:sq~uq~q~ uq~-sq~uq~q~ uq~at:sq~uq~q~ uq~at:put:sq~uq~q~ uq~to:do:q~sq~Huq~q~Kq~q~sq~uq~q~ uq~removeAt: index (index between: 1 and: current) ifFalse: [ self error: 'invalid index for removeAt:']. current <- current - 1. index to: current do: [:i | values at: i put: (values at: i+1)] q~ssq~uq~q~ 2sq~uq~q~4uq~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~size ^ current q~sq~q~Vsq~uq~sq~uq~q~ uq~valuessq~uq~q~ uq~currentq~sq~uq~sq~uq~q~ uq~MetaListsq~uq~sq~uq~q~ uq~ MetaIndexedq~.sq~uq~q~q~q~q~sq~uq~sq~uq~q~sq~uq~q~4uq~ QAURPsq~uq~q~q~q~q~q~q~sq~Huq~q~Kq~nq~psq~uq~q~ uq~Lnew ^ self in: (self in: super new at: 1 put: (Array new: 5)) at: 2 put: 0 q~sq~q~q~q~sq~uq~q~ uq~newsq~uq~q~ uq~valuessq~Huq~q~Kdsq~uq~q~ uq~quo:sq~Huq~q~Kdsq~uq~q~ uq~rem:sq~uq~q~ uq~add:sq~uq~q~ uq~ with:pad:do:sq~uq~q~ uq~=sq~uq~q~ uq~add:q~%sq~uq~q~ uq~ asByteArraysq~uq~q~ uq~new:q~sq~Huq~q~Kq~q~%sq~uq~q~ uq~!addToLP: arg | carry nv newValue | carry <- 0. newValue <- List new. values with: arg values pad: 0 do: [:lv :rv | nv <- lv + rv + carry. carry <- nv quo: 100. newValue add: (nv rem: 100)]. (carry = 0) ifFalse: [ newValue add: carry]. ^ LargePositive new: newValue asByteArray q~ssq~uq~sq~uq~q~ uq~asFloatsq~uq~q~4uq~Pp0A1p0sq~uq~sq~uq~q~ uq~asFloatsq~Huq~q~Kdsq~uq~q~ uq~*sq~uq~q~ uq~ reverseDo:q~sq~Huq~q~K q~Vq~%sq~uq~q~ uq~PasFloat | r | r <- 0 asFloat. values reverseDo: [:e | r <- r * 100 + e]. ^ rq~ssq~uq~sq~uq~q~ uq~ compareToLP:sq~uq~q~4uq~%Pp!P1212BQpZ0sq~uq~sq~uq~q~ uq~valuessq~uq~q~ uq~=sq~Huq~q~Ksq~uq~q~ uq~ with:pad:do:q~sq~Huq~q~K q~kq~%sq~uq~q~ uq~compareToLP: arg | r | r <- 0. values with: arg values pad: 0 do: [ :lv :rv | (lv = rv) ifFalse: [r <- (lv < rv) ifTrue: [-1] ifFalse: [1]]]. ^ rq~ssq~uq~sq~uq~q~ uq~ multByLP:sq~uq~q~4uq~&@pB0P!4pI0sq~uq~ q~sq~uq~q~ uq~newq~%sq~uq~q~ uq~ addFirst:sq~uq~q~ uq~new:sq~uq~q~ uq~*sq~uq~q~ uq~valuessq~uq~q~ uq~asListsq~uq~q~ uq~ reverseDo:q~%sq~uq~q~ uq~ asByteArraysq~uq~q~ uq~new:q~sq~Huq~q~Kq~q~%sq~uq~q~ uq~multByLP: arg | r a b c| r <- List new. values reverseDo: [:e | r <- ((LargePositive new: (r addFirst: 0)) + (arg * e)) values asList ]. ^ LargePositive new: r asByteArrayq~ssq~uq~sq~uq~q~ uq~multBySmallInt:sq~uq~q~4uq~\!P !ZPpCq32!0p10F0Ip0PN10M0 p6Z1  sq~uq~sq~uq~q~ uq~negatedsq~uq~q~ uq~multBySmallInt:sq~uq~q~ uq~negatedq~sq~uq~q~ uq~newsq~uq~q~ uq~*sq~Huq~q~Kdsq~uq~q~ uq~rem:sq~uq~q~ uq~add:sq~Huq~q~Kdsq~uq~q~ uq~quo:sq~uq~q~ uq~do:sq~uq~q~ uq~>sq~Huq~q~Kdsq~uq~q~ uq~rem:sq~uq~q~ uq~add:sq~Huq~q~Kdsq~uq~q~ uq~quo:q~%sq~uq~q~ uq~ asByteArraysq~uq~q~ uq~new:q~sq~Huq~q~Kq~kq~%sq~uq~q~ uq~multBySmallInt: arg | carry newValue | " private internal method " arg < 0 ifTrue: [ ^ (self multBySmallInt: arg negated) negated ]. carry <- 0. newValue <- List new. values do: [:e | carry <- e * arg + carry. newValue add: (carry rem: 100). carry <- carry quo: 100 ]. [ carry > 0 ] whileTrue: [ newValue add: (carry rem: 100). carry <- carry quo: 100 ]. ^ LargePositive new: newValue asByteArrayq~ssq~uq~sq~uq~q~ uq~negatedsq~uq~q~4uq~@sq~uq~q~Fsq~uq~q~ uq~new:q~q~lq~nq~%sq~uq~q~ uq~$negated ^ LargeNegative new: valuesq~ssq~uq~sq~uq~q~ uq~ printStringsq~uq~q~4uq~@A1R0sq~uq~sq~uq~q~ uq~sq~uq~q~ uq~00sq~uq~q~ uq~ printStringsq~uq~q~ uq~last:sq~uq~q~ uq~ inject:into:q~sq~Huq~q~Kq~Vq~%sq~uq~q~ uq~SprintString ^ values inject: '' into: [:r :e | ('00' + e printString last: 2) + r]q~ssq~uq~sq~uq~q~ uq~subtractFromLP:sq~uq~q~4uq~:Pp@q!P.20r23#2DrQp%Pp123H1sq~uq~ q~sq~uq~q~ uq~newsq~uq~q~ uq~valuessq~uq~q~ uq~-sq~Huq~q~Kdsq~uq~q~ uq~-sq~uq~q~ uq~add:sq~uq~q~ uq~ with:pad:do:q~%sq~uq~q~ uq~ asByteArraysq~uq~q~ uq~new:q~sq~Huq~q~Kq~hq~%sq~uq~q~ uq~asubtractFromLP: arg | borrow newValue | " private internal method, know we are smaller than arg " borrow <- 0. newValue <- List new. arg values with: values pad: 0 do: [ :lv :rv | lv <- lv - borrow. (lv < rv) ifTrue: [ lv <- lv + 100. borrow <- 1] ifFalse: [ borrow <- 0]. newValue add: (lv - rv)]. ^ LargePositive new: newValue asByteArray q~ssq~uq~sq~uq~q~ uq~valuessq~uq~q~4uq~sq~uq~q~q~q~nq~%sq~uq~q~ uq~values ^ valuesq~sq~q~sq~uq~sq~uq~q~ uq~valuesq~sq~uq~sq~uq~q~ uq~MetaLargePositivesq~uq~sq~uq~q~ uq~ MetaIntegerq~sq~uq~q~q~q~q~sq~uq~sq~uq~sq~uq~q~ uq~new:sq~uq~q~4uq~ Q!sq~uq~sq~uq~q~ uq~newsq~uq~q~ uq~ in:at:put:q~sq~Huq~q~K q~nq~sq~uq~q~ uq~+new: v ^ self in: super new at: 1 put: vq~sq~q~sq~uq~q~q~sq~uq~q~ uq~new:q~q~lq~nq~Fsq~uq~q~ uq~$negated ^ LargePositive new: valuesq~ssq~uq~sq~uq~q~ uq~ printStringsq~uq~q~4uq~ @ sq~uq~sq~uq~q~ uq~-sq~uq~q~ uq~negatedsq~uq~q~ uq~ printStringq~q~Tq~nq~Fsq~uq~q~ uq~-printString ^ '-' + self negated printStringq~ssq~uq~sq~uq~q~ uq~subtractFromLP:sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~negatedq~q~q~nq~Fsq~uq~q~ uq~FsubtractFromLP: arg " private internal method " ^ arg + self negatedq~sq~q~sq~uq~sq~uq~q~ uq~valuesq~sq~uq~sq~uq~q~ uq~MetaLargeNegativeq~sq~uq~sq~uq~sq~uq~q~ uq~new:sq~uq~q~4uq~ Q!sq~uq~sq~uq~q~ uq~newsq~uq~q~ uq~ in:at:put:q~sq~Huq~q~K q~nq~sq~uq~q~ uq~)new: v ^ self in: super new at: 1 put: vq~sq~q~sq~uq~q~q~q~%q~q~!q~q~sq~Uq~&sq~uq~sq~uq~q~ uq~Orderedq~sq~uq~sq~uq~q~sq~uq~q~4uq~7 !R-!0Q&00Q,0!Q!sq~uq~ q~q~q~q~q~ bq~q~q~!q~!q~q~!q~sq~Huq~q~Kq~q~0sq~uq~q~ uq~add: newElement super add: newElement. (2 to: current) reverseDo: [:i | (testBlock value: newElement value: (values at: i-1)) ifTrue: [ values at: i put: (values at: i-1) ] ifFalse: [ ^ values at: i put: newElement] ]. values at: 1 put: newElement q~ssq~uq~q~!sq~uq~q~4uq~ @sq~uq~sq~uq~q~ uq~/Cannot insert into ordered collection using at:q~q~sq~Huq~q~Kq~nq~0sq~uq~q~ uq~Tat: index put: value self error: 'Cannot insert into ordered collection using at:' q~ssq~uq~q~sq~uq~q~4uq~ @sq~uq~sq~uq~q~ uq~3Cannot insert into ordered collection using insert:q~q~sq~Huq~q~Kq~nq~0sq~uq~q~ uq~[insert: value at: index self error: 'Cannot insert into ordered collection using insert:' q~sq~q~ksq~uq~sq~uq~q~ uq~ testBlockq~sq~uq~sq~uq~q~ uq~ MetaOrderedq~psq~uq~sq~uq~q~sq~uq~q~4uq~ 01sq~uq~q~q~sq~Huq~q~Kq~Vq~fsq~uq~q~ uq~"new ^ self new: [:a :b | a < b ] q~ssq~uq~q~sq~uq~q~4uq~ S!sq~uq~q~q~q~sq~Huq~q~Kq~nq~fsq~uq~q~ uq~:new: testBlock ^ self in: super new at: 3 put: testBlock q~sq~q~q~q~q~sq~uq~sq~uq~q~ uq~Pointq~!sq~uq~sq~uq~sq~uq~q~ uq~+sq~uq~q~4uq~!!sq~uq~sq~uq~q~ uq~xsq~uq~q~ uq~ysq~uq~q~ uq~@q~sq~Huq~q~K q~nq~sq~uq~q~ uq~1+ d " add two points " ^ (x + d x) @ (y + d y)q~ssq~uq~sq~uq~q~ uq~ printStringsq~uq~q~4uq~ Asq~uq~sq~uq~q~ uq~ printStringsq~uq~q~ uq~@sq~uq~q~ uq~ printStringq~sq~Huq~q~K q~nq~sq~uq~q~ uq~4printString ^ x printString + '@' + y printStringq~ssq~uq~sq~uq~q~ uq~xsq~uq~q~4uq~sq~uq~q~q~q~nq~sq~uq~q~ uq~x ^ xq~ssq~uq~sq~uq~q~ uq~x:sq~uq~q~4uq~!`sq~uq~q~q~q~nq~sq~uq~q~ uq~x: ix x <- ixq~ssq~uq~sq~uq~q~ uq~x:y:sq~uq~q~4uq~!`"asq~uq~q~q~q~nq~sq~uq~q~ uq~x: ix y: iy x <- ix. y <- iyq~ssq~uq~sq~uq~q~ uq~ysq~uq~q~4uq~sq~uq~q~q~q~nq~sq~uq~q~ uq~y ^ yq~ssq~uq~sq~uq~q~ uq~y:sq~uq~q~4uq~!asq~uq~q~q~q~nq~sq~uq~q~ uq~y: iy y <- iyq~sq~q~Vsq~uq~sq~uq~q~ uq~xsq~uq~q~ uq~yq~sq~uq~sq~uq~q~ uq~ MetaPointq~sq~uq~q~q~sq~uq~q~q~q~q~6q~Kq~ sq~uq~sq~uq~q~ uq~Trueq~ sq~uq~sq~uq~q~ sq~uq~q~4uq~!sq~uq~q~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~and: aBlock ^ aBlock value q~ssq~uq~sq~uq~q~ uq~ifTrue:ifFalse:sq~uq~q~4uq~!sq~uq~q~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~9ifTrue: trueBlock ifFalse: falseBlock ^ trueBlock value q~ssq~uq~q~ sq~uq~q~4uq~\q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~ not ^ false q~ssq~uq~q~sq~uq~q~4uq~@sq~uq~sq~uq~q~ uq~trueq~sq~Huq~q~Kq~nq~sq~uq~q~ uq~printString ^ 'true' q~ssq~uq~q~ sq~uq~q~4uq~[q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~or: aBlock ^ true q~sq~q~nq~sq~uq~sq~uq~q~ uq~MetaTrueq~ sq~uq~sq~uq~q~sq~uq~q~4uq~[q~sq~Huq~q~Kq~nq~Ssq~uq~q~ uq~.new " there is only one true value " ^ true q~sq~q~q~q~q~wq~sq~uq~sq~uq~q~ uq~Parserq~&sq~uq~'sq~uq~sq~uq~q~ uq~ addArgName:sq~uq~q~4uq~! ! [ BZ!sq~uq~sq~uq~q~ uq~ includes:sq~uq~q~ uq~ includes:sq~uq~q~ uq~doubly defined argument name sq~uq~q~ uq~error:sq~uq~q~ uq~add:q~sq~Huq~q~K q~nq~dsq~uq~q~ uq~addArgName: name ((instNames includes: name) or: [ argNames includes: name ]) ifTrue: [ self error: 'doubly defined argument name ']. argNames add: name q~ssq~uq~sq~uq~q~ uq~ addTempName:sq~uq~q~4uq~.! ! [![ CZ!gsq~uq~sq~uq~q~ uq~ includes:sq~uq~q~ uq~ includes:sq~uq~q~ uq~ includes:sq~uq~q~ uq~doubly defined name sq~uq~q~ uq~error:sq~uq~q~ uq~add:sq~uq~q~ uq~sizesq~uq~q~ uq~max:q~sq~Huq~q~K q~nq~dsq~uq~q~ uq~addTempName: name (((argNames includes: name) or: [ instNames includes: name ] ) or: [ tempNames includes: name ] ) ifTrue: [ self error: 'doubly defined name ']. tempNames add: name. maxTemps <- maxTemps max: tempNames size q~ssq~uq~sq~uq~q~ uq~ arrayLiteralsq~uq~q~4uq~p 0Z sq~uq~sq~uq~q~ uq~ isAlphabeticsq~uq~q~ uq~nextLexsq~uq~q~ uq~ readLiteralq~q~q~q~dsq~uq~q~ uq~varrayLiteral | node | tokenType isAlphabetic ifTrue: [ node <- token. self nextLex. ^ node ]. ^ self readLiteral q~ssq~uq~sq~uq~q~ uq~binaryContinuation:sq~uq~q~4uq~. !p (q 聓01D pZ0sq~uq~ sq~uq~q~ uq~unaryContinuation:sq~uq~q~ uq~ tokenIsBinarysq~uq~q~ uq~nextLexsq~uq~q~ uq~newq~sq~uq~q~ uq~newsq~uq~q~ uq~readTermsq~uq~q~ uq~unaryContinuation:sq~uq~q~ uq~add:sq~uq~q~ uq~receiver:name:arguments:q~sq~Huq~q~Kq~Vq~dsq~uq~q~ uq~9binaryContinuation: base | receiver name | receiver <- self unaryContinuation: base. [ self tokenIsBinary] whileTrue: [ name <- token. self nextLex. receiver <- MessageNode new receiver: receiver name: name arguments: (List new add: (self unaryContinuation: self readTerm)) ]. ^ receiver q~ssq~uq~sq~uq~q~ uq~ charIsSyntax:sq~uq~q~4uq~@! !B [sq~uq~sq~uq~q~ uq~.()[]#^$sq~uq~q~ uq~ includes:sq~uq~sq~Huq~q~K'q~sq~uq~q~ uq~=q~q~q~nq~dsq~uq~q~ uq~;charIsSyntax: c ^ ('.()[]#^$' includes: c) or: [ c = $' ] q~ssq~uq~sq~uq~q~ uq~ currentCharsq~uq~q~4uq~ Zsq~uq~sq~uq~q~ uq~ at:ifAbsent:q~q~q~nq~dsq~uq~q~ uq~0currentChar ^ text at: index ifAbsent: [ nil ] q~ssq~uq~sq~uq~q~ uq~error:sq~uq~q~4uq~ @!sq~uq~sq~uq~q~ uq~Compiler error: sq~uq~q~ uq~error:q~q~Tq~nq~dsq~uq~q~ uq~;error: aString super error: 'Compiler error: ' + aString q~ssq~uq~sq~uq~q~ uq~ findName:sq~uq~q~4uq~7!@ [ Z!B\Z!D"Z#ZF!2 G!sq~uq~ sq~uq~q~ uq~truesq~uq~q~ uq~=sq~uq~q~ uq~falsesq~uq~q~ uq~=sq~uq~q~ uq~nilsq~uq~q~ uq~=q~sq~uq~q~ uq~unrecognized name:sq~uq~q~ uq~ printStringsq~uq~q~ uq~error:sq~uq~q~ uq~ at:ifAbsent:q~sq~Huq~q~Kq~nq~dsq~uq~q~ uq~findName: name name = 'true' ifTrue: [ ^ true ]. name = 'false' ifTrue: [ ^ false ]. name = 'nil' ifTrue: [^ nil ]. ^ Class at: name ifAbsent: [ ^ self error: 'unrecognized name:' + name printString ] q~ssq~uq~sq~uq~q~ uq~keywordContinuation:sq~uq~q~4uq~@ !p 0ZBqCr 31q 2 Z聚012sq~uq~ sq~uq~q~ uq~binaryContinuation:sq~uq~q~ uq~tokenIsKeywordsq~uq~q~ uq~q~sq~uq~q~ uq~newsq~uq~q~ uq~tokenIsKeywordsq~uq~q~ uq~nextLexsq~uq~q~ uq~readTermsq~uq~q~ uq~binaryContinuation:sq~uq~q~ uq~add:sq~uq~q~ uq~newsq~uq~q~ uq~receiver:name:arguments:q~sq~Huq~q~Kq~kq~dsq~uq~q~ uq~ykeywordContinuation: base | receiver name args | receiver <- self binaryContinuation: base. self tokenIsKeyword ifFalse: [ ^ receiver ]. name <- ''. args <- List new. [ self tokenIsKeyword ] whileTrue: [ name <- name + token. self nextLex. args add: (self binaryContinuation: self readTerm) ]. ^ MessageNode new receiver: receiver name: name arguments: args q~ssq~uq~sq~uq~q~ uq~ lexAlphabeticsq~uq~q~4uq~)q pZZ0B Z1Qcsq~uq~sq~uq~q~ uq~nextCharsq~uq~q~ uq~isAlphanumericsq~uq~sq~Huq~q~K:q~sq~uq~q~ uq~=sq~uq~q~ uq~nextCharsq~uq~q~ uq~-sq~uq~q~ uq~from:to:q~sq~Huq~q~Kq~Vq~dsq~uq~q~ uq~lexAlphabetic | cc start | start <- index. [ (cc <- self nextChar) isAlphanumeric ] whileTrue: [ nil ]. " add any trailing colons " cc = $: ifTrue: [ self nextChar ]. token <- text from: start to: index - 1 q~ssq~uq~sq~uq~q~ uq~ lexBinarysq~uq~q~4uq~K p0c q 0Z1%1&[-1.[6 17[=>Z1c sq~uq~ sq~uq~q~ uq~ currentCharsq~uq~q~ uq~asStringsq~uq~q~ uq~nextCharsq~uq~q~ uq~ charIsSyntax:sq~uq~q~ uq~isBlanksq~uq~q~ uq~isDigitsq~uq~q~ uq~ isAlphabeticsq~uq~q~ uq~ charIsSyntax:sq~uq~q~ uq~asStringsq~uq~q~ uq~nextCharq~sq~Huq~q~Kq~Vq~dsq~uq~q~ uq~#lexBinary | c d | c <- self currentChar. token <- c asString. d <- self nextChar. (self charIsSyntax: c) ifTrue: [ ^ token ]. (((d isBlank or: [ d isDigit]) or: [ d isAlphabetic ]) or: [ self charIsSyntax: d]) ifTrue: [ ^ token ]. token <- token + d asString. self nextChar q~ssq~uq~sq~uq~q~ uq~ lexIntegersq~uq~q~4uq~Dp ZZ C&Q E򃖁'\7 4Z)Z8Z0Qcsq~uq~ sq~uq~q~ uq~nextCharsq~uq~q~ uq~isDigitsq~uq~q~ uq~ currentCharsq~uq~sq~Huq~q~K.q~sq~uq~q~ uq~=sq~uq~sq~Huq~q~K q~sq~uq~q~ uq~ at:ifAbsent:sq~uq~q~ uq~isDigitsq~uq~q~ uq~nextCharsq~uq~q~ uq~isDigitsq~uq~q~ uq~-sq~uq~q~ uq~from:to:q~sq~Huq~q~Kq~q~dsq~uq~q~ uq~.lexInteger | start | start <- index. "now works for floats as well " [ self nextChar isDigit ] whileTrue: [ nil ]. (self currentChar = $. and: [(text at: index+1 ifAbsent: [$ ]) isDigit]) ifTrue: [ [self nextChar isDigit] whileTrue: [ nil ] ]. token <- text from: start to: index - 1 q~ssq~uq~sq~uq~q~ uq~ nameNode:sq~uq~q~4uq~!@ၒPZQ-!0+쁘0,ZQM!0Kၟ0 LZ Q  s!0  q 0 rZ Q  !0   0 Z  ! ! "sq~uq~#sq~uq~q~ uq~supersq~uq~q~ uq~=sq~uq~q~ uq~newsq~uq~q~ uq~ position:sq~uq~q~ uq~sizesq~uq~q~ uq~to:sq~uq~q~ uq~at:sq~uq~q~ uq~=sq~uq~q~ uq~newsq~uq~q~ uq~ position:sq~uq~q~ uq~do:sq~uq~q~ uq~sizesq~uq~q~ uq~to:sq~uq~q~ uq~at:sq~uq~q~ uq~=sq~uq~q~ uq~newsq~uq~q~ uq~ position:sq~uq~q~ uq~do:sq~uq~q~ uq~sizesq~uq~q~ uq~to:sq~uq~q~ uq~at:sq~uq~q~ uq~=sq~uq~q~ uq~newsq~uq~q~ uq~ position:sq~uq~q~ uq~do:sq~uq~q~ uq~sizesq~uq~q~ uq~to:sq~uq~q~ uq~at:sq~uq~q~ uq~=sq~uq~q~ uq~newsq~uq~q~ uq~ position:sq~uq~q~ uq~do:sq~uq~q~ uq~newsq~uq~q~ uq~ findName:sq~uq~q~ uq~value:q~sq~Huq~q~K)q~q~dsq~uq~q~ uq~XnameNode: name " make a new name node " name = 'super' ifTrue: [ ^ ArgumentNode new position: 0 ]. (1 to: tempNames size) do: [:i | (name = (tempNames at: i)) ifTrue: [ ^ TemporaryNode new position: i ] ]. (1 to: argNames size) do: [:i | (name = (argNames at: i)) ifTrue: [ ^ ArgumentNode new position: i ] ]. (1 to: instNames size) do: [:i | (name = (instNames at: i)) ifTrue: [ ^ InstNode new position: i ] ]. (1 to: classVarNames size) do: [:i | (name = (classVarNames at: i)) ifTrue: [ ^ ClassVarNode new position: i]]. ^ LiteralNode new value: (self findName: name) q~ssq~uq~sq~uq~q~ uq~nextCharsq~uq~q~4uq~Qa @sq~uq~sq~uq~sq~Huq~q~K q~sq~uq~q~ uq~ at:ifAbsent:q~sq~Huq~q~K q~nq~dsq~uq~q~ uq~AnextChar index <- index + 1. ^ text at: index ifAbsent: [ $ ] q~ssq~uq~sq~uq~q~ uq~nextLexsq~uq~q~4uq~9 bBbZcZZ$ %Z1 2Z sq~uq~sq~uq~q~ uq~ skipBlankssq~uq~q~ uq~ currentCharsq~uq~sq~Huq~q~K q~sq~uq~q~ uq~isDigitsq~uq~q~ uq~ lexIntegersq~uq~q~ uq~ isAlphabeticsq~uq~q~ uq~ lexAlphabeticsq~uq~q~ uq~ lexBinaryq~sq~Huq~q~K q~nq~dsq~uq~q~ uq~nextLex self skipBlanks. tokenType <- self currentChar. tokenType isNil " end of input " ifTrue: [ tokenType <- $ . token <- nil. ^ nil ]. tokenType isDigit ifTrue: [ ^ self lexInteger ]. tokenType isAlphabetic ifTrue: [ ^ self lexAlphabetic ]. ^ self lexBinary q~ssq~uq~sq~uq~q~ uq~parse:sq~uq~q~4uq~% p0 0\0!sq~uq~sq~uq~q~ uq~nextLexsq~uq~q~ uq~newsq~uq~q~ uq~readMethodNamesq~uq~q~ uq~name:sq~uq~q~ uq~readMethodVariablessq~uq~q~ uq~readBodysq~uq~q~ uq~compile:block:sq~uq~q~ uq~method:class:text:q~sq~Huq~q~Kq~q~dsq~uq~q~ uq~parse: c | encoder | " note -- must call text:instanceVars:classVars: first " self nextLex. encoder <- Encoder new. encoder name: self readMethodName. self readMethodVariables. self readBody compile: encoder block: false. ^ encoder method: maxTemps class: c text: text q~ssq~uq~sq~uq~q~ uq~ readArraysq~uq~q~4uq~E A EZ IpK20 #Z 0 sq~uq~sq~uq~q~ uq~ currentCharsq~uq~sq~Huq~q~K(q~sq~uq~q~ uq~~=sq~uq~q~ uq~ currentCharsq~uq~q~ uq~asStringsq~uq~q~ uq~%Little Smalltalk does not use symbolssq~uq~q~ uq~error:sq~uq~q~ uq~nextCharsq~uq~q~ uq~nextLexq~sq~uq~q~ uq~newsq~uq~sq~Huq~q~K)q~sq~uq~q~ uq~~=sq~uq~q~ uq~readTermsq~uq~q~ uq~add:sq~uq~q~ uq~nextLexsq~uq~q~ uq~newsq~Huq~q~K$sq~uq~q~ uq~number:arguments:q~sq~Huq~q~Kq~q~dsq~uq~q~ uq~7readArray | args | self currentChar ~= $( ifTrue: [ self error: self currentChar asString + 'Little Smalltalk does not use symbols']. self nextChar. self nextLex. args <- List new. [ tokenType ~= $) ] whileTrue: [ args add: self readTerm ]. self nextLex. ^ PrimitiveNode new number: 36 arguments: args q~ssq~uq~sq~uq~q~ uq~ readBlocksq~uq~q~4uq~Pq B Z p1Q-2ILH た01  N  sq~uq~sq~uq~q~ uq~asListsq~uq~q~ uq~nextLexsq~uq~sq~Huq~q~K:q~sq~uq~q~ uq~=sq~uq~q~ uq~readBlockTemporariessq~uq~q~ uq~readStatementListsq~uq~q~ uq~sizesq~uq~q~ uq~sizesq~uq~q~ uq~to:sq~uq~q~ uq~ sq~uq~q~ uq~at:put:sq~uq~q~ uq~do:sq~uq~sq~Huq~q~K]q~sq~uq~q~ uq~=sq~uq~q~ uq~nextLexsq~uq~q~ uq~newsq~uq~q~ uq~sizesq~uq~q~ uq~statements:temporaryLocation:sq~uq~q~ uq~unterminated blocksq~uq~q~ uq~error:q~sq~Huq~q~Kq~kq~dsq~uq~q~ uq~readBlock | stmts saveTemps | saveTemps <- tempNames asList. " copy " self nextLex. tokenType = $: ifTrue: [ self readBlockTemporaries ]. stmts <- self readStatementList. "tempNames <- saveTemps." (saveTemps size + 1 to: tempNames size) do: [:i | tempNames at: i put: ' ']. tokenType = $] ifTrue: [ self nextLex. ^ BlockNode new statements: stmts temporaryLocation: saveTemps size ] ifFalse: [ self error: 'unterminated block'] q~ssq~uq~sq~uq~q~ uq~readBlockTemporariessq~uq~q~4uq~C@/  DZ $ ( I ZL< A O sq~uq~sq~uq~sq~Huq~q~K:q~sq~uq~q~ uq~=sq~uq~q~ uq~ currentCharsq~uq~q~ uq~ isAlphabeticsq~uq~q~ uq~ill formed block argumentsq~uq~q~ uq~error:sq~uq~q~ uq~nextLexsq~uq~q~ uq~ tokenIsNamesq~uq~q~ uq~ addTempName:sq~uq~q~ uq~invalid block argument list sq~uq~q~ uq~error:sq~uq~q~ uq~nextLexsq~uq~sq~Huq~q~K|q~sq~uq~q~ uq~=sq~uq~q~ uq~nextLexsq~uq~q~ uq~invalid block argument list sq~uq~q~ uq~error:q~sq~Huq~q~Kq~nq~dsq~uq~q~ uq~readBlockTemporaries [ tokenType = $: ] whileTrue: [ self currentChar isAlphabetic ifFalse: [ self error: 'ill formed block argument']. self nextLex. self tokenIsName ifTrue: [ self addTempName: token ] ifFalse: [ self error: 'invalid block argument list ']. self nextLex ]. tokenType = $| ifTrue: [ self nextLex ] ifFalse: [ self error: 'invalid block argument list '] q~ssq~uq~sq~uq~q~ uq~readBodysq~uq~q~4uq~ 䁐 sq~uq~sq~uq~q~ uq~newsq~uq~q~ uq~readStatementListsq~uq~q~ uq~ statements:q~q~Tq~nq~dsq~uq~q~ uq~q~sq~uq~q~ uq~~=sq~uq~q~ uq~readTermsq~uq~q~ uq~add:sq~uq~q~ uq~nextLexsq~uq~q~ uq~newsq~uq~q~ uq~number:arguments:q~sq~Huq~q~Kq~Vq~dsq~uq~q~ uq~readPrimitive | num args | self nextLex. num <- self readInteger. args <- List new. [ tokenType ~= $> ] whileTrue: [ args add: self readTerm ]. self nextLex. ^ PrimitiveNode new number: num arguments: args q~ssq~uq~sq~uq~q~ uq~ readStatementsq~uq~q~4uq~@ 끓 Z sq~uq~sq~uq~sq~Huq~q~K^q~sq~uq~q~ uq~=sq~uq~q~ uq~nextLexsq~uq~q~ uq~newsq~uq~q~ uq~readExpressionsq~uq~q~ uq~ expression:sq~uq~q~ uq~readExpressionq~sq~Huq~q~K q~nq~dsq~uq~q~ uq~readStatement tokenType = $^ ifTrue: [ self nextLex. ^ ReturnNode new expression: self readExpression ]. ^ self readExpression q~ssq~uq~sq~uq~q~ uq~readStatementListsq~uq~q~4uq~8@p0 D\2 'G([.0/ZZ0sq~uq~ q~sq~uq~q~ uq~newsq~uq~q~ uq~ readStatementsq~uq~q~ uq~add:sq~uq~sq~Huq~q~K.q~sq~uq~q~ uq~=sq~uq~q~ uq~nextLexsq~uq~sq~Huq~q~K]q~sq~uq~q~ uq~=q~sq~Huq~q~K q~q~dsq~uq~q~ uq~readStatementList | list | list <- List new. [ list add: self readStatement. tokenType notNil and: [ tokenType = $. ] ] whileTrue: [ self nextLex. (token isNil or: [ tokenType = $] ] ) ifTrue: [ ^ list ] ]. ^ list q~ssq~uq~sq~uq~q~ uq~ readStringsq~uq~q~4uq~Rp r2 AZ2C!QaZQq GD 0R EZ 01sq~uq~sq~uq~q~ uq~ currentCharsq~uq~q~ uq~unterminated string constantsq~uq~q~ uq~error:sq~uq~sq~Huq~q~K'q~sq~uq~q~ uq~~=sq~uq~q~ uq~-sq~uq~q~ uq~nextCharsq~uq~sq~Huq~q~K'q~sq~uq~q~ uq~=sq~uq~q~ uq~nextCharsq~uq~q~ uq~-sq~uq~q~ uq~from:to:sq~uq~q~ uq~ readStringsq~uq~q~ uq~nextLexsq~uq~q~ uq~from:to:q~sq~Huq~q~Kq~kq~dsq~uq~q~ uq~ireadString | first last cc | first <- index. [ cc <- self currentChar. cc isNil ifTrue: [ self error: 'unterminated string constant']. cc ~= $' ] whileTrue: [ index <- index + 1 ]. last <- index - 1. self nextChar = $' ifTrue: [ self nextChar. ^ (text from: first to: index - 2) + self readString ]. self nextLex. ^ text from: first to: last q~ssq~uq~sq~uq~q~ uq~readTermsq~uq~q~4uq~ @ ZB1 pF' H(Z 02ZK? @ZNN OZ _ `Z w  p 0xZ   sq~uq~sq~uq~q~ uq~unexpected end of inputsq~uq~q~ uq~error:sq~uq~sq~Huq~q~K(q~sq~uq~q~ uq~=sq~uq~q~ uq~nextLexsq~uq~q~ uq~readExpressionsq~uq~sq~Huq~q~K)q~sq~uq~q~ uq~=sq~uq~q~ uq~unbalanced parenthesissq~uq~q~ uq~error:sq~uq~q~ uq~nextLexsq~uq~sq~Huq~q~K[q~sq~uq~q~ uq~=sq~uq~q~ uq~ readBlocksq~uq~sq~Huq~q~K=q~|q~msq~Huq~q~Kq~q~mq~sq~Huq~q~Kq~nq~Fsq~uq~q~ uq~genHigh: high low: low (low >= 16) ifTrue: [ self genHigh: 0 low: high. self genCode: low ] ifFalse: [ self genCode: high * 16 + low ] q~ssq~uq~sq~uq~q~ uq~ genLiteral:sq~uq~q~4uq~!bQsq~uq~sq~uq~q~ uq~add:sq~uq~q~ uq~sizesq~uq~q~ uq~-q~q~Tq~nq~Fsq~uq~q~ uq~KgenLiteral: aValue literals <- literals add: aValue. ^ literals size - 1 q~ssq~uq~sq~uq~q~ uq~method:class:text:sq~uq~q~4uq~@U!"#sq~uq~q~ssq~uq~q~ uq~ asByteArraysq~uq~q~ uq~;name:byteCodes:literals:stackSize:temporarySize:class:text:q~sq~Huq~q~Kq~nq~Fsq~uq~q~ uq~method: maxTemps class: c text: text " stack size doesn't take into account primitives " ^ Method name: name byteCodes: byteCodes asByteArray literals: literals stackSize: maxStack+5 temporarySize: maxTemps class: c text: text q~ssq~uq~sq~uq~q~ uq~name:sq~uq~q~4uq~!`@aBPbPcQdsq~uq~q~q~q~q~q~sq~Huq~q~Kq~nq~Fsq~uq~q~ uq~hname: n name <- n. byteCodes <- List new. literals <- Array new: 0. stackSize <- 0. maxStack <- 1. q~ssq~uq~sq~uq~q~ uq~patch:sq~uq~q~4uq~ ! sq~uq~q~^q~!q~sq~Huq~q~Kq~nq~Fsq~uq~q~ uq~Xpatch: loc " patch a goto from a block " byteCodes at: loc put: self currentLocation q~ssq~uq~sq~uq~q~ uq~popArgs:sq~uq~q~4uq~!csq~uq~q~q~sq~Huq~q~Kq~nq~Fsq~uq~q~ uq~(popArgs: n stackSize <- stackSize - n. q~ssq~uq~sq~uq~q~ uq~ pushArgs:sq~uq~q~4uq~ !cdsq~uq~sq~uq~q~ uq~max:q~sq~Huq~q~Kq~nq~Fsq~uq~q~ uq~NpushArgs: n stackSize <- stackSize + n. maxStack <- stackSize max: maxStack q~sq~q~sq~uq~q~q~|q~q~sq~uq~q~ uq~maxStackq~sq~uq~sq~uq~q~ uq~ MetaEncoderq~sq~uq~q~q~q~q~sq~uq~sq~uq~q~ uq~ ArgumentNodesq~uq~sq~uq~q~ uq~ ParserNodeq~&sq~uq~sq~uq~sq~uq~q~ uq~isSupersq~uq~q~4uq~\q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~isSuper ^ false q~ssq~uq~sq~uq~q~ uq~isBlocksq~uq~q~4uq~\q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~isBlock ^ false q~ssq~uq~sq~uq~q~ uq~ assignablesq~uq~q~4uq~\q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~assignable ^ false q~sq~q~nq~sq~uq~sq~uq~q~ uq~MetaParserNodeq~sq~uq~q~q~q~q~sq~uq~sq~uq~sq~uq~q~ uq~ position:sq~uq~q~4uq~!`q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~position: p position <- p q~ssq~uq~q~ sq~uq~q~4uq~Psq~uq~q~/q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~isSuper ^ position = 0 q~ssq~uq~sq~uq~q~ uq~compile:block:sq~uq~q~4uq~P !RP!RQsq~uq~q~/q~|q~q~|q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~compile: encoder block: inBlock position = 0 ifTrue: [ encoder genHigh: 2 low: 0 ] ifFalse: [ encoder genHigh: 2 low: position - 1 ] q~sq~q~sq~uq~sq~uq~q~ uq~positionq~sq~uq~sq~uq~q~ uq~MetaArgumentNodeq~ 9sq~uq~q~q~q~q~sq~uq~sq~uq~q~ uq~ AssignNodeq~ sq~uq~sq~uq~sq~uq~q~ uq~target:expression:sq~uq~q~4uq~!`"aq~sq~Huq~q~Kq~nq~ vsq~uq~q~ uq~7target: t expression: e target <- t. expression <- e q~ssq~uq~q~ ]sq~uq~q~4uq~ !"!sq~uq~q~ ]sq~uq~q~ uq~assign:q~sq~Huq~q~Kq~nq~ vsq~uq~q~ uq~ecompile: encoder block: inBlock expression compile: encoder block: inBlock. target assign: encoder q~sq~q~Vsq~uq~sq~uq~q~ uq~targetsq~uq~q~ uq~ expressionq~sq~uq~sq~uq~q~ uq~MetaAssignNodeq~ 9sq~uq~q~q~q~q~sq~uq~sq~uq~q~ uq~ BlockNodeq~ sq~uq~sq~uq~sq~uq~q~ uq~statements:temporaryLocation:sq~uq~q~4uq~!`"aq~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~Mstatements: s temporaryLocation: t statements <- s. temporaryLocation <- t q~ssq~uq~sq~uq~q~ uq~compileInLine:block:sq~uq~q~4uq~0!"!AU!sq~uq~q~ ]sq~Huq~q~Kq~|q~ aq~Oq~sq~Huq~q~Kq~q~ sq~uq~q~ uq~compileInLine: encoder block: inBlock statements do: [ :stmt | stmt compile: encoder block: inBlock. encoder genHigh: 15 low: 5 " pop top " ]. encoder backUp q~ssq~uq~q~ !sq~uq~q~4uq~[q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~isBlock ^ true q~ssq~uq~q~ ]sq~uq~q~4uq~!@!Pp ![!DR!0sq~uq~sq~Huq~q~K q~|q~mq~ sq~Huq~q~Kq~|q~q~sq~Huq~q~Kq~q~ sq~uq~q~ uq~compile: encoder block: inBlock | patchLocation | encoder genHigh: 12 low: temporaryLocation. patchLocation <- encoder genCode: 0. self compileInLine: encoder block: true. encoder genHigh: 15 low: 2. " return top of stack " encoder patch: patchLocation q~sq~q~Vsq~uq~sq~uq~q~ uq~ statementssq~uq~q~ uq~temporaryLocationq~sq~uq~sq~uq~q~ uq~ MetaBlockNodeq~ 9sq~uq~q~q~q~q~sq~uq~sq~uq~q~ uq~BodyNodeq~ sq~uq~sq~uq~sq~uq~q~ uq~ statements:sq~uq~q~4uq~!`q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~statements: s statements <- s q~ssq~uq~q~ ]sq~uq~q~4uq~0!"!AU!DQsq~uq~q~ ]sq~Huq~q~Kq~|q~ asq~Huq~q~Kq~|q~sq~Huq~q~Kq~q~ sq~uq~q~ uq~compile: encoder block: inBlock statements do: [ :stmt | stmt compile: encoder block: inBlock. encoder genHigh: 15 low: 5 " pop "]. encoder genHigh: 15 low: 1 " return self " q~sq~q~sq~uq~q~ q~sq~uq~sq~uq~q~ uq~ MetaBodyNodeq~ 9sq~uq~q~q~q~q~sq~uq~sq~uq~q~ uq~ ClassVarNodeq~ sq~uq~sq~uq~sq~uq~q~ uq~compile:block:sq~uq~q~4uq~ !@Qsq~uq~sq~Huq~q~Ksq~uq~q~ uq~-sq~uq~q~ uq~ genHigh:low:q~sq~Huq~q~K q~nq~!#sq~uq~q~ uq~Hcompile: encoder block: inBlock encoder genHigh: 14 low: position - 1q~ssq~uq~sq~uq~q~ uq~ position:sq~uq~q~4uq~!`sq~uq~q~q~q~nq~!#sq~uq~q~ uq~position: p position <- pq~sq~q~sq~uq~sq~uq~q~ uq~positionq~sq~uq~sq~uq~q~ uq~MetaClassVarNodeq~sq~uq~q~q~sq~uq~q~q~sq~uq~sq~uq~q~ uq~InstNodeq~ sq~uq~sq~uq~q~ Dsq~uq~q~4uq~!`q~sq~Huq~q~Kq~nq~!\sq~uq~q~ uq~position: p position <- p q~ssq~uq~q~ ]sq~uq~q~4uq~ !QQsq~uq~q~q~|q~sq~Huq~q~Kq~nq~!\sq~uq~q~ uq~Fcompile: encoder block: inBlock encoder genHigh: 1 low: position - 1 q~ssq~uq~q~ sq~uq~q~4uq~ !VQsq~uq~q~q~|q~sq~Huq~q~Kq~nq~!\sq~uq~q~ uq~6assign: encoder encoder genHigh: 6 low: position - 1 q~ssq~uq~q~ .sq~uq~q~4uq~[q~sq~Huq~q~Kq~nq~!\sq~uq~q~ uq~assignable ^ true q~sq~q~sq~uq~q~ lq~sq~uq~sq~uq~q~ uq~ MetaInstNodeq~ 9sq~uq~q~q~q~q~sq~uq~sq~uq~q~ uq~ LiteralNodeq~ sq~uq~sq~uq~q~ Usq~uq~q~4uq~!`q~sq~Huq~q~Kq~nq~!sq~uq~q~ uq~value: v value <- v q~ssq~uq~q~ ]sq~uq~q~4uq~VZ!UAZ[!UDZ\.!UG/ZJ?PY@\J!UKZ!T!sq~uq~sq~uq~q~ uq~==sq~Huq~q~K q~|q~!sq~Huq~q~K q~|q~!sq~Huq~q~K q~|q~q~Kq~!q~rq~|sq~uq~q~ uq~ genLiteral:q~|q~sq~Huq~q~Kq~nq~!sq~uq~q~ uq~kcompile: encoder block: inBlock value == nil ifTrue: [ ^ encoder genHigh: 5 low: 10 ]. value == true ifTrue: [ ^ encoder genHigh: 5 low: 11 ]. value == false ifTrue: [ ^ encoder genHigh: 5 low: 12 ]. (value class == SmallInt and: [ value between: 0 and: 9 ]) ifTrue: [ ^ encoder genHigh: 5 low: value ]. encoder genHigh: 4 low: (encoder genLiteral: value) q~sq~q~sq~uq~q~q~sq~uq~sq~uq~q~ uq~MetaLiteralNodeq~ 9sq~uq~q~q~q~q~sq~uq~sq~uq~q~ uq~ MessageNodeq~ sq~uq~ sq~uq~sq~uq~q~ uq~receiver:name:arguments:sq~uq~q~4uq~ !`"a#bq~sq~Huq~q~Kq~nq~!sq~uq~q~ uq~Mreceiver: r name: n arguments: a receiver <- r. name <- n. arguments <- a q~ssq~uq~q~ ]sq~uq~q~4uq~w !" Z \*C'E([+\5 !"6Z!"J !"KZKZ!MP[ZO m!Q nZ !" sq~uq~sq~uq~q~ uq~cascade:block:q~ !sq~uq~q~ uq~argumentsAreBlocksq~uq~q~ uq~ whileTrue:q~/sq~uq~q~ uq~ whileFalse:q~/sq~uq~q~ uq~optimizeWhile:block:q~ ]q~ sq~uq~q~ uq~sendToSuper:block:sq~uq~q~ uq~isNilq~/sq~Huq~q~K q~|sq~uq~q~ uq~notNilq~/sq~Huq~q~K q~|sq~uq~q~ uq~compile2:block:q~sq~Huq~q~Kq~nq~!sq~uq~q~ uq~'compile: encoder block: inBlock receiver isNil ifTrue: [ ^ self cascade: encoder block: inBlock ]. ((receiver isBlock and: [ self argumentsAreBlock ]) and: [name = 'whileTrue:' or: [ name = 'whileFalse:' ] ] ) ifTrue: [ ^ self optimizeWhile: encoder block: inBlock ]. receiver compile: encoder block: inBlock. receiver isSuper ifTrue: [ ^ self sendToSuper: encoder block: inBlock ]. name = 'isNil' ifTrue: [ ^ encoder genHigh: 10 low: 0 ]. name = 'notNil' ifTrue: [ ^ encoder genHigh: 10 low: 1 ]. self compile2: encoder block: inBlock q~ssq~uq~q~"sq~uq~q~4uq~ bA !XC"ZE' !WG"(ZI9 !XK":ZML !WO" MZ _ !" `ZcZ !"  }!P ~Z !Q Z !R Z !" !sq~uq~"q~!sq~uq~q~ uq~ifTrue:q~/sq~Huq~q~K sq~uq~q~ uq~compile:test:constant:block:sq~uq~q~ uq~ifFalse:q~/sq~Huq~q~K q~"sq~uq~q~ uq~and:q~/sq~Huq~q~K q~"sq~uq~q~ uq~or:q~/sq~Huq~q~K q~"sq~uq~q~ uq~ifTrue:ifFalse:q~/sq~uq~q~ uq~optimizeIf:block:sq~uq~q~ uq~evaluateArguments:block:sq~uq~q~ uq~q~ssq~uq~sq~uq~q~ uq~in:add:sq~uq~q~4uq~"! sq~uq~q~q~q~nq~sq~uq~q~ uq~9in: v add: nv "increase object with value " ^ <32 nv v>q~ssq~uq~sq~uq~q~ uq~in:at:sq~uq~q~4uq~!"p00sq~uq~q~q~q~q~sq~uq~q~ uq~0in: o at: i | r | r <- <30 o i>. <18 r>. ^ rq~ssq~uq~q~sq~uq~q~4uq~#!"q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~ in: o at: i put: v ^ <5 v o i> q~sq~q~q~q~sq~uq~sq~uq~q~sq~uq~q~4uq~A p 0Q! 0R" 0S# 0T$ 0U% 0V& 0W'0sq~uq~q~q~q~q~q~q~q~q~q~sq~Huq~q~Kq~q~sq~uq~q~ uq~{name: n byteCodes: b literals: l stackSize: s temporarySize: ts class: c text: t | newMethod | newMethod <- self new. super in: newMethod at: 1 put: n. super in: newMethod at: 2 put: b. super in: newMethod at: 3 put: l. super in: newMethod at: 4 put: s. super in: newMethod at: 5 put: ts. super in: newMethod at: 6 put: c. super in: newMethod at: 7 put: t. ^ newMethod q~sq~q~q~q~sq~uq~sq~uq~q~ uq~ addToFloat:sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~asFloatq~q~q~nq~Usq~uq~q~ uq~%addToFloat: arg ^ arg + self asFloatq~ssq~uq~sq~uq~q~ uq~addToFraction:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asFloatsq~uq~q~ uq~asFloatq~q~Tq~nq~Usq~uq~q~ uq~0addToFraction: arg ^ arg asFloat + self asFloatq~ssq~uq~sq~uq~q~ uq~addToSmallInt:sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~asFloatq~q~q~nq~Usq~uq~q~ uq~(addToSmallInt: arg ^ arg asFloat + selfq~ssq~uq~sq~uq~q~ uq~divideByFloat:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asFloatsq~uq~q~ uq~/q~q~q~nq~Usq~uq~q~ uq~(divideByFloat: arg ^ arg / self asFloatq~ssq~uq~sq~uq~q~ uq~divideBySmallInt:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asFloatsq~uq~q~ uq~/q~q~q~nq~Usq~uq~q~ uq~+divideBySmallInt: arg ^ arg asFloat / selfq~ssq~uq~sq~uq~q~ uq~ equalToFloat:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asFloatsq~uq~q~ uq~=q~q~q~nq~Usq~uq~q~ uq~'equalToFloat: arg ^ arg = self asFloatq~ssq~uq~sq~uq~q~ uq~lessThanFloat:sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~asFloatq~q~q~nq~Usq~uq~q~ uq~(lessThanFloat: arg ^ arg < self asFloatq~ssq~uq~sq~uq~q~ uq~ multByFloat:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asFloatsq~uq~q~ uq~*q~q~q~nq~Usq~uq~q~ uq~&multByFloat: arg ^ arg * self asFloatq~ssq~uq~sq~uq~q~ uq~multBySmallInt:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asFloatsq~uq~q~ uq~*q~q~q~nq~Usq~uq~q~ uq~)multBySmallInt: arg ^ arg asFloat * selfq~ssq~uq~sq~uq~q~ uq~negatedsq~uq~q~4uq~P sq~uq~sq~uq~q~ uq~-q~q~lq~nq~Usq~uq~q~ uq~negated ^ 0 - selfq~ssq~uq~sq~uq~q~ uq~negativesq~uq~q~4uq~ Psq~uq~q~q~lq~nq~Usq~uq~q~ uq~negative ^ self < 0q~ssq~uq~sq~uq~q~ uq~subtractFromFloat:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asFloatsq~uq~q~ uq~-q~q~q~nq~Usq~uq~q~ uq~,subtractFromFloat: arg ^ arg - self asFloatq~ssq~uq~sq~uq~q~ uq~subtractFromSmallInt:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asFloatsq~uq~q~ uq~-q~q~q~nq~Usq~uq~q~ uq~/subtractFromSmallInt: arg ^ arg asFloat - selfq~sq~q~nq~q~ sq~uq~sq~uq~sq~uq~q~ uq~/sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~divideByInteger:q~q~lq~nq~Psq~uq~q~ uq~"/ arg ^ arg divideByInteger: selfq~ssq~uq~sq~uq~q~ uq~@sq~uq~q~4uq~ @ !sq~uq~q~sq~uq~q~ uq~newsq~uq~q~ uq~x:y:q~q~Tq~nq~Psq~uq~q~ uq~@ y ^ Point new x: self y: yq~ssq~uq~sq~uq~q~ uq~addToFraction:sq~uq~q~4uq~ !@ sq~uq~q~7sq~uq~q~ uq~top:q~q~Tq~nq~Psq~uq~q~ uq~0addToFraction: arg ^ arg + (Fraction top: self)q~ssq~uq~sq~uq~q~ uq~addToSmallInt:sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~asLargeIntegerq~q~q~nq~Psq~uq~q~ uq~LaddToSmallInt: arg " private internal method " ^ arg asLargeInteger + selfq~ssq~uq~sq~uq~q~ uq~ asIntegersq~uq~q~4uq~ sq~uq~q~q~q~nq~Psq~uq~q~ uq~asInteger ^ selfq~ssq~uq~sq~uq~q~ uq~divideByFraction:sq~uq~q~4uq~ !@ sq~uq~q~7sq~uq~q~ uq~top:sq~uq~q~ uq~/q~q~Tq~nq~Psq~uq~q~ uq~3divideByFraction: arg ^ arg / (Fraction top: self)q~ssq~uq~sq~uq~q~ uq~divideByInteger:sq~uq~q~4uq~@! sq~uq~q~7sq~uq~q~ uq~ top:bottom:q~q~q~nq~Psq~uq~q~ uq~6divideByInteger: arg ^ Fraction top: arg bottom: selfq~ssq~uq~sq~uq~q~ uq~equalToSmallInt:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asLargeIntegersq~uq~q~ uq~=q~q~q~nq~Psq~uq~q~ uq~1equalToSmallInt: arg ^ arg asLargeInteger = selfq~ssq~uq~sq~uq~q~ uq~gcd:sq~uq~q~4uq~9 p!q0P1P[QZ01301+10q001pZ0sq~uq~sq~uq~q~ uq~=sq~uq~q~ uq~-sq~uq~q~ uq~-q~sq~Huq~q~Kq~Vq~Psq~uq~q~ uq~gcd: x | n m | " euclids gcd algorithm " n <- self. m <- x. (n <= 0 or: [m <= 0]) ifTrue: [ ^ 1]. [ n = m ] whileFalse: [ n < m ifTrue: [ m <- m - n ] ifFalse: [ n <- n - m ]]. ^ nq~ssq~uq~sq~uq~q~ uq~lessThanSmallInt:sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~asLargeIntegerq~q~q~nq~Psq~uq~q~ uq~OlessThanSmallInt: arg " private internal method " ^ arg asLargeInteger < selfq~ssq~uq~sq~uq~q~ uq~multByFraction:sq~uq~q~4uq~ !@ sq~uq~q~7sq~uq~q~ uq~top:sq~uq~q~ uq~*q~q~Tq~nq~Psq~uq~q~ uq~1multByFraction: arg ^ arg * (Fraction top: self)q~ssq~uq~sq~uq~q~ uq~randomsq~uq~q~4uq~ @ sq~uq~q~sq~uq~q~ uq~randomsq~uq~q~ uq~*sq~uq~q~ uq~ asIntegerq~q~q~nq~Psq~uq~q~ uq~*random ^ (Float random * self) asIntegerq~ssq~uq~sq~uq~q~ uq~subtractFromFraction:sq~uq~q~4uq~ !@ sq~uq~q~7sq~uq~q~ uq~top:sq~uq~q~ uq~-q~q~Tq~nq~Psq~uq~q~ uq~7subtractFromFraction: arg ^ arg - (Fraction top: self)q~ssq~uq~sq~uq~q~ uq~subtractFromSmallInt:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asLargeIntegersq~uq~q~ uq~-q~q~q~nq~Psq~uq~q~ uq~[subtractFromSmallInt: arg " private method, used internally " ^ arg asLargeInteger - selfq~sq~q~nq~q~sq~uq~sq~uq~q~sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~multBySmallInt:q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~"* arg ^ arg multBySmallInt: self q~ssq~uq~sq~uq~q~ uq~+sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~addToSmallInt:q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~!+ arg ^ arg addToSmallInt: self q~ssq~uq~q~sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~subtractFromSmallInt:q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~(- arg ^ arg subtractFromSmallInt: self q~ssq~uq~q~sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~lessThanSmallInt:q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~$< arg ^ arg lessThanSmallInt: self q~ssq~uq~q~/sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~equalToSmallInt:q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~#= arg ^ arg equalToSmallInt: self q~ssq~uq~sq~uq~q~ uq~addToLP:sq~uq~q~4uq~! sq~uq~sq~uq~q~ uq~asLargeIntegerq~q~q~nq~Ksq~uq~q~ uq~,addToLP: arg ^ arg + self asLargeIntegerq~ssq~uq~sq~uq~q~ uq~addToSmallInt:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asLargeIntegersq~uq~q~ uq~asLargeIntegerq~q~Tq~nq~Ksq~uq~q~ uq~paddToSmallInt: arg " this only gets invoked when overflow occurs " ^ arg asLargeInteger + self asLargeIntegerq~ssq~uq~sq~uq~q~ uq~asFloatsq~uq~q~4uq~@ 2sq~uq~q~q~q~q~nq~Ksq~uq~q~ uq~asFloat ^ <50 Float self>q~ssq~uq~sq~uq~q~ uq~asLargeIntegersq~uq~q~4uq~J@p q1P 01D1Gq Z0P00P1Z P?L0GO0  sq~uq~q~sq~uq~q~ uq~newsq~uq~q~ uq~abssq~uq~q~ uq~>sq~Huq~q~Kdsq~uq~q~ uq~rem:sq~uq~q~ uq~add:sq~Huq~q~Kdsq~uq~q~ uq~quo:sq~uq~q~ uq~sizesq~uq~q~ uq~=sq~uq~q~ uq~add:q~Fsq~uq~q~ uq~ asByteArraysq~uq~q~ uq~new:q~%sq~uq~q~ uq~ asByteArraysq~uq~q~ uq~new:q~sq~Huq~q~Kq~Vq~Ksq~uq~q~ uq~.asLargeInteger | newValue n | newValue <- List new. n <- self abs. [n > 0] whileTrue: [ newValue add: (n rem: 100). n <- n quo: 100]. newValue size = 0 ifTrue: [ newValue add: 0]. ^ self < 0 ifTrue: [ LargeNegative new: newValue asByteArray] ifFalse: [ LargePositive new: newValue asByteArray ]q~ssq~uq~sq~uq~q~ uq~ compareToLP:sq~uq~q~4uq~ !sq~uq~sq~uq~q~ uq~asLargeIntegersq~uq~q~ uq~ compareToLP:q~q~q~nq~Ksq~uq~q~ uq~8compareToLP: arg ^ self asLargeInteger compareToLP: argq~ssq~uq~sq~uq~q~ uq~edit:sq~uq~q~4uq~E@Bp0DEGr2 02LMq1O5!2    01 0 sq~uq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~Integer editorsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Kdsq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~textAreasq~uq~q~ uq~ printStringsq~uq~q~ uq~setText:sq~uq~q~ uq~setPane:q~sq~uq~q~ uq~editsq~uq~q~ uq~new:sq~uq~q~ uq~ change to...sq~uq~q~ uq~getTextsq~uq~q~ uq~doItsq~uq~q~ uq~value:sq~uq~q~ uq~on:do:sq~uq~q~ uq~addMenu:sq~uq~q~ uq~showq~sq~Huq~q~Kq~kq~Ksq~uq~q~ uq~edit: cb | w m t| w <- Window new title: 'Integer editor'. w width: 300 height: 100. t <- Pane textArea. t setText: self printString. w setPane: t. m <- Menu new: 'edit'. m on: 'change to...' do: [cb value: t getText doIt ]. w addMenu: m. w show q~ssq~uq~q~'Ysq~uq~q~4uq~ !q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~&equalToSmallInt: arg ^ <14 self arg> q~ssq~uq~sq~uq~q~ uq~inspectsq~uq~q~4uq~@Bp0DE0G 0sq~uq~ q~wsq~uq~q~ uq~newsq~uq~q~ uq~Integer inspectorsq~uq~q~ uq~title:sq~Huq~q~Ksq~Huq~q~Kdsq~uq~q~ uq~ width:height:sq~uq~sq~uq~q~ uq~ TextPanelq~&sq~uq~sq~uq~sq~uq~q~ uq~getSelectedTextsq~uq~q~4uq~@ Hsq~uq~q~ q~q~q~nq~(Hsq~uq~q~ uq~%getSelectedText ^ <72 String self>q~ssq~uq~sq~uq~q~ uq~getTextsq~uq~q~4uq~@ Gsq~uq~q~ q~q~q~nq~(Hsq~uq~q~ uq~getText ^ <71 String self>q~ssq~uq~sq~uq~q~ uq~setText:sq~uq~q~4uq~ !Osq~uq~q~q~q~nq~(Hsq~uq~q~ uq~setText: t <79 self t>q~sq~q~nsq~uq~q~sq~uq~sq~uq~q~ uq~ MetaTextPanelq~sq~uq~sq~uq~sq~uq~q~ uq~new:sq~uq~q~4uq~ !Fsq~uq~q~q~q~nq~(xsq~uq~q~ uq~new: t ^ < 70 self t>q~ssq~uq~sq~uq~q~ uq~ textFieldsq~uq~q~4uq~ Esq~uq~q~q~q~nq~(xsq~uq~q~ uq~textField ^ <69 self>q~sq~q~sq~uq~q~q~sq~uq~q~ uq~ printStringsq~uq~q~ uq~new:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showq~sq~Huq~q~K q~q~Ksq~uq~q~ uq~inspect | w | w <- Window new title: 'Integer inspector'. w width: 200 height: 100. w setPane: (TextPanel new: self printString). w show q~ssq~uq~q~'Jsq~uq~q~4uq~! q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~'lessThanSmallInt: arg ^ <13 arg self> q~ssq~uq~sq~uq~q~ uq~ multByLP:sq~uq~q~4uq~ !sq~uq~sq~uq~q~ uq~*q~q~lq~nq~Ksq~uq~q~ uq~multByLP: arg ^ self * argq~ssq~uq~sq~uq~q~ uq~multBySmallInt:sq~uq~q~4uq~! p0! pZ0sq~uq~sq~uq~q~ uq~asLargeIntegersq~uq~q~ uq~asLargeIntegersq~uq~q~ uq~*q~q~Tq~Vq~Ksq~uq~q~ uq~multBySmallInt: arg | r values | "must check for overflow " r <- <15 arg self>. r isNil ifTrue: [ r <- arg asLargeInteger * self asLargeInteger ]. ^ r q~ssq~uq~q~sq~uq~q~4uq~1 P@ Z C!D E/ H Ksq~uq~sq~uq~q~ uq~-sq~uq~q~ uq~negatedq~sq~Huq~q~K q~sq~Huq~q~K0q~q~sq~Huq~q~K sq~uq~q~ uq~quo:q~sq~Huq~q~K sq~uq~q~ uq~rem:q~q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~printString (self < 0) ifTrue: [ ^ '-' + self negated printString]. (self < 10) ifTrue: [ ^ (Char new: (self + 48)) asString ] ifFalse: [ ^ (self quo: 10) printString + (self rem: 10) printString ] q~ssq~uq~q~(sq~uq~q~4uq~P! AZ! sq~uq~q~/sq~uq~q~ uq~division by zeroq~sq~uq~q~ uq~quoWithSmallInt:q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~]quo: arg (0 = arg) ifTrue: [^ self error: 'division by zero']. ^ arg quoWithSmallInt: self q~ssq~uq~q~)sq~uq~q~4uq~! q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~&quoWithSmallInt: arg ^ <11 arg self> q~ssq~uq~q~(sq~uq~q~4uq~P! AZ! sq~uq~q~/sq~uq~q~ uq~division by zeroq~sq~uq~q~ uq~remWithSmallInt:q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~]rem: arg (0 = arg) ifTrue: [^ self error: 'division by zero']. ^ arg remWithSmallInt: self q~ssq~uq~q~)"sq~uq~q~4uq~! q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~&remWithSmallInt: arg ^ <12 arg self> q~ssq~uq~sq~uq~q~ uq~sleepsq~uq~q~4uq~ !sq~uq~q~q~q~nq~Ksq~uq~q~ uq~'sleep " sleep for a while " <33 self>q~ssq~uq~sq~uq~q~ uq~subtractFromLP:sq~uq~q~4uq~ ! sq~uq~sq~uq~q~ uq~asLargeIntegersq~uq~q~ uq~-q~q~q~nq~Ksq~uq~q~ uq~MsubtractFromLP: arg " private internal method " ^ arg - self asLargeIntegerq~ssq~uq~sq~uq~q~ uq~subtractFromSmallInt:sq~uq~q~4uq~! p0! pZ0sq~uq~sq~uq~q~ uq~asLargeIntegersq~uq~q~ uq~asLargeIntegersq~uq~q~ uq~-q~q~Tq~q~Ksq~uq~q~ uq~subtractFromSmallInt: arg | r | " must check for overflow " r <- <16 arg self>. r isNil ifTrue: [ r <- arg asLargeInteger - self asLargeInteger ]. ^ r q~ssq~uq~q~sq~uq~q~4uq~ @ !Qsq~uq~q~q~9q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~1to: limit ^ Interval from: self to: limit by: 1 q~ssq~uq~sq~uq~q~ uq~to:by:sq~uq~q~4uq~ @ !"sq~uq~q~q~9q~sq~Huq~q~Kq~nq~Ksq~uq~q~ uq~=to: limit by: step ^ Interval from: self to: limit by: step q~ssq~uq~sq~uq~q~ uq~to:do:sq~uq~q~4uq~ p0!"00QpZsq~uq~sq~uq~q~ uq~value:q~sq~Huq~q~K q~q~Ksq~uq~q~ uq~to: limit do: aBlock | i | " optimize arithmetic loops " i <- self. [ i <= limit ] whileTrue: [ aBlock value: i. i <- i + 1 ] q~sq~q~nq~sq~uq~sq~uq~q~ uq~ MetaSmallIntq~sq~uq~sq~uq~q~sq~uq~q~4uq~Pq~sq~Huq~q~Kq~nq~)sq~uq~q~ uq~1new " can't create this way, return zero " ^ 0 q~sq~q~q~q~q~(sq~uq~q~ uq~:sq~Huq~q~Kq~(sq~uq~q~ uq~ q~ asq~uq~q~ uq~)q~sq~Huq~q~Kq~Vq~4sq~uq~q~ uq~vasCode | r | r <- '('. self do: [:element | r<- r+ (element quo: 16) + ':' + (element rem: 16) + ' ']. ^ r + ')' q~ssq~uq~q~sq~uq~q~4uq~ ! !"sq~uq~q~q~q~sq~Huq~q~Kq~nq~4sq~uq~q~ uq~at: index ifAbsent: exceptionBlock (self includesKey: index) ifTrue: [ ^ <21 self index>] ifFalse: [ ^ exceptionBlock value ] q~ssq~uq~sq~uq~q~ uq~at:put:sq~uq~q~4uq~ !"PA" ! C Esq~uq~sq~uq~q~ uq~ includesKey:sq~Huq~q~Ksq~uq~q~ uq~ between:and:sq~uq~q~ uq~!illegal insertion into byte arraysq~uq~q~ uq~error:sq~uq~q~ uq~byte array indexing errorsq~uq~q~ uq~error:q~sq~Huq~q~K q~nq~4sq~uq~q~ uq~at: index put: aValue (self includesKey: index) ifTrue: [(aValue between: 0 and: 255) ifTrue: [<22 aValue self index>] ifFalse: [self error: 'illegal insertion into byte array']] ifFalse: [self error: 'byte array indexing error' ] q~sq~q~nq~sq~uq~sq~uq~q~ uq~ MetaByteArraysq~uq~sq~uq~q~ uq~ MetaArrayq~usq~uq~sq~uq~q~sq~uq~q~4uq~ @sq~uq~sq~uq~q~ uq~'array values cannot be created with newq~q~sq~Huq~q~Kq~nq~)sq~uq~q~ uq~=new ^ self error: 'array values cannot be created with new' q~ssq~uq~q~sq~uq~q~4uq~ !q~sq~Huq~q~Kq~nq~)sq~uq~q~ uq~new: size ^ <7 self size> q~sq~q~q~q~sq~uq~sq~uq~q~sq~uq~q~4uq~@!sq~uq~q~4q~sq~Huq~q~Kq~nq~)sq~uq~q~ uq~!new: size ^ <20 ByteArray size> q~sq~q~q~q~uq~ !sq~uq~q~!q~sq~Huq~q~Kq~nq~&sq~uq~q~ uq~= arg ^ self == arg q~ssq~uq~q~!sq~uq~q~4uq~ !q~sq~Huq~q~Kq~nq~&sq~uq~q~ uq~== arg ^ <1 self arg> q~ssq~uq~q~sq~uq~q~4uq~ q~sq~Huq~q~Kq~nq~&sq~uq~q~ uq~class ^ <2 self> q~ssq~uq~sq~uq~q~ uq~editsq~uq~q~4uq~m@B p0EFH +K 3(M 34 r02  q1L   1]   01 0 sq~uq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~Object editor: sq~uq~q~ uq~ printStringsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Ksq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~classsq~uq~q~ uq~instanceVariablesq~&sq~uq~q~ uq~in:at:q~&sq~uq~q~ uq~ in:at:put:sq~uq~q~ uq~edit:sq~uq~q~ uq~ list:action:sq~uq~q~ uq~setPane:q~sq~uq~q~ uq~ informationsq~uq~q~ uq~new:sq~uq~q~ uq~ printStringsq~uq~q~ uq~ printStringsq~uq~q~ uq~inspectsq~uq~q~ uq~on:do:sq~uq~q~ uq~classsq~uq~q~ uq~classsq~uq~q~ uq~inspectsq~uq~q~ uq~on:do:sq~uq~q~ uq~addMenu:sq~uq~q~ uq~showq~sq~Huq~q~Kq~q~&sq~uq~q~ uq~edit | w m p | w <- Window new title: 'Object editor: ' + self printString. w width: 300 height: 200. p <- Pane list: self class instanceVariables action: [:i | (Object in: self at: i) edit: [:nv | Object in: self at: i put: nv] ]. w setPane: p. m <- Menu new: 'information'. m on: 'printString' do: [ self printString inspect ]. m on: 'class' do: [ self class inspect ]. w addMenu: m. w showq~ssq~uq~sq~uq~q~ uq~edit:sq~uq~q~4uq~@B p0EFH +K 3(M 34 r02  q1L   1]   1m!  1!|! " #01 $0 %sq~uq~&q~wsq~uq~q~ uq~newsq~uq~q~ uq~Object editor: sq~uq~q~ uq~ printStringsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Ksq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~classsq~uq~q~ uq~instanceVariablesq~&sq~uq~q~ uq~in:at:q~&sq~uq~q~ uq~ in:at:put:sq~uq~q~ uq~edit:sq~uq~q~ uq~ list:action:sq~uq~q~ uq~setPane:q~sq~uq~q~ uq~ informationsq~uq~q~ uq~new:sq~uq~q~ uq~ printStringsq~uq~q~ uq~ printStringsq~uq~q~ uq~inspectsq~uq~q~ uq~on:do:sq~uq~q~ uq~classsq~uq~q~ uq~classsq~uq~q~ uq~inspectsq~uq~q~ uq~on:do:sq~uq~q~ uq~evalq~wsq~uq~q~ uq~eval:sq~uq~q~ uq~on:do:sq~uq~q~ uq~savesq~uq~q~ uq~value:sq~uq~q~ uq~on:do:sq~uq~q~ uq~addMenu:sq~uq~q~ uq~showq~sq~Huq~q~K q~q~&sq~uq~q~ uq~edit: cb | w m p | w <- Window new title: 'Object editor: ' + self printString. w width: 300 height: 200. p <- Pane list: self class instanceVariables action: [ :i | (Object in: self at: i) edit: [:nv | Object in: self at: i put: nv]]. w setPane: p. m <- Menu new: 'information'. m on: 'printString' do: [ self printString inspect ]. m on: 'class' do: [ self class inspect ]. m on: 'eval' do: [ Window eval: cb ]. m on: 'save' do: [ cb value: self ]. w addMenu: m. w showq~ssq~uq~sq~uq~q~ uq~error:sq~uq~q~4uq~J@q1!BEIKp0MN0Z140    0  sq~uq~q~sq~uq~q~ uq~textAreaq~sq~uq~q~ uq~newlinesq~uq~q~ uq~asStringq~ sq~uq~q~ uq~currentsq~uq~q~ uq~ backtracesq~uq~q~ uq~setText:q~wsq~uq~q~ uq~newsq~uq~q~ uq~Errorsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~K,sq~uq~q~ uq~ width:height:q~q~sq~uq~q~ uq~closesq~uq~q~ uq~closesq~uq~q~ uq~ title:action:sq~uq~q~ uq~north:center:south:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showq~&sq~uq~q~ uq~haltq~sq~Huq~q~Kq~Vq~&sq~uq~q~ uq~#error: str | w t | t <- Pane textArea. t setText: (str + Char newline asString + Context current backtrace). w <- Window new title: 'Error'. w width: 300 height: 300. w setPane: (Pane north: nil center: t south: (Pane title: 'close' action: [w close])). w show. Object haltq~ssq~uq~sq~uq~q~ uq~inspectsq~uq~q~4uq~_@B p0EF0H #K 2򃞂 q1>   1O   01 0 sq~uq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~Object inspector: sq~uq~q~ uq~ printStringsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Ksq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~classsq~uq~q~ uq~instanceVariablesq~&sq~uq~q~ uq~in:at:sq~uq~q~ uq~inspectsq~uq~q~ uq~ list:action:sq~uq~q~ uq~setPane:q~sq~uq~q~ uq~ informationsq~uq~q~ uq~new:sq~uq~q~ uq~ printStringsq~uq~q~ uq~ printStringsq~uq~q~ uq~inspectsq~uq~q~ uq~on:do:sq~uq~q~ uq~classsq~uq~q~ uq~classsq~uq~q~ uq~inspectsq~uq~q~ uq~on:do:sq~uq~q~ uq~addMenu:sq~uq~q~ uq~showq~sq~Huq~q~Kq~kq~&sq~uq~q~ uq~}inspect | w m | w <- Window new title: 'Object inspector: ' + self printString. w width: 300 height: 200. w setPane: (Pane list: self class instanceVariables action: [:i | (Object in: self at: i) inspect ]). m <- Menu new: 'information'. m on: 'printString' do: [ self printString inspect ]. m on: 'class' do: [ self class inspect ]. w addMenu: m. w showq~ssq~uq~sq~uq~q~ uq~ isKindOf:sq~uq~q~4uq~" p00![Z0pZ\sq~uq~sq~uq~q~ uq~classsq~uq~q~ uq~==sq~uq~q~ uq~ superclassq~q~q~q~&sq~uq~q~ uq~isKindOf: aClass | clas | clas <- self class. [ clas notNil ] whileTrue: [ clas == aClass ifTrue: [ ^ true ]. clas <- clas superclass ]. ^ false q~ssq~uq~sq~uq~q~ uq~ isMemberOf:sq~uq~q~4uq~ !sq~uq~q~q~!q~sq~Huq~q~Kq~nq~&sq~uq~q~ uq~+isMemberOf: aClass ^ self class == aClass q~ssq~uq~sq~uq~q~ uq~isNilsq~uq~q~4uq~\q~sq~Huq~q~Kq~nq~&sq~uq~q~ uq~isNil ^ false q~ssq~uq~sq~uq~q~ uq~notNilsq~uq~q~4uq~[q~sq~Huq~q~Kq~nq~&sq~uq~q~ uq~notNil ^ true q~ssq~uq~q~sq~uq~q~4uq~ sq~uq~q~q~q~sq~Huq~q~Kq~nq~&sq~uq~q~ uq~&printString ^ self class printString q~ssq~uq~sq~uq~q~ uq~ respondsTo:sq~uq~q~4uq~ 0!sq~uq~q~q~%q~q~/sq~uq~q~ uq~ includesTest:q~sq~Huq~q~Kq~q~&sq~uq~q~ uq~UrespondsTo: aMessage ^ self class allMethods includesTest: [:m | m name = aMessage] q~ssq~uq~sq~uq~q~ uq~~=sq~uq~q~4uq~ !sq~uq~q~/q~ q~sq~Huq~q~Kq~nq~&sq~uq~q~ uq~~= arg ^ (self = arg) not q~sq~q~nq~q~sq~uq~sq~uq~sq~uq~q~ uq~<=sq~uq~q~4uq~ ! ! [sq~uq~q~/q~sq~Huq~q~Kq~nq~!sq~uq~q~ uq~(<= arg ^ self < arg or: [ self = arg ] q~ssq~uq~q~sq~uq~q~4uq~! q~sq~Huq~q~Kq~nq~!sq~uq~q~ uq~> arg ^ arg < self q~ssq~uq~q~sq~uq~q~4uq~ ! ! [sq~uq~q~q~/q~sq~Huq~q~Kq~nq~!sq~uq~q~ uq~(>= arg ^ self > arg or: [ self = arg ] q~ssq~uq~q~rsq~uq~q~4uq~! " \q~sq~Huq~q~Kq~nq~!sq~uq~q~ uq~asOrdered: testBlock ^ (Ordered new: testBlock) addAll: self q~ssq~uq~q~sq~uq~q~4uq~ @ pQq 0121Qq0sq~uq~q~ q~ 2q~q~!q~ aq~sq~Huq~q~Kq~kq~sq~uq~q~ uq~asString | newString index | newString <- String new: self size. index <- 1. self do: [ :element | newString at: index put: element. index <- index + 1 ]. ^ newString q~ssq~uq~sq~uq~q~ uq~collect:sq~uq~q~4uq~ @0!1sq~uq~q~q~q~ Uq~sq~uq~q~ uq~ inject:into:q~sq~Huq~q~Kq~Vq~sq~uq~q~ uq~wcollect: transformBlock ^ self inject: List new into: [:list :element | list add: (transformBlock value: element)] q~ssq~uq~sq~uq~q~ uq~find:ifAbsent:sq~uq~q~4uq~ !0 0Z"sq~uq~q~ Uq~ aq~q~sq~Huq~q~Kq~q~sq~uq~q~ uq~find: testBlock ifAbsent: exceptionBlock self do: [:element | (testBlock value: element) ifTrue: [ ^ element ] ]. ^ exceptionBlock value q~ssq~uq~sq~uq~q~ uq~ includes:sq~uq~q~4uq~ 0! [Z\sq~uq~q~/q~ aq~sq~Huq~q~Kq~q~sq~uq~q~ uq~Sincludes: value self do: [:element | element = value ifTrue: [ ^ true]]. ^ false q~ssq~uq~q~+sq~uq~q~4uq~ !0 [Z\sq~uq~q~ Uq~ aq~sq~Huq~q~Kq~q~sq~uq~q~ uq~`includesTest: aBlock self do: [:element | (aBlock value: element) ifTrue: [ ^ true]]. ^ false q~ssq~uq~q~,sq~uq~q~4uq~!p "01p0sq~uq~q~ bq~ aq~sq~Huq~q~Kq~Vq~sq~uq~q~ uq~inject: value into: binaryBlock | result | result <- value. self do: [:element | result <- binaryBlock value: result value: element ]. ^ result q~ssq~uq~sq~uq~q~ uq~isEmptysq~uq~q~4uq~ Psq~uq~q~ 2q~/q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~>isEmpty " empty if there are no elements " ^ self size = 0 q~ssq~uq~q~sq~uq~q~4uq~ @ 01ACsq~uq~sq~uq~q~ uq~(sq~uq~q~ uq~ q~,sq~uq~q~ uq~)q~sq~Huq~q~Kq~Vq~sq~uq~q~ uq~UprintString ^ (self inject: '(' into: [:str :element | str + element + ' '] ) + ')' q~ssq~uq~sq~uq~q~ uq~reject:sq~uq~q~4uq~ !0sq~uq~q~ Uq~ q~ q~sq~Huq~q~Kq~q~sq~uq~q~ uq~Creject: testBlock ^ self select: [:x | (testBlock value: x) not ] q~ssq~uq~q~ sq~uq~q~4uq~ @!101Z0sq~uq~q~q~q~ Uq~q~,q~sq~Huq~q~Kq~Vq~sq~uq~q~ uq~select: testBlock ^ self inject: List new into: [:list :element | (testBlock value: element) ifTrue: [ list add: element]. list ] q~ssq~uq~q~ 2sq~uq~q~4uq~ P0Qsq~uq~q~,q~sq~Huq~q~Kq~Vq~sq~uq~q~ uq~;size ^ self inject: 0 into: [:tally :element | tally + 1] q~sq~q~nq~q~.sq~uq~sq~uq~q~sq~uq~q~4uq~ ! @sq~uq~sq~uq~q~ uq~out of range indexq~q~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~Iat: index ^ self at: index ifAbsent: [self error: 'out of range index'] q~ssq~uq~q~ asq~uq~q~4uq~Q ! 0sq~uq~q~ 2q~q~ Uq~ [q~sq~Huq~q~Kq~q~sq~uq~q~ uq~Edo: aBlock ^ 1 to: self size do: [:i | aBlock value: (self at: i) ] q~ssq~uq~q~sq~uq~q~4uq~ !Q sq~uq~q~ 2q~rq~sq~Huq~q~Kq~nq~sq~uq~q~ uq~6includesKey: index ^ index between: 1 and: self size q~ssq~uq~q~/sq~uq~q~4uq~Q ! 00Z"sq~uq~q~ 2q~q~/q~ [q~q~sq~Huq~q~Kq~q~sq~uq~q~ uq~indexOf: element ifAbsent: exceptionBlock 1 to: self size do: [:i | (element = (self at: i)) ifTrue: [ ^ i ]]. ^ exceptionBlock value q~ssq~uq~q~sq~uq~q~4uq~Q ! 0sq~uq~q~ 2q~q~q~ Uq~q~sq~Huq~q~Kq~q~sq~uq~q~ uq~UreverseDo: aBlock ^ (1 to: self size) reverseDo: [:i | aBlock value: (self at: i) ] q~ssq~uq~sq~uq~q~ uq~ with:pad:do:sq~uq~q~4uq~-Q p!q)#20 2"21%!2&"sq~uq~sq~uq~q~ uq~sizesq~uq~q~ uq~sizesq~uq~q~ uq~max:sq~uq~q~ uq~at:sq~uq~q~ uq~at:sq~uq~q~ uq~ value:value:sq~uq~q~ uq~to:do:q~sq~Huq~q~Kq~kq~sq~uq~q~ uq~with: aCollection pad: aValue do: aBlock | ls rs | 1 to: ((ls <- self size) max: (rs <- aCollection size)) do: [:i | aBlock value: ((i <= ls) ifTrue: [ self at: i] ifFalse: [aValue]) value: ((i <= rs) ifTrue: [ aCollection at: i] ifFalse: [aValue]) ] q~sq~q~nq~q~usq~uq~sq~uq~q~'$sq~uq~q~4uq~: p!q 01rQ0!23 3Q13203!32sq~uq~ q~ 2q~ 2q~q~q~q~!q~ [q~q~!q~ [q~sq~Huq~q~Kq~hq~sq~uq~q~ uq~-+ aValue | size1 size2 newValue | " catenate two arrays together " size1 <- self size. size2 <- aValue size. newValue <- self class new: (size1 + size2). 1 to: size1 do: [ :i | newValue at: i put: (self at: i) ]. 1 to: size2 do: [ :i | newValue at: (size1 + i) put: (aValue at: i)]. ^ newValue q~ssq~uq~sq~uq~q~ uq~add:sq~uq~q~4uq~! sq~uq~q~q~q~nq~sq~uq~q~ uq~Cadd: newItem " optimized as a primitive " ^ <31 newItem self> q~ssq~uq~sq~uq~q~ uq~asStringsq~uq~q~4uq~ @ 01Asq~uq~sq~uq~q~ uq~sq~uq~q~ uq~ sq~uq~q~ uq~ inject:into:q~sq~Huq~q~K q~Vq~sq~uq~q~ uq~OasString ^ self inject: '' into: [:str :element | str + element + ' ']q~ssq~uq~sq~uq~q~ uq~ asStringArraysq~uq~q~4uq~ 0򂑁sq~uq~sq~uq~q~ uq~ printStringsq~uq~q~ uq~collect:sq~uq~q~ uq~asArrayq~q~q~q~sq~uq~q~ uq~@asStringArray ^ (self collect: [:n | n printString]) asArray q~ssq~uq~sq~uq~q~ uq~ asTextArraysq~uq~q~4uq~$@A pQ 01 10sq~uq~ sq~uq~q~ uq~'THIS SHOULD NOT BE CALLED (asTextArray)q~sq~uq~q~ uq~sizesq~uq~q~ uq~new:sq~uq~q~ uq~sizesq~uq~q~ uq~at:sq~uq~q~ uq~ printStringsq~uq~q~ uq~at:put:sq~uq~q~ uq~to:do:q~sq~Huq~q~Kq~Vq~sq~uq~q~ uq~asTextArray | na | <18 'THIS SHOULD NOT BE CALLED (asTextArray)'>. na <- Array new: self size. 1 to: self size do: [:i | na at: i put: (self at: i) printString]. ^ na q~ssq~uq~q~sq~uq~q~4uq~ ! !"sq~uq~q~q~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~at: index ifAbsent: exceptionBlock (self includesKey: index) ifTrue: [ ^ <30 self index>] ifFalse: [ ^ exceptionBlock value ] q~ssq~uq~q~!sq~uq~q~4uq~ ! " ! A D!sq~uq~q~sq~uq~q~ uq~array indexing error q~ 2q~sq~uq~q~ uq~ q~q~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~at: index put: value (self includesKey: index) ifTrue: [<5 value self index>] ifFalse: [ ^ self error: 'array indexing error ' + self size printString + ' '+ index printString ] q~ssq~uq~sq~uq~q~ uq~copysq~uq~q~4uq~ sq~uq~q~,gq~sq~Huq~q~Kq~nq~sq~uq~q~ uq~copy ^ self asArray q~ssq~uq~sq~uq~q~ uq~edit:sq~uq~q~4uq~@Bp0DEG * 4' 452 r02 q1I   1rc 6 s!3  0 3!  1ǖ 2 !s!3 "0 #3! $ %1&ǫ'! (0 ) *01 +0 ,sq~uq~-q~wsq~uq~q~ uq~newsq~uq~q~ uq~ Array editorsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Ksq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~ asStringArraysq~uq~q~ uq~at:sq~uq~q~ uq~at:put:sq~uq~q~ uq~ asStringArraysq~uq~q~ uq~setList:sq~uq~q~ uq~edit:sq~uq~q~ uq~ list:action:sq~uq~q~ uq~setPane:q~sq~uq~q~ uq~ informationsq~uq~q~ uq~new:sq~uq~q~ uq~sizesq~uq~q~ uq~sizesq~uq~q~ uq~inspectsq~uq~q~ uq~on:do:sq~uq~q~ uq~add ...q~wsq~uq~q~ uq~add:sq~uq~q~ uq~value:sq~uq~q~ uq~eval:sq~uq~q~ uq~closesq~uq~q~ uq~edit:sq~uq~q~ uq~on:do:sq~uq~q~ uq~remove selectedsq~uq~q~ uq~ indexSelectedsq~uq~q~ uq~ removeAt:sq~uq~q~ uq~value:sq~uq~q~ uq~closesq~uq~q~ uq~edit:sq~uq~q~ uq~on:do:sq~uq~q~ uq~ change to...q~wsq~uq~q~ uq~eval:sq~uq~q~ uq~closesq~uq~q~ uq~on:do:sq~uq~q~ uq~addMenu:sq~uq~q~ uq~showq~sq~Huq~q~K%q~lq~sq~uq~q~ uq~oedit: cb | w m p n | w <- Window new title: 'Array editor'. w width: 300 height: 200. p <- Pane list: self asStringArray action: [:i | (self at: i) edit: [:nv | self at: i put: nv. p setList: self asStringArray ] ]. w setPane: p. m <- Menu new: 'information'. m on: 'size' do: [ (self size) inspect ]. m on: 'add ...' do: [ Window eval: [:nv | n <- self add: nv. cb value: n ]. w close. n edit: cb]. m on: 'remove selected' do: [ n <- self removeAt: p indexSelected. cb value: n. w close. n edit: cb ]. m on: 'change to...' do: [ Window eval: cb. w close ]. w addMenu: m. w showq~ssq~uq~sq~uq~q~ uq~ from:size:sq~uq~q~4uq~ !!"Qsq~uq~sq~uq~q~ uq~-sq~uq~q~ uq~from:to:q~sq~Huq~q~K q~nq~sq~uq~q~ uq~>from: start size: sz ^ self from: start to: (start + sz - 1)q~ssq~uq~sq~uq~q~ uq~from:to:sq~uq~q~4uq~7!Pp" Q0Pq 1rQ1023 00Qp2sq~uq~ q~q~ 2q~,Eq~q~q~q~q~q~!q~ [q~sq~Huq~q~Kq~hq~sq~uq~q~ uq~from: low to: high | start size newArray | start <- low max: 0. size <- (high min: self size) + 1 - start max: 0. newArray <- self class new: size. 1 to: size do: [:i | newArray at: i put: (self at: start). start <- start + 1]. ^ newArray q~ssq~uq~sq~uq~q~ uq~inspectsq~uq~q~4uq~D@Bp0DE0G  2򃛂MNq14   01 0 sq~uq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~Array inspectorsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Ksq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~ asStringArraysq~uq~q~ uq~at:sq~uq~q~ uq~inspectsq~uq~q~ uq~ list:action:sq~uq~q~ uq~setPane:q~sq~uq~q~ uq~ informationsq~uq~q~ uq~new:sq~uq~q~ uq~sizesq~uq~q~ uq~sizesq~uq~q~ uq~inspectsq~uq~q~ uq~on:do:sq~uq~q~ uq~addMenu:sq~uq~q~ uq~showq~sq~Huq~q~Kq~kq~sq~uq~q~ uq~inspect | w m | w <- Window new title: 'Array inspector'. w width: 300 height: 200. w setPane: (Pane list: self asStringArray action: [:i | (self at: i) inspect ]). m <- Menu new: 'information'. m on: 'size' do: [ (self size) inspect ]. w addMenu: m. w show q~ssq~uq~q~sq~uq~q~4uq~ @ sq~uq~sq~uq~q~ uq~#q~q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~'printString ^ '#' + super printString q~ssq~uq~sq~uq~q~ uq~ removeAt:sq~uq~q~4uq~M!Q ZB QpQ!Q,01 1!Q E01Q 1 0sq~uq~sq~uq~q~ uq~sizesq~uq~q~ uq~ between:and:q~sq~uq~q~ uq~sizesq~uq~q~ uq~-sq~uq~q~ uq~new:sq~uq~q~ uq~-sq~uq~q~ uq~to:sq~uq~q~ uq~at:sq~uq~q~ uq~at:put:sq~uq~q~ uq~do:sq~uq~q~ uq~sizesq~uq~q~ uq~to:sq~uq~q~ uq~-sq~uq~q~ uq~at:sq~uq~q~ uq~at:put:sq~uq~q~ uq~do:q~sq~Huq~q~Kq~Vq~sq~uq~q~ uq~removeAt: i | na | (i between: 1 and: self size) ifFalse: [ ^ self]. na <- Array new: self size - 1. (1 to: i-1) do: [:j | na at: j put: (self at: j)]. (i+1 to: self size) do: [:j | na at: j-1 put: (self at: j)]. ^ naq~ssq~uq~q~ 2sq~uq~q~4uq~ q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~1size " compute number of elements " ^ <4 self> q~ssq~uq~sq~uq~q~ uq~with:sq~uq~q~4uq~@A! sq~uq~sq~uq~q~ uq~ WITH SHOULD NOT BE USED ANY MOREq~ sq~uq~q~ uq~currentsq~uq~q~ uq~ backtraceq~q~Tq~nq~sq~uq~q~ uq~with: newItem <18 ( 'WITH SHOULD NOT BE USED ANY MORE' + Context current backtrace)>. " optimized as a primitive " ^ <31 newItem self> q~sq~q~nq~q~)sq~uq~sq~uq~q~'$sq~uq~q~4uq~ ! sq~uq~q~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~K+ arg " optimized by primitive for speed " ^ <24 (arg printString) self> q~ssq~uq~q~sq~uq~q~4uq~ !Psq~uq~q~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~)< arg ^ <26 self (arg printString)> < 0 q~ssq~uq~q~/sq~uq~q~4uq~ !Psq~uq~q~q~/q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~)= arg ^ <26 self (arg printString)> = 0 q~ssq~uq~q~sq~uq~q~4uq~ !A !"sq~uq~q~q~q~q~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~at: index ifAbsent: exceptionBlock (self includesKey: index) ifTrue: [ ^ Char new: <21 self index>] ifFalse: [ ^ exceptionBlock value ] q~ssq~uq~q~!sq~uq~q~4uq~ !" ! Bsq~uq~q~q~sq~uq~q~ uq~string indexing errorq~q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~at: index put: aValue (self includesKey: index) ifTrue: [<22 (aValue value) self index>] ifFalse: [self error: 'string indexing error' ] q~ssq~uq~sq~uq~q~ uq~breaksq~uq~q~4uq~ @sq~uq~sq~uq~q~ uq~ sq~uq~q~ uq~break:sq~uq~q~ uq~asArrayq~q~lq~nq~ sq~uq~q~ uq~$break ^ (self break: ' ') asArrayq~ssq~uq~sq~uq~q~ uq~break:sq~uq~q~4uq~C@qAp ,!2%1P"01Gq#Z+12q1P=01>Z0sq~uq~ sq~uq~q~ uq~q~q~q~,q~ 2q~q~sq~uq~q~ uq~q~q~ aq~ 2q~q~q~sq~Huq~q~Kq~kq~ sq~uq~q~ uq~break: separators | words word | " break string into words, using separators " word <- ''. words <- List new. self do: [:c | (separators includes: c) ifTrue: [ (word size > 0) " found a word " ifTrue: [ words add: word. word <- '' ] ] ifFalse: [ word <- word + c asString ] ]. " maybe a last word " (word size > 0) ifTrue: [ words add: word ]. ^ words q~ssq~uq~q~.>sq~uq~q~4uq~ @sq~uq~q~ q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~6copy " make a clone of ourself " ^ <23 self String> q~ssq~uq~sq~uq~q~ uq~doItsq~uq~q~4uq~@A p0C0EQZsq~uq~q~&sq~uq~q~ uq~ doItCommand ^sq~uq~q~ uq~ parseMethod:q~ sq~uq~q~ uq~newq~sq~uq~q~ uq~new:sq~uq~q~ uq~perform:withArguments:q~sq~Huq~q~Kq~q~ sq~uq~q~ uq~doIt | meth | meth <- Object parseMethod: 'doItCommand ^' + self. meth notNil ifTrue: [ ^ (Context new perform: meth withArguments: (Array new: 1) ) ] q~ssq~uq~sq~uq~q~ uq~edit:sq~uq~q~4uq~Y@Bp0DEGq1 01KLr2N4!1 0  2I! 0  02 0 sq~uq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~ String Editorsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Kdsq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~textAreasq~uq~q~ uq~setText:sq~uq~q~ uq~setPane:q~sq~uq~q~ uq~editsq~uq~q~ uq~new:sq~uq~q~ uq~ save editssq~uq~q~ uq~getTextsq~uq~q~ uq~value:sq~uq~q~ uq~closesq~uq~q~ uq~on:do:sq~uq~q~ uq~ change to...q~wsq~uq~q~ uq~eval:sq~uq~q~ uq~closesq~uq~q~ uq~on:do:sq~uq~q~ uq~addMenu:sq~uq~q~ uq~showq~sq~Huq~q~Kq~kq~ sq~uq~q~ uq~>edit: cb | w t m | w <- Window new title: 'String Editor'. w width: 300 height: 100. t <- Pane textArea. t setText: self. w setPane: t. m <- Menu new: 'edit'. m on: 'save edits' do: [ cb value: t getText. w close ]. m on: 'change to...' do: [ Window eval: cb. w close ]. w addMenu: m. w showq~ssq~uq~sq~uq~q~ uq~find:sq~uq~q~4uq~&Q !Q 0!!0ZZsq~uq~sq~uq~q~ uq~sizesq~uq~q~ uq~sizesq~uq~q~ uq~-sq~uq~q~ uq~sizesq~uq~q~ uq~ from:size:sq~uq~q~ uq~=sq~uq~q~ uq~to:do:q~sq~Huq~q~Kq~q~ sq~uq~q~ uq~find: substr 1 to: (self size - substr size + 1) do: [:i | (self from: i size: substr size) = substr ifTrue: [ ^ i] ]. ^ nilq~ssq~uq~sq~uq~q~ uq~inspectsq~uq~q~4uq~"@Bp0DEGq1 010sq~uq~ q~wsq~uq~q~ uq~newsq~uq~q~ uq~String Inspectorsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Kdsq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~textAreasq~uq~q~ uq~setText:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showq~sq~Huq~q~K q~kq~ sq~uq~q~ uq~inspect | w t m | w <- Window new title: 'String Inspector'. w width: 300 height: 100. t <- Pane textArea. t setText: self. w setPane: t. w showq~ssq~uq~sq~uq~q~ uq~inspect:sq~uq~q~4uq~?@Bp0DEGq1 01KLr2N/!1  02 0 sq~uq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~String Inspectorsq~uq~q~ uq~title:sq~Huq~q~K,sq~Huq~q~Kdsq~uq~q~ uq~ width:height:q~sq~uq~q~ uq~textAreasq~uq~q~ uq~setText:sq~uq~q~ uq~setPane:q~sq~uq~q~ uq~editsq~uq~q~ uq~new:sq~uq~q~ uq~changesq~uq~q~ uq~getTextsq~uq~q~ uq~value:sq~uq~q~ uq~on:do:sq~uq~q~ uq~addMenu:sq~uq~q~ uq~showq~sq~Huq~q~Kq~kq~ sq~uq~q~ uq~inspect: cb | w t m | w <- Window new title: 'String Inspector'. w width: 300 height: 100. t <- Pane textArea. t setText: self. w setPane: t. m <- Menu new: 'edit'. m on: 'change' do: [ cb value: t getText ]. w addMenu: m. w showq~ssq~uq~sq~uq~q~ uq~last:sq~uq~q~4uq~ !Q sq~uq~sq~uq~q~ uq~sizesq~uq~q~ uq~-sq~uq~q~ uq~sizesq~uq~q~ uq~from:to:q~sq~Huq~q~K q~nq~ sq~uq~q~ uq~5last: n ^ self from: self size - n + 1 to: self sizeq~ssq~uq~q~sq~uq~q~4uq~ q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~printString ^ self q~ssq~uq~q~ 2sq~uq~q~4uq~ q~sq~Huq~q~Kq~nq~ sq~uq~q~ uq~size ^ <4 self> q~sq~q~nq~q~sq~uq~sq~uq~q~ uq~ MetaStringq~)sq~uq~sq~uq~q~sq~uq~q~4uq~@!sq~uq~q~ q~sq~Huq~q~Kq~nq~1Ksq~uq~q~ uq~new: size ^ <20 String size> q~sq~q~q~q~uq~ Undefinedq~&sq~uq~sq~uq~q~+sq~uq~q~4uq~[q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~#isNil " yes, we are nil " ^ true q~ssq~uq~q~+sq~uq~q~4uq~\q~sq~Huq~q~Kq~nq~sq~uq~q~ uq~,notNil " no, we are not not-nil " ^ false q~ssq~uq~q~sq~uq~q~4uq~@sq~uq~sq~uq~q~ uq~nilq~sq~Huq~q~Kq~nq~sq~uq~q~ uq~printString ^ 'nil' q~ssq~uq~sq~uq~q~ uq~testsq~uq~q~4uq~+@pACq1EF1H0!202򃚂1sq~uq~ sq~uq~sq~uq~q~ uq~abcsq~uq~q~ uq~defsq~uq~q~ uq~ghiq~q~wsq~uq~q~ uq~newsq~uq~q~ uq~ List testsq~uq~q~ uq~title:sq~Huq~q~Ksq~Huq~q~Kdsq~uq~q~ uq~ width:height:sq~uq~sq~uq~q~ uq~ListPaneq~&sq~uq~sq~uq~sq~uq~q~ uq~ indexSelectedsq~uq~q~4uq~ Lsq~uq~q~q~q~nq~1sq~uq~q~ uq~indexSelected ^ <76 self>q~ssq~uq~sq~uq~q~ uq~setData:sq~uq~q~4uq~ !Msq~uq~q~q~q~nq~1sq~uq~q~ uq~3setData: a " set the data array " <77 self a>q~sq~q~nsq~uq~q~sq~uq~sq~uq~q~ uq~ MetaListPaneq~sq~uq~sq~uq~sq~uq~q~ uq~data:do:sq~uq~q~4uq~ !@RQ"CRKsq~uq~q~sq~uq~q~ uq~new:sq~uq~q~ uq~at:put:q~ sq~uq~q~ uq~methodssq~uq~q~ uq~at:q~sq~Huq~q~K q~nq~1sq~uq~q~ uq~ data: d do: action " need to fix this so block is accessed by name " ^ <75 self d ((Array new: 2) at: 1 put: action) (Block methods at: 2) >q~sq~q~sq~uq~q~q~sq~uq~q~ uq~at:sq~uq~q~ uq~data:do:sq~uq~q~ uq~setPane:sq~uq~q~ uq~showq~sq~Huq~q~Kq~kq~sq~uq~q~ uq~test | d w | d <- #('abc' 'def' 'ghi'). w <- Window new title: 'List test'. w width: 200 height: 100. w setPane: (ListPane data: d do: [:i | <18 i>. <18 (d at: i)>] ). w show q~ssq~uq~sq~uq~q~ uq~versionsq~uq~q~4uq~@sq~uq~sq~uq~q~ uq~image version 0.82q~q~q~nq~sq~uq~q~ uq~version ^ 'image version 0.82'q~sq~q~nq~sq~uq~sq~uq~q~ uq~ MetaUndefinedq~sq~uq~sq~uq~q~sq~uq~q~4uq~Zq~sq~Huq~q~Kq~nq~2sq~uq~q~ uq~-new " there is only one nil object " ^ nil q~sq~q~q~q~sq~uq~q~sq~uq~sq~uq~sq~uq~q~ uq~Falseq~ sq~uq~sq~uq~q~ sq~uq~q~4uq~\q~sq~Huq~q~Kq~nq~2&sq~uq~q~ uq~and: aBlock ^ false q~ssq~uq~q~#sq~uq~q~4uq~"sq~uq~q~q~sq~Huq~q~Kq~nq~2&sq~uq~q~ uq~:ifTrue: trueBlock ifFalse: falseBlock ^ falseBlock value q~ssq~uq~q~ sq~uq~q~4uq~[q~sq~Huq~q~Kq~nq~2&sq~uq~q~ uq~ not ^ true q~ssq~uq~q~ sq~uq~q~4uq~!sq~uq~q~q~sq~Huq~q~Kq~nq~2&sq~uq~q~ uq~or: aBlock ^ aBlock value q~ssq~uq~q~sq~uq~q~4uq~@sq~uq~sq~uq~q~ uq~falseq~sq~Huq~q~Kq~nq~2&sq~uq~q~ uq~printString ^ 'false' q~sq~q~nq~sq~uq~sq~uq~q~ uq~ MetaFalseq~ sq~uq~sq~uq~q~sq~uq~q~4uq~\q~sq~Huq~q~Kq~nq~2hsq~uq~q~ uq~0new " there is only one false value " ^ false q~sq~q~q~q~ur [LSmallInt;~ -xp q~nq~q~Vq~kq~hq~q~q~lq~q~Tq~q~ q~ q~K