nil subclass: #Object instanceVariableNames: '' category: 'Kernel'! !Object methodsFor: 'accessing'! basicAt: aString ^{' var value = self[aString]; if(typeof(value) == ''undefined'') { return nil; } else { return value; } '} ! basicAt: aString put: anObject ^{'return self[aString] = anObject'} ! basicDelete: aString {'delete self[aString]'} ! class ^{'return self.klass'} ! instVarAt: aString ^{' var value = self[''@''+aString]; if(typeof(value) == ''undefined'') { return nil; } else { return value; } '} ! instVarAt: aString put: anObject ^{'self[''@'' + aString] = anObject'} ! size self error: 'Object not indexable' ! yourself ^self ! ! !Object methodsFor: 'comparing'! = anObject ^{'return self == anObject'} ! ~= anObject ^(self = anObject) == false ! ! !Object methodsFor: 'converting'! -> anObject ^Association key: self value: anObject ! asJavascript ^self asString ! asString ^self printString ! ! !Object methodsFor: 'copying'! copy ^self shallowCopy postCopy ! deepCopy {' var copy = self.klass._new(); for(var i in self) { if(/^@.+/.test(i)) { copy[i] = self[i]._deepCopy(); } } return copy; '}. ! postCopy ! shallowCopy ^{' var copy = self.klass._new(); for(var i in self) { if(/^@.+/.test(i)) { copy[i] = self[i]; } } return copy; '} ! ! !Object methodsFor: 'error handling'! error: aString Error signal: aString ! perform: aSymbol ^self perform: aSymbol withArguments: #() ! perform: aSymbol withArguments: aCollection ^self basicPerform: aSymbol asSelector withArguments: aCollection ! basicPerform: aSymbol ^self basicPerform: aSymbol withArguments: #() ! basicPerform: aSymbol withArguments: aCollection ^{'return self[aSymbol].apply(self, aCollection);'} ! shouldNotImplement self error: 'This method should not be implemented in ', self class name ! subclassResponsibility self error: 'This method is a responsibility of a subclass' ! try: aBlock catch: anotherBlock {'try{aBlock()} catch(e) {anotherBlock(e)}'} ! ! !Object methodsFor: 'initialization'! initialize ! ! !Object methodsFor: 'message handling'! perform: aSymbol ^self perform: aSymbol withArguments: #() ! ! !Object methodsFor: 'printing'! printNl {'console.log(self)'} ! printString ^'a ', self class name ! ! !Object methodsFor: 'testing'! ifNil: aBlock ^self ! ifNil: aBlock ifNotNil: anotherBlock ^anotherBlock value ! ifNotNil: aBlock ^aBlock value ! ifNotNil: aBlock ifNil: anotherBlock ^aBlock value ! isClass ^false ! isKindOf: aClass ^(self isMemberOf: aClass) ifTrue: [true] ifFalse: [self class inheritsFrom: aClass] ! isMemberOf: aClass ^self class = aClass ! isMetaclass ^false ! isNil ^false ! isNumber ^false ! isParseFailure ^false ! isString ^false ! notNil ^self isNil not ! ! !Object methodsFor: '*Canvas'! appendToBrush: aTagBrush aTagBrush append: self asString ! ! Object subclass: #Smalltalk instanceVariableNames: '' category: 'Kernel'! Smalltalk class instanceVariableNames: 'current'! !Smalltalk class methodsFor: 'accessing'! current ^{'return smalltalk'} ! ! !Smalltalk methodsFor: 'accessing'! classes ^{'return self.classes()'} ! ! Object subclass: #Behavior instanceVariableNames: '' category: 'Kernel'! !Behavior methodsFor: 'accessing'! addCompiledMethod: aMethod {'self.fn.prototype[aMethod.selector._asSelector()] = aMethod.fn; self.fn.prototype.methods[aMethod.selector] = aMethod'} ! removeCompiledMethod: aMethod {'delete self.fn.prototype[aMethod.selector._asSelector()]; delete self.fn.prototype.methods[aMethod.selector]'} ! allSubclasses | result | result := self subclasses. self subclasses do: [:each | result addAll: each allSubclasses]. ^result ! instanceVariableNames ^{'return self.iVarNames'} ! methodDictionary ^{'var dict = smalltalk.Dictionary._new(); var methods = self.fn.prototype.methods; for(var i in methods) { if(methods[i].selector) { dict._at_put_(methods[i].selector, methods[i]); } }; return dict'} ! methodsFor: aString ^ClassCategoryReader new class: self category: aString; yourself ! comment ^(self basicAt: 'comment') ifNil: [''] ! comment: aString self basicAt: 'comment' put: aString ! commentStamp ^ClassCommentReader new class: self; yourself ! name ^{'return self.className || nil'} ! prototype ^{'return self.fn.prototype'} ! subclasses ^{'return smalltalk.subclasses(self)'} ! superclass ^{'return self.superclass || nil'} ! withAllSubclasses ^(Array with: self) addAll: self allSubclasses; yourself ! ! !Behavior methodsFor: 'instance creation'! basicNew ^{'return new self.fn();'} ! new ^self basicNew initialize; yourself ! ! Behavior subclass: #Class instanceVariableNames: '' category: 'Kernel'! !Class methodsFor: 'accessing'! category ^{'return self.category'} ! category: aString {'self.category = aString'} ! ! !Class methodsFor: 'class creation'! subclass: aString instanceVariableNames: anotherString ^self subclass: aString instanceVariableNames: anotherString category: nil ! subclass: aString instanceVariableNames: aString2 category: aString3 ^ClassBuilder new superclass: self subclass: aString instanceVariableNames: aString2 category: aString3 ! ! !Class methodsFor: 'printing'! printString ^self name ! ! !Class methodsFor: 'testing'! isClass ^true ! ! Behavior subclass: #Metaclass instanceVariableNames: '' category: 'Kernel'! !Metaclass methodsFor: 'accessing'! instanceClass ^{'return self.instanceClass'} ! instanceVariableNames: aCollection ClassBuilder new class: self instanceVariableNames: aCollection ! ! !Metaclass methodsFor: 'printing'! printString ^self instanceClass name, ' class' ! ! !Metaclass methodsFor: 'testing'! isMetaclass ^true ! ! Object subclass: #CompiledMethod instanceVariableNames: '' category: 'Kernel'! !CompiledMethod methodsFor: 'accessing'! category ^(self basicAt: 'category') ifNil: [''] ! category: aString self basicAt: 'category' put: aString ! fn ^self basicAt: 'fn' ! fn: aBlock self basicAt: 'fn' put: aBlock ! selector ^self basicAt: 'selector' ! selector: aString self basicAt: 'selector' put: aString ! source ^(self basicAt: 'source') ifNil: [''] ! source: aString self basicAt: 'source' put: aString ! ! Object subclass: #Number instanceVariableNames: '' category: 'Kernel'! !Number methodsFor: 'arithmetic'! * aNumber ^{'return self * aNumber'} ! + aNumber ^{'return self + aNumber'} ! - aNumber ^{'return self - aNumber'} ! / aNumber ^{'return self / aNumber'} ! max: aNumber ^{'return Math.max(self, aNumber);'} ! min: aNumber ^{'return Math.min(self, aNumber);'} ! ! !Number methodsFor: 'comparing'! < aNumber ^{'return self < aNumber'} ! <= aNumber ^{'return self <= aNumber'} ! = aNumber ^{'return Number(self) == aNumber'} ! > aNumber ^{'return self > aNumber'} ! >= aNumber ^{'return self >= aNumber'} ! ! !Number methodsFor: 'converting'! asJavascript ^'(', self printString, ')' ! asString ^self printString ! rounded ^{'return Math.round(self);'} ! to: aNumber | array first last count | first := self truncated. last := aNumber truncated + 1. count := 1. (first <= last) ifFalse: [self error: 'Wrong interval']. array := Array new. (last - first) timesRepeat: [ array at: count put: first. count := count + 1. first := first + 1]. ^array ! truncated ^{'return Math.floor(self);'} ! ! !Number methodsFor: 'enumerating'! timesRepeat: aBlock | integer count | integer := self truncated. count := 1. [count > self] whileFalse: [ aBlock value. count := count + 1] ! to: aNumber do: aBlock ^(self to: aNumber) do: aBlock ! ! !Number methodsFor: 'printing'! printString ^{'return String(self)'} ! ! !Number methodsFor: 'testing'! isNumber ^true ! ! Object subclass: #BlockClosure instanceVariableNames: '' category: 'Kernel'! !BlockClosure methodsFor: 'accessing'! compiledSource ^{'return self.toString()'} ! ! !BlockClosure methodsFor: 'controlling'! whileFalse: aBlock {'while(!!self()) {aBlock()}'} ! whileTrue: aBlock {'while(self()) {aBlock()}'} ! ! !BlockClosure methodsFor: 'error handling'! on: anErrorClass do: aBlock self try: self catch: [:error | (error isKindOf: anErrorClass) ifTrue: [aBlock value] ifFalse: [error signal]] ! ! !BlockClosure methodsFor: 'evaluating'! value ^{'return self();'} ! value: anArg ^{'return self(anArg);'} ! value: firstArg value: secondArg ^{'return self(firstArg, secondArg);'} ! value: firstArg value: secondArg value: thirdArg ^{'return self(firstArg, secondArg, thirdArg);'} ! valueWithPossibleArguments: aCollection ^{'return self.apply(null, aCollection);'} ! ! !BlockClosure methodsFor: '*JQuery'! appendToJQuery: aJQuery | canvas | canvas := HTMLCanvas new. self value: canvas. aJQuery append: canvas ! ! !BlockClosure methodsFor: '*Canvas'! appendToBrush: aTagBrush aTagBrush appendBlock: self ! ! Object subclass: #Boolean instanceVariableNames: '' category: 'Kernel'! !Boolean methodsFor: 'comparing'! = aBoolean ^{'return Boolean(self == true) == aBoolean'} ! ! !Boolean methodsFor: 'controlling'! and: aBlock ^self = true ifTrue: aBlock ifFalse: [false] ! ifFalse: aBlock ^self ifTrue: [] ifFalse: aBlock ! ifFalse: aBlock ifTrue: anotherBlock ^self ifTrue: anotherBlock ifFalse: aBlock ! ifTrue: aBlock ^self ifTrue: aBlock ifFalse: [] ! ifTrue: aBlock ifFalse: anotherBlock ^{' if(self == true) { return aBlock(); } else { return anotherBlock(); } '} ! not ^self = false ! or: aBlock ^self = true ifTrue: [true] ifFalse: aBlock ! ! !Boolean methodsFor: 'copying'! deepCopy ^self ! shallowCopy ^self ! ! !Boolean methodsFor: 'printing'! printString ^{'return self.toString()'} ! ! Object subclass: #UndefinedObject instanceVariableNames: '' category: 'Kernel'! !UndefinedObject class methodsFor: 'instance creation'! new self error: 'You cannot create new instances of UndefinedObject. Use nil' ! ! !UndefinedObject methodsFor: 'class creation'! subclass: aString instanceVariableNames: anotherString ^self subclass: aString instanceVariableNames: anotherString category: nil ! subclass: aString instanceVariableNames: aString2 category: aString3 ^ClassBuilder new superclass: self subclass: aString instanceVariableNames: aString2 category: aString3 ! ! !UndefinedObject methodsFor: 'copying'! deepCopy ^self ! shallowCopy ^self ! ! !UndefinedObject methodsFor: 'printing'! printString ^'nil' ! ! !UndefinedObject methodsFor: 'testing'! ifNil: aBlock ^self ifNil: aBlock ifNotNil: [] ! ifNil: aBlock ifNotNil: anotherBlock ^aBlock value ! ifNotNil: aBlock ^self ! ifNotNil: aBlock ifNil: anotherBlock ^anotherBlock value ! isNil ^true ! notNil ^false ! ! Object subclass: #Error instanceVariableNames: 'messageText' category: 'Kernel'! !Error class methodsFor: 'instance creation'! signal: aString ^self new messageText: aString; signal ! ! !Error methodsFor: 'accessing'! messageText ^messageText ! messageText: aString messageText := aString ! ! !Error methodsFor: 'signaling'! signal ^{'throw({smalltalkError: self})'} ! ! Object subclass: #Collection instanceVariableNames: '' category: 'Kernel'! !Collection class methodsFor: 'accessing'! streamClass ^Stream ! ! !Collection class methodsFor: 'instance creation'! with: anObject ^self new add: anObject; yourself ! with: anObject with: anotherObject ^self new add: anObject; add: anotherObject; yourself ! with: firstObject with: secondObject with: thirdObject ^self new add: firstObject; add: secondObject; add: thirdObject; yourself ! withAll: aCollection ^self new addAll: aCollection; yourself ! ! !Collection methodsFor: 'accessing'! at: anIndex ^self at: anIndex ifAbsent: [ self errorNotFound] ! at: anIndex ifAbsent: aBlock self subclassResponsibility ! at: anIndex put: anObject self subclassResponsibility ! first ^self at: 1 ! fourth ^self at: 4 ! last ^self at: self size ! readStream ^self stream ! second ^self at: 2 ! size self subclassResponsibility ! stream ^self streamClass on: self ! streamClass ^self class streamClass ! third ^self at: 3 ! writeStream ^self stream ! ! !Collection methodsFor: 'adding/removing'! add: anObject self subclassResponsibility ! addAll: aCollection aCollection do: [:each | self add: each]. ^aCollection ! remove: anObject self subclassResponsibility ! ! !Collection methodsFor: 'converting'! asArray | array index | array := Array new. index := 0. self do: [:each | index := index + 1. array at: index put: each]. ^array ! ! !Collection methodsFor: 'copying'! , aCollection ^self copy addAll: aCollection; yourself ! copyFrom: anIndex to: anotherIndex self subclassResponsibility ! copyWith: anObject ^self copy add: anObject; yourself ! copyWithAll: aCollection ^self copy addAll: aCollection; yourself ! ! !Collection methodsFor: 'enumerating'! collect: aBlock | stream | stream := self class new writeStream. self do: [:each | stream nextPut: (aBlock value: each)]. ^stream contents ! detect: aBlock ^self detect: aBlock ifNone: [self errorNotFound] ! detect: aBlock ifNone: anotherBlock ^{' for(var i = 0; i < self.length; i++) if(aBlock(self[i])) return self[i]; return anotherBlock(); '} ! do: aBlock {'for(var i=0;i aString ^{'return String(self) > aString'} ! < aString ^{'return String(self) < aString'} ! >= aString ^{'return String(self) >= aString'} ! <= aString ^{'return String(self) <= aString'} ! ! !String methodsFor: 'converting'! asCharacterParser ^PPCharacterParser new string: self ! asChoiceParser ^PPChoiceParser withAll: (self asArray collect: [:each | each asParser]) ! asJavascript ^{' if(self.search(/^[a-zA-Z0-9_:.$ ]*$/) == -1) return "unescape(\"" + escape(self) + "\")"; else return "\"" + self + "\""; '} ! asNumber ^{'return Number(self);'} ! asParser ^PPStringParser new string: self ! asSelector | selector | selector := '_', self. selector := selector replace: ':' with: '_'. selector := selector replace: '[+]' with: '_plus'. selector := selector replace: '-' with: '_minus'. selector := selector replace: '[*]' with: '_star'. selector := selector replace: '[/]' with: '_slash'. selector := selector replace: '>' with: '_gt'. selector := selector replace: '<' with: '_lt'. selector := selector replace: '=' with: '_eq'. selector := selector replace: ',' with: '_comma'. selector := selector replace: '[@]' with: '_at'. ^selector ! asString ^self ! tokenize: aString ^{'return self.split(aString)'} ! ! !String methodsFor: 'copying'! , aString ^{'return self + aString'} ! copyFrom: anIndex to: anotherIndex ^{'return self.substring(anIndex - 1, anotherIndex);'} ! deepCopy ^self shallowCopy ! shallowCopy ^self class fromString: self ! ! !String methodsFor: 'error handling'! errorReadOnly self error: 'Object is read-only' ! ! !String methodsFor: 'printing'! printNl {'console.log(self)'} ! printString ^'''', self, '''' ! ! !String methodsFor: 'regular expressions'! match: aRegexp ^{'return self.search(aRegexp) !!= -1'} ! replace: aString with: anotherString ^self replaceRegexp: (RegularExpression fromString: aString flag: 'g') with: anotherString ! replaceRegexp: aRegexp with: aString ^{'return self.replace(aRegexp, aString);'} ! ! !String methodsFor: 'testing'! isString ^true ! ! !String methodsFor: '*JQuery'! asJQuery ^JQuery fromString: self ! appendToJQuery: aJQuery {'aJQuery._appendElement_(String(self))'} ! ! !String methodsFor: '*Canvas'! appendToBrush: aTagBrush aTagBrush appendString: self ! ! Object subclass: #RegularExpression instanceVariableNames: '' category: 'Kernel'! !RegularExpression class methodsFor: 'instance creation'! fromString: aString ^self fromString: aString flag: '' ! fromString: aString flag: anotherString ^{'return new RegExp(aString, anotherString);'} ! ! !RegularExpression methodsFor: 'evaluating'! compile: aString ^{'return self.compile(aString);'} ! exec: aString ^{'return self.exec(aString);'} ! test: aString ^{'return self.test(aString);'} ! ! Collection subclass: #Array instanceVariableNames: '' category: 'Kernel'! !Array methodsFor: 'accessing'! at: anIndex ifAbsent: aBlock ^{' var value = self[anIndex - 1]; if(value === undefined) { return aBlock(); } else { return value; } '} ! at: anIndex put: anObject ^{'return self[anIndex - 1] = anObject'} ! size ^{'return self.length'} ! ! !Array methodsFor: 'adding'! add: anObject ^{'self.push(anObject); return anObject;'} ! addLast: anObject ^self add: anObject ! remove: anObject {'for(var i=0;i