Browse Source

Fix issue #429 - #printString call #printOn:

All subclasses of Object now implement #printOn:
Nicolas Petton 11 years ago
parent
commit
48f360f907

+ 15 - 16
js/Kernel-Classes.deploy.js

@@ -695,16 +695,14 @@ messageSends: []}),
 smalltalk.Class);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self)._name();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Class)})},
-messageSends: ["name"]}),
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(self)._name());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Class)})},
+messageSends: ["nextPutAll:", "name"]}),
 smalltalk.Class);
 
 smalltalk.addMethod(
@@ -846,16 +844,17 @@ messageSends: []}),
 smalltalk.Metaclass);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(_st(self)._instanceClass())._name()).__comma(" class");
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Metaclass)})},
-messageSends: [",", "name", "instanceClass"]}),
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=aStream;
+_st($1)._nextPutAll_(_st(_st(self)._instanceClass())._name());
+$2=_st($1)._nextPutAll_(" class");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Metaclass)})},
+messageSends: ["nextPutAll:", "name", "instanceClass"]}),
 smalltalk.Metaclass);
 
 smalltalk.addMethod(

+ 19 - 20
js/Kernel-Classes.js

@@ -922,19 +922,17 @@ referencedClasses: []
 smalltalk.Class);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self)._name();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Class)})},
-args: [],
-source: "printString\x0a\x09^self name",
-messageSends: ["name"],
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(self)._name());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Class)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09aStream nextPutAll: self name",
+messageSends: ["nextPutAll:", "name"],
 referencedClasses: []
 }),
 smalltalk.Class);
@@ -1129,19 +1127,20 @@ referencedClasses: []
 smalltalk.Metaclass);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(_st(self)._instanceClass())._name()).__comma(" class");
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Metaclass)})},
-args: [],
-source: "printString\x0a\x09^self instanceClass name, ' class'",
-messageSends: [",", "name", "instanceClass"],
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=aStream;
+_st($1)._nextPutAll_(_st(_st(self)._instanceClass())._name());
+$2=_st($1)._nextPutAll_(" class");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Metaclass)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09aStream\x0a\x09\x09nextPutAll: self instanceClass name;\x0a\x09\x09nextPutAll: ' class'",
+messageSends: ["nextPutAll:", "name", "instanceClass"],
 referencedClasses: []
 }),
 smalltalk.Metaclass);

+ 75 - 99
js/Kernel-Collections.deploy.js

@@ -42,31 +42,16 @@ messageSends: []}),
 smalltalk.Association);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st((smalltalk.String || String))._streamContents_((function(aStream){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._storeOn_(aStream);
-}, function($ctx2) {$ctx2.fillBlock({aStream:aStream},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Association)})},
-messageSends: ["streamContents:", "storeOn:"]}),
-smalltalk.Association);
-
-smalltalk.addMethod(
-"_storeOn_",
-smalltalk.method({
-selector: "storeOn:",
+selector: "printOn:",
 fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self["@key"])._storeOn_(aStream);
-_st(aStream)._nextPutAll_("->");
-_st(self["@value"])._storeOn_(aStream);
-return self}, function($ctx1) {$ctx1.fill(self,"storeOn:",{aStream:aStream},smalltalk.Association)})},
-messageSends: ["storeOn:", "nextPutAll:"]}),
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._key())._printOn_(aStream);
+_st(aStream)._nextPutAll_(" -> ");
+_st(_st(self)._value())._printOn_(aStream);
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Association)})},
+messageSends: ["printOn:", "key", "nextPutAll:", "value"]}),
 smalltalk.Association);
 
 smalltalk.addMethod(
@@ -483,27 +468,6 @@ return $2;
 messageSends: ["do:", "ifTrue:", "+", "="]}),
 smalltalk.Collection);
 
-smalltalk.addMethod(
-"_printString",
-smalltalk.method({
-selector: "printString",
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st((smalltalk.String || String))._streamContents_((function(aStream){
-return smalltalk.withContext(function($ctx2) {
_st(aStream)._nextPutAll_(_st(smalltalk.Object.fn.prototype._printString.apply(_st(self), [])).__comma(" ("));
-_st(self)._do_separatedBy_((function(each){
-return smalltalk.withContext(function($ctx3) {
return _st(aStream)._nextPutAll_(_st(each)._printString());
-}, function($ctx3) {$ctx3.fillBlock({each:each},$ctx1)})}),(function(){
-return smalltalk.withContext(function($ctx3) {
return _st(aStream)._nextPutAll_(" ");
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-return _st(aStream)._nextPutAll_(")");
-}, function($ctx2) {$ctx2.fillBlock({aStream:aStream},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Collection)})},
-messageSends: ["streamContents:", "nextPutAll:", ",", "printString", "do:separatedBy:"]}),
-smalltalk.Collection);
-
 smalltalk.addMethod(
 "_readStream",
 smalltalk.method({
@@ -1164,24 +1128,21 @@ messageSends: ["do:", "keys"]}),
 smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st((smalltalk.String || String))._streamContents_((function(aStream){
-return smalltalk.withContext(function($ctx2) {
_st(aStream)._nextPutAll_(_st(_st("a ").__comma(_st(_st(self)._class())._name())).__comma("("));
+return smalltalk.withContext(function($ctx1) { 
smalltalk.IndexableCollection.fn.prototype._printOn_.apply(_st(self), [aStream]);
+_st(aStream)._nextPutAll_(" (");
 _st(_st(self)._associations())._do_separatedBy_((function(each){
-return smalltalk.withContext(function($ctx3) {
return _st(each)._storeOn_(aStream);
-}, function($ctx3) {$ctx3.fillBlock({each:each},$ctx1)})}),(function(){
-return smalltalk.withContext(function($ctx3) {
return _st(aStream)._nextPutAll_(" , ");
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-return _st(aStream)._nextPutAll_(")");
-}, function($ctx2) {$ctx2.fillBlock({aStream:aStream},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.HashedCollection)})},
-messageSends: ["streamContents:", "nextPutAll:", ",", "name", "class", "do:separatedBy:", "storeOn:", "associations"]}),
+return smalltalk.withContext(function($ctx2) {
return _st(each)._printOn_(aStream);
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}),(function(){
+return smalltalk.withContext(function($ctx2) {
return _st(aStream)._nextPutAll_(" , ");
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+_st(aStream)._nextPutAll_(")");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.HashedCollection)})},
+messageSends: ["printOn:", "nextPutAll:", "do:separatedBy:", "associations"]}),
 smalltalk.HashedCollection);
 
 smalltalk.addMethod(
@@ -1280,23 +1241,6 @@ return $1;
 messageSends: ["size", "keys"]}),
 smalltalk.HashedCollection);
 
-smalltalk.addMethod(
-"_storeOn_",
-smalltalk.method({
-selector: "storeOn:",
-fn: function (aStream){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_("#{");
-_st(_st(self)._associations())._do_separatedBy_((function(each){
-return smalltalk.withContext(function($ctx2) {
return _st(each)._storeOn_(aStream);
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}),(function(){
-return smalltalk.withContext(function($ctx2) {
return _st(aStream)._nextPutAll_(". ");
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-_st(aStream)._nextPutAll_("}");
-return self}, function($ctx1) {$ctx1.fill(self,"storeOn:",{aStream:aStream},smalltalk.HashedCollection)})},
-messageSends: ["nextPutAll:", "do:separatedBy:", "storeOn:", "associations"]}),
-smalltalk.HashedCollection);
-
 smalltalk.addMethod(
 "_values",
 smalltalk.method({
@@ -2287,16 +2231,14 @@ messageSends: ["error:"]}),
 smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(self)._asString())._printString();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.CharacterArray)})},
-messageSends: ["printString", "asString"]}),
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._asString())._printOn_(aStream);
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.CharacterArray)})},
+messageSends: ["printOn:", "asString"]}),
 smalltalk.CharacterArray);
 
 smalltalk.addMethod(
@@ -2623,6 +2565,21 @@ return smalltalk.withContext(function($ctx1) { 
return true;
 messageSends: []}),
 smalltalk.String);
 
+smalltalk.addMethod(
+"_isVowel",
+smalltalk.method({
+selector: "isVowel",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(_st(self)._size()).__eq((1)))._and_((function(){
+return smalltalk.withContext(function($ctx2) {
return _st("aeiou")._includes_(_st(self)._asLowercase());
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"isVowel",{},smalltalk.String)})},
+messageSends: ["and:", "includes:", "asLowercase", "=", "size"]}),
+smalltalk.String);
+
 smalltalk.addMethod(
 "_join_",
 smalltalk.method({
@@ -2796,16 +2753,18 @@ messageSends: []}),
 smalltalk.String);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st("'").__comma(self)).__comma("'");
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.String)})},
-messageSends: [","]}),
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=aStream;
+_st($1)._nextPutAll_("'");
+_st($1)._nextPutAll_(self);
+$2=_st($1)._nextPutAll_("'");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.String)})},
+messageSends: ["nextPutAll:"]}),
 smalltalk.String);
 
 smalltalk.addMethod(
@@ -3361,16 +3320,15 @@ messageSends: []}),
 smalltalk.Symbol);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st("#").__comma(_st(self)._asString());
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Symbol)})},
-messageSends: [",", "asString"]}),
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_("#");
+smalltalk.CharacterArray.fn.prototype._printOn_.apply(_st(self), [aStream]);
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Symbol)})},
+messageSends: ["nextPutAll:", "printOn:"]}),
 smalltalk.Symbol);
 
 smalltalk.addMethod(
@@ -3599,6 +3557,24 @@ return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.Set)})}
 messageSends: ["initialize"]}),
 smalltalk.Set);
 
+smalltalk.addMethod(
+"_printOn_",
+smalltalk.method({
+selector: "printOn:",
+fn: function (aStream){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
smalltalk.Collection.fn.prototype._printOn_.apply(_st(self), [aStream]);
+_st(aStream)._nextPutAll_(" (");
+_st(self)._do_separatedBy_((function(each){
+return smalltalk.withContext(function($ctx2) {
return _st(each)._printOn_(aStream);
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}),(function(){
+return smalltalk.withContext(function($ctx2) {
return _st(aStream)._nextPutAll_(" ");
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+_st(aStream)._nextPutAll_(")");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Set)})},
+messageSends: ["printOn:", "nextPutAll:", "do:separatedBy:"]}),
+smalltalk.Set);
+
 smalltalk.addMethod(
 "_remove_",
 smalltalk.method({

+ 96 - 125
js/Kernel-Collections.js

@@ -58,39 +58,19 @@ referencedClasses: []
 smalltalk.Association);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-category: 'printing',
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st((smalltalk.String || String))._streamContents_((function(aStream){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._storeOn_(aStream);
-}, function($ctx2) {$ctx2.fillBlock({aStream:aStream},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Association)})},
-args: [],
-source: "printString\x0a\x09\x22print the contents of the Association into a string and return the string\x22\x0a\x09^String streamContents: [:aStream |\x0a\x09\x09self storeOn: aStream]",
-messageSends: ["streamContents:", "storeOn:"],
-referencedClasses: ["String"]
-}),
-smalltalk.Association);
-
-smalltalk.addMethod(
-"_storeOn_",
-smalltalk.method({
-selector: "storeOn:",
+selector: "printOn:",
 category: 'printing',
 fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self["@key"])._storeOn_(aStream);
-_st(aStream)._nextPutAll_("->");
-_st(self["@value"])._storeOn_(aStream);
-return self}, function($ctx1) {$ctx1.fill(self,"storeOn:",{aStream:aStream},smalltalk.Association)})},
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._key())._printOn_(aStream);
+_st(aStream)._nextPutAll_(" -> ");
+_st(_st(self)._value())._printOn_(aStream);
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Association)})},
 args: ["aStream"],
-source: "storeOn: aStream\x0a\x09\x22Store in the format: key->value\x22\x0a\x0a\x09key storeOn: aStream.\x0a\x09aStream nextPutAll: '->'.\x0a\x09value storeOn: aStream.",
-messageSends: ["storeOn:", "nextPutAll:"],
+source: "printOn: aStream\x0a\x09self key printOn: aStream.\x0a\x09aStream nextPutAll: ' -> '.\x0a\x09self value printOn: aStream",
+messageSends: ["printOn:", "key", "nextPutAll:", "value"],
 referencedClasses: []
 }),
 smalltalk.Association);
@@ -645,32 +625,6 @@ referencedClasses: []
 }),
 smalltalk.Collection);
 
-smalltalk.addMethod(
-"_printString",
-smalltalk.method({
-selector: "printString",
-category: 'printing',
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st((smalltalk.String || String))._streamContents_((function(aStream){
-return smalltalk.withContext(function($ctx2) {
_st(aStream)._nextPutAll_(_st(smalltalk.Object.fn.prototype._printString.apply(_st(self), [])).__comma(" ("));
-_st(self)._do_separatedBy_((function(each){
-return smalltalk.withContext(function($ctx3) {
return _st(aStream)._nextPutAll_(_st(each)._printString());
-}, function($ctx3) {$ctx3.fillBlock({each:each},$ctx1)})}),(function(){
-return smalltalk.withContext(function($ctx3) {
return _st(aStream)._nextPutAll_(" ");
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-return _st(aStream)._nextPutAll_(")");
-}, function($ctx2) {$ctx2.fillBlock({aStream:aStream},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Collection)})},
-args: [],
-source: "printString\x0a\x09\x22print the contents of the Collection into a string and return it\x22\x0a\x09^String streamContents: [:aStream |\x0a\x09\x09aStream\x0a\x09\x09\x09nextPutAll: super printString, ' ('.\x0a\x09\x09self do: [:each | aStream nextPutAll: each printString]\x0a\x09\x09\x09separatedBy: [aStream nextPutAll: ' '].\x0a\x09\x09aStream nextPutAll: ')']",
-messageSends: ["streamContents:", "nextPutAll:", ",", "printString", "do:separatedBy:"],
-referencedClasses: ["String"]
-}),
-smalltalk.Collection);
-
 smalltalk.addMethod(
 "_readStream",
 smalltalk.method({
@@ -1563,28 +1517,25 @@ referencedClasses: []
 smalltalk.HashedCollection);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st((smalltalk.String || String))._streamContents_((function(aStream){
-return smalltalk.withContext(function($ctx2) {
_st(aStream)._nextPutAll_(_st(_st("a ").__comma(_st(_st(self)._class())._name())).__comma("("));
+return smalltalk.withContext(function($ctx1) { 
smalltalk.IndexableCollection.fn.prototype._printOn_.apply(_st(self), [aStream]);
+_st(aStream)._nextPutAll_(" (");
 _st(_st(self)._associations())._do_separatedBy_((function(each){
-return smalltalk.withContext(function($ctx3) {
return _st(each)._storeOn_(aStream);
-}, function($ctx3) {$ctx3.fillBlock({each:each},$ctx1)})}),(function(){
-return smalltalk.withContext(function($ctx3) {
return _st(aStream)._nextPutAll_(" , ");
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-return _st(aStream)._nextPutAll_(")");
-}, function($ctx2) {$ctx2.fillBlock({aStream:aStream},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.HashedCollection)})},
-args: [],
-source: "printString\x0a\x09\x22print the contents of the HashedCollection into a string and return the string\x22\x0a\x09^String streamContents: [:aStream |\x0a\x09\x09aStream nextPutAll: 'a ', self class name, '('.\x0a\x09\x09self associations\x0a\x09\x09\x09do: [:each | each storeOn: aStream]\x0a\x09\x09\x09separatedBy: [ aStream nextPutAll: ' , '].\x0a\x09\x09aStream nextPutAll: ')']",
-messageSends: ["streamContents:", "nextPutAll:", ",", "name", "class", "do:separatedBy:", "storeOn:", "associations"],
-referencedClasses: ["String"]
+return smalltalk.withContext(function($ctx2) {
return _st(each)._printOn_(aStream);
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}),(function(){
+return smalltalk.withContext(function($ctx2) {
return _st(aStream)._nextPutAll_(" , ");
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+_st(aStream)._nextPutAll_(")");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.HashedCollection)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09super printOn: aStream.\x0a\x09\x0a\x09aStream nextPutAll: ' ('.\x0a\x09self associations\x0a\x09\x09do: [:each | each printOn: aStream ]\x0a\x09\x09separatedBy: [ aStream nextPutAll: ' , ' ].\x0a\x09aStream nextPutAll: ')'",
+messageSends: ["printOn:", "nextPutAll:", "do:separatedBy:", "associations"],
+referencedClasses: []
 }),
 smalltalk.HashedCollection);
 
@@ -1714,28 +1665,6 @@ referencedClasses: []
 }),
 smalltalk.HashedCollection);
 
-smalltalk.addMethod(
-"_storeOn_",
-smalltalk.method({
-selector: "storeOn:",
-category: 'printing',
-fn: function (aStream){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_("#{");
-_st(_st(self)._associations())._do_separatedBy_((function(each){
-return smalltalk.withContext(function($ctx2) {
return _st(each)._storeOn_(aStream);
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}),(function(){
-return smalltalk.withContext(function($ctx2) {
return _st(aStream)._nextPutAll_(". ");
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-_st(aStream)._nextPutAll_("}");
-return self}, function($ctx1) {$ctx1.fill(self,"storeOn:",{aStream:aStream},smalltalk.HashedCollection)})},
-args: ["aStream"],
-source: "storeOn: aStream\x0a\x09aStream nextPutAll: '#{'.\x0a\x09self associations\x0a\x09\x09do: [:each | each storeOn: aStream]\x0a\x09\x09separatedBy: [ aStream nextPutAll: '. '].\x0a\x09aStream nextPutAll: '}'",
-messageSends: ["nextPutAll:", "do:separatedBy:", "storeOn:", "associations"],
-referencedClasses: []
-}),
-smalltalk.HashedCollection);
-
 smalltalk.addMethod(
 "_values",
 smalltalk.method({
@@ -3075,19 +3004,17 @@ referencedClasses: []
 smalltalk.CharacterArray);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(self)._asString())._printString();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.CharacterArray)})},
-args: [],
-source: "printString\x0a\x09^self asString printString",
-messageSends: ["printString", "asString"],
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._asString())._printOn_(aStream);
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.CharacterArray)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09self asString printOn: aStream",
+messageSends: ["printOn:", "asString"],
 referencedClasses: []
 }),
 smalltalk.CharacterArray);
@@ -3552,6 +3479,26 @@ referencedClasses: []
 }),
 smalltalk.String);
 
+smalltalk.addMethod(
+"_isVowel",
+smalltalk.method({
+selector: "isVowel",
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(_st(self)._size()).__eq((1)))._and_((function(){
+return smalltalk.withContext(function($ctx2) {
return _st("aeiou")._includes_(_st(self)._asLowercase());
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"isVowel",{},smalltalk.String)})},
+args: [],
+source: "isVowel\x0a\x09\x22Answer true if the receiver is a one character string containing a voyel\x22\x0a\x09\x0a\x09^ self size = 1 and: [ 'aeiou' includes: self asLowercase ]",
+messageSends: ["and:", "includes:", "asLowercase", "=", "size"],
+referencedClasses: []
+}),
+smalltalk.String);
+
 smalltalk.addMethod(
 "_join_",
 smalltalk.method({
@@ -3765,19 +3712,21 @@ referencedClasses: []
 smalltalk.String);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st("'").__comma(self)).__comma("'");
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.String)})},
-args: [],
-source: "printString\x0a\x09^'''', self, ''''",
-messageSends: [","],
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=aStream;
+_st($1)._nextPutAll_("'");
+_st($1)._nextPutAll_(self);
+$2=_st($1)._nextPutAll_("'");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.String)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09aStream \x0a\x09\x09nextPutAll: '''';\x0a\x09\x09nextPutAll: self;\x0a\x09\x09nextPutAll: ''''",
+messageSends: ["nextPutAll:"],
 referencedClasses: []
 }),
 smalltalk.String);
@@ -4543,7 +4492,7 @@ smalltalk.addMethod(
 "_isSymbol",
 smalltalk.method({
 selector: "isSymbol",
-category: 'printing',
+category: 'testing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return true;
@@ -4556,19 +4505,18 @@ referencedClasses: []
 smalltalk.Symbol);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st("#").__comma(_st(self)._asString());
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Symbol)})},
-args: [],
-source: "printString\x0a\x09^'#', self asString",
-messageSends: [",", "asString"],
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_("#");
+smalltalk.CharacterArray.fn.prototype._printOn_.apply(_st(self), [aStream]);
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Symbol)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09aStream nextPutAll: '#'.\x0a\x09super printOn: aStream",
+messageSends: ["nextPutAll:", "printOn:"],
 referencedClasses: []
 }),
 smalltalk.Symbol);
@@ -4880,6 +4828,29 @@ referencedClasses: []
 }),
 smalltalk.Set);
 
+smalltalk.addMethod(
+"_printOn_",
+smalltalk.method({
+selector: "printOn:",
+category: 'printing',
+fn: function (aStream){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
smalltalk.Collection.fn.prototype._printOn_.apply(_st(self), [aStream]);
+_st(aStream)._nextPutAll_(" (");
+_st(self)._do_separatedBy_((function(each){
+return smalltalk.withContext(function($ctx2) {
return _st(each)._printOn_(aStream);
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}),(function(){
+return smalltalk.withContext(function($ctx2) {
return _st(aStream)._nextPutAll_(" ");
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+_st(aStream)._nextPutAll_(")");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Set)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09super printOn: aStream.\x0a\x09\x0a\x09aStream nextPutAll: ' ('.\x0a\x09self \x0a\x09\x09do: [ :each | each printOn: aStream ]\x0a\x09\x09separatedBy: [ aStream nextPutAll: ' ' ].\x0a\x09aStream nextPutAll: ')'",
+messageSends: ["printOn:", "nextPutAll:", "do:separatedBy:"],
+referencedClasses: []
+}),
+smalltalk.Set);
+
 smalltalk.addMethod(
 "_remove_",
 smalltalk.method({

+ 24 - 25
js/Kernel-Methods.deploy.js

@@ -677,23 +677,19 @@ messageSends: []}),
 smalltalk.Message);
 
 smalltalk.addMethod(
-"_printString",
-smalltalk.method({
-selector: "printString",
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $2,$3,$1;
-$1=_st((smalltalk.String || String))._streamContents_((function(aStream){
-return smalltalk.withContext(function($ctx2) {
$2=aStream;
-_st($2)._nextPutAll_(smalltalk.Object.fn.prototype._printString.apply(_st(self), []));
-_st($2)._nextPutAll_("(");
-_st($2)._nextPutAll_(self["@selector"]);
-$3=_st($2)._nextPutAll_(")");
-return $3;
-}, function($ctx2) {$ctx2.fillBlock({aStream:aStream},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Message)})},
-messageSends: ["streamContents:", "nextPutAll:", "printString"]}),
+"_printOn_",
+smalltalk.method({
+selector: "printOn:",
+fn: function (aStream){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Object.fn.prototype._printOn_.apply(_st(self), [aStream]);
+$1=aStream;
+_st($1)._nextPutAll_("(");
+_st($1)._nextPutAll_(_st(self)._selector());
+$2=_st($1)._nextPutAll_(")");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Message)})},
+messageSends: ["printOn:", "nextPutAll:", "selector"]}),
 smalltalk.Message);
 
 smalltalk.addMethod(
@@ -860,16 +856,19 @@ messageSends: []}),
 smalltalk.MethodContext);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(_st(smalltalk.Object.fn.prototype._printString.apply(_st(self), [])).__comma("(")).__comma(_st(self)._asString())).__comma(")");
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.MethodContext)})},
-messageSends: [",", "asString", "printString"]}),
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Object.fn.prototype._printOn_.apply(_st(self), [aStream]);
+$1=aStream;
+_st($1)._nextPutAll_("(");
+_st($1)._nextPutAll_(_st(self)._asString());
+$2=_st($1)._nextPutAll_(")");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.MethodContext)})},
+messageSends: ["printOn:", "nextPutAll:", "asString"]}),
 smalltalk.MethodContext);
 
 smalltalk.addMethod(

+ 30 - 31
js/Kernel-Methods.js

@@ -931,27 +931,23 @@ referencedClasses: []
 smalltalk.Message);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $2,$3,$1;
-$1=_st((smalltalk.String || String))._streamContents_((function(aStream){
-return smalltalk.withContext(function($ctx2) {
$2=aStream;
-_st($2)._nextPutAll_(smalltalk.Object.fn.prototype._printString.apply(_st(self), []));
-_st($2)._nextPutAll_("(");
-_st($2)._nextPutAll_(self["@selector"]);
-$3=_st($2)._nextPutAll_(")");
-return $3;
-}, function($ctx2) {$ctx2.fillBlock({aStream:aStream},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Message)})},
-args: [],
-source: "printString\x0a\x09^ String streamContents: [:aStream|\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09aStream\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09nextPutAll: super printString;\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09nextPutAll: '(';\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09nextPutAll: selector;\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09nextPutAll: ')' ]",
-messageSends: ["streamContents:", "nextPutAll:", "printString"],
-referencedClasses: ["String"]
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Object.fn.prototype._printOn_.apply(_st(self), [aStream]);
+$1=aStream;
+_st($1)._nextPutAll_("(");
+_st($1)._nextPutAll_(_st(self)._selector());
+$2=_st($1)._nextPutAll_(")");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Message)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09super printOn: aStream.\x0a\x09aStream\x0a\x09\x09nextPutAll: '(';\x0a\x09\x09nextPutAll: self selector;\x0a\x09\x09nextPutAll: ')'",
+messageSends: ["printOn:", "nextPutAll:", "selector"],
+referencedClasses: []
 }),
 smalltalk.Message);
 
@@ -993,7 +989,7 @@ smalltalk.addMethod(
 "_sendTo_",
 smalltalk.method({
 selector: "sendTo:",
-category: 'printing',
+category: 'actions',
 fn: function (anObject){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
@@ -1180,19 +1176,22 @@ referencedClasses: []
 smalltalk.MethodContext);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(_st(smalltalk.Object.fn.prototype._printString.apply(_st(self), [])).__comma("(")).__comma(_st(self)._asString())).__comma(")");
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.MethodContext)})},
-args: [],
-source: "printString\x0a\x09^super printString, '(', self asString, ')'",
-messageSends: [",", "asString", "printString"],
+selector: "printOn:",
+category: 'printing',
+fn: function (aStream){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Object.fn.prototype._printOn_.apply(_st(self), [aStream]);
+$1=aStream;
+_st($1)._nextPutAll_("(");
+_st($1)._nextPutAll_(_st(self)._asString());
+$2=_st($1)._nextPutAll_(")");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.MethodContext)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09super printOn: aStream.\x0a\x09aStream \x0a\x09\x09nextPutAll: '(';\x0a\x09\x09nextPutAll: self asString;\x0a\x09\x09nextPutAll: ')'",
+messageSends: ["printOn:", "nextPutAll:", "asString"],
 referencedClasses: []
 }),
 smalltalk.MethodContext);

+ 98 - 96
js/Kernel-Objects.deploy.js

@@ -540,6 +540,26 @@ return self}, function($ctx1) {$ctx1.fill(self,"printNl",{},smalltalk.Object)})}
 messageSends: []}),
 smalltalk.Object);
 
+smalltalk.addMethod(
+"_printOn_",
+smalltalk.method({
+selector: "printOn:",
+fn: function (aStream){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$3,$2;
+$1=aStream;
+$3=_st(_st(_st(_st(self)._class())._name())._first())._isVowel();
+if(smalltalk.assert($3)){
+$2="an ";
+} else {
+$2="a ";
+};
+_st($1)._nextPutAll_($2);
+_st(aStream)._nextPutAll_(_st(_st(self)._class())._name());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Object)})},
+messageSends: ["nextPutAll:", "ifTrue:ifFalse:", "isVowel", "first", "name", "class"]}),
+smalltalk.Object);
+
 smalltalk.addMethod(
 "_printString",
 smalltalk.method({
@@ -547,10 +567,12 @@ selector: "printString",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st("a ").__comma(_st(_st(self)._class())._name());
+$1=_st((smalltalk.String || String))._streamContents_((function(stream){
+return smalltalk.withContext(function($ctx2) {
return _st(self)._printOn_(stream);
+}, function($ctx2) {$ctx2.fillBlock({stream:stream},$ctx1)})}));
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Object)})},
-messageSends: [",", "name", "class"]}),
+messageSends: ["streamContents:", "printOn:"]}),
 smalltalk.Object);
 
 smalltalk.addMethod(
@@ -607,32 +629,6 @@ return self}, function($ctx1) {$ctx1.fill(self,"size",{},smalltalk.Object)})},
 messageSends: ["error:"]}),
 smalltalk.Object);
 
-smalltalk.addMethod(
-"_storeOn_",
-smalltalk.method({
-selector: "storeOn:",
-fn: function (aStream){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(self)._printString());
-return self}, function($ctx1) {$ctx1.fill(self,"storeOn:",{aStream:aStream},smalltalk.Object)})},
-messageSends: ["nextPutAll:", "printString"]}),
-smalltalk.Object);
-
-smalltalk.addMethod(
-"_storeString",
-smalltalk.method({
-selector: "storeString",
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st((smalltalk.String || String))._streamContents_((function(s){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._storeOn_(s);
-}, function($ctx2) {$ctx2.fillBlock({s:s},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"storeString",{},smalltalk.Object)})},
-messageSends: ["streamContents:", "storeOn:"]}),
-smalltalk.Object);
-
 smalltalk.addMethod(
 "_subclassResponsibility",
 smalltalk.method({
@@ -817,6 +813,17 @@ return $1;
 messageSends: []}),
 smalltalk.Boolean);
 
+smalltalk.addMethod(
+"_asString",
+smalltalk.method({
+selector: "asString",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
 return self.toString() ;
+return self}, function($ctx1) {$ctx1.fill(self,"asString",{},smalltalk.Boolean)})},
+messageSends: []}),
+smalltalk.Boolean);
+
 smalltalk.addMethod(
 "_deepCopy",
 smalltalk.method({
@@ -932,14 +939,14 @@ messageSends: ["ifTrue:ifFalse:", "="]}),
 smalltalk.Boolean);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return self.toString();
-return self}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Boolean)})},
-messageSends: []}),
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(self)._asString());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Boolean)})},
+messageSends: ["nextPutAll:", "asString"]}),
 smalltalk.Boolean);
 
 smalltalk.addMethod(
@@ -1268,16 +1275,14 @@ messageSends: []}),
 smalltalk.Date);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self)._asString();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Date)})},
-messageSends: ["asString"]}),
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(self)._asString());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Date)})},
+messageSends: ["nextPutAll:", "asString"]}),
 smalltalk.Date);
 
 smalltalk.addMethod(
@@ -1630,16 +1635,14 @@ messageSends: []}),
 smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(self)._jsObject())._toString();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.JSObjectProxy)})},
-messageSends: ["toString", "jsObject"]}),
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(_st(self)._jsObject())._toString());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.JSObjectProxy)})},
+messageSends: ["nextPutAll:", "toString", "jsObject"]}),
 smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
@@ -1883,11 +1886,9 @@ smalltalk.method({
 selector: "asString",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self)._printString();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"asString",{},smalltalk.Number)})},
-messageSends: ["printString"]}),
+return smalltalk.withContext(function($ctx1) { 
 return String(self) ;
+return self}, function($ctx1) {$ctx1.fill(self,"asString",{},smalltalk.Number)})},
+messageSends: []}),
 smalltalk.Number);
 
 smalltalk.addMethod(
@@ -2054,24 +2055,24 @@ messageSends: [">="]}),
 smalltalk.Number);
 
 smalltalk.addMethod(
-"_printShowingDecimalPlaces_",
+"_printOn_",
 smalltalk.method({
-selector: "printShowingDecimalPlaces:",
-fn: function (placesDesired){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return self.toFixed(placesDesired);
-return self}, function($ctx1) {$ctx1.fill(self,"printShowingDecimalPlaces:",{placesDesired:placesDesired},smalltalk.Number)})},
-messageSends: []}),
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(self)._asString());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Number)})},
+messageSends: ["nextPutAll:", "asString"]}),
 smalltalk.Number);
 
 smalltalk.addMethod(
-"_printString",
+"_printShowingDecimalPlaces_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printShowingDecimalPlaces:",
+fn: function (placesDesired){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return String(self);
-return self}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Number)})},
+return smalltalk.withContext(function($ctx1) { 
return self.toFixed(placesDesired);
+return self}, function($ctx1) {$ctx1.fill(self,"printShowingDecimalPlaces:",{placesDesired:placesDesired},smalltalk.Number)})},
 messageSends: []}),
 smalltalk.Number);
 
@@ -2539,16 +2540,19 @@ messageSends: ["basicAt:"]}),
 smalltalk.Package);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self)._name();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Package)})},
-messageSends: ["name"]}),
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Object.fn.prototype._printOn_.apply(_st(self), [aStream]);
+$1=aStream;
+_st($1)._nextPutAll_(" (");
+_st($1)._nextPutAll_(_st(self)._name());
+$2=_st($1)._nextPutAll_(")");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Package)})},
+messageSends: ["printOn:", "nextPutAll:", "name"]}),
 smalltalk.Package);
 
 smalltalk.addMethod(
@@ -2915,25 +2919,23 @@ messageSends: []}),
 smalltalk.Point);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $2,$1;
-$1=_st((smalltalk.String || String))._streamContents_((function(stream){
-return smalltalk.withContext(function($ctx2) {
_st(stream)._nextPutAll_(_st(_st(self["@x"])._printString()).__comma("@"));
-$2=_st(_st(self["@y"])._notNil())._and_((function(){
-return smalltalk.withContext(function($ctx3) {
return _st(self["@y"])._negative();
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-if(smalltalk.assert($2)){
-_st(stream)._space();
+return smalltalk.withContext(function($ctx1) { 
var $1;
+_st(self["@x"])._printOn_(aStream);
+_st(aStream)._nextPutAll_("@");
+$1=_st(_st(self["@y"])._notNil())._and_((function(){
+return smalltalk.withContext(function($ctx2) {
return _st(self["@y"])._negative();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+if(smalltalk.assert($1)){
+_st(aStream)._space();
 };
-return _st(stream)._nextPutAll_(_st(self["@y"])._printString());
-}, function($ctx2) {$ctx2.fillBlock({stream:stream},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Point)})},
-messageSends: ["streamContents:", "nextPutAll:", ",", "printString", "ifTrue:", "space", "and:", "negative", "notNil"]}),
+_st(self["@y"])._printOn_(aStream);
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Point)})},
+messageSends: ["printOn:", "nextPutAll:", "ifTrue:", "space", "and:", "negative", "notNil"]}),
 smalltalk.Point);
 
 smalltalk.addMethod(
@@ -3512,14 +3514,14 @@ messageSends: []}),
 smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-fn: function (){
+selector: "printOn:",
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "nil";
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.UndefinedObject)})},
-messageSends: []}),
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_("nil");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.UndefinedObject)})},
+messageSends: ["nextPutAll:"]}),
 smalltalk.UndefinedObject);
 
 smalltalk.addMethod(

+ 129 - 127
js/Kernel-Objects.js

@@ -756,6 +756,31 @@ referencedClasses: []
 }),
 smalltalk.Object);
 
+smalltalk.addMethod(
+"_printOn_",
+smalltalk.method({
+selector: "printOn:",
+category: 'printing',
+fn: function (aStream){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$3,$2;
+$1=aStream;
+$3=_st(_st(_st(_st(self)._class())._name())._first())._isVowel();
+if(smalltalk.assert($3)){
+$2="an ";
+} else {
+$2="a ";
+};
+_st($1)._nextPutAll_($2);
+_st(aStream)._nextPutAll_(_st(_st(self)._class())._name());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Object)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09\x22Append to the aStream, a string representing the receiver.\x22\x0a\x09\x0a\x09aStream nextPutAll: (self class name first isVowel\x0a\x09\x09ifTrue: [ 'an ' ]\x0a\x09\x09ifFalse: [ 'a ' ]).\x0a\x09aStream nextPutAll: self class name",
+messageSends: ["nextPutAll:", "ifTrue:ifFalse:", "isVowel", "first", "name", "class"],
+referencedClasses: []
+}),
+smalltalk.Object);
+
 smalltalk.addMethod(
 "_printString",
 smalltalk.method({
@@ -764,13 +789,15 @@ category: 'printing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st("a ").__comma(_st(_st(self)._class())._name());
+$1=_st((smalltalk.String || String))._streamContents_((function(stream){
+return smalltalk.withContext(function($ctx2) {
return _st(self)._printOn_(stream);
+}, function($ctx2) {$ctx2.fillBlock({stream:stream},$ctx1)})}));
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Object)})},
 args: [],
-source: "printString\x0a\x09^'a ', self class name",
-messageSends: [",", "name", "class"],
-referencedClasses: []
+source: "printString\x0a\x09\x22Answer a String representation of the receiver.\x22\x0a\x0a\x09^ String streamContents: [ :stream | self printOn: stream ]",
+messageSends: ["streamContents:", "printOn:"],
+referencedClasses: ["String"]
 }),
 smalltalk.Object);
 
@@ -848,42 +875,6 @@ referencedClasses: []
 }),
 smalltalk.Object);
 
-smalltalk.addMethod(
-"_storeOn_",
-smalltalk.method({
-selector: "storeOn:",
-category: 'printing',
-fn: function (aStream){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(self)._printString());
-return self}, function($ctx1) {$ctx1.fill(self,"storeOn:",{aStream:aStream},smalltalk.Object)})},
-args: ["aStream"],
-source: "storeOn: aStream\x0a\x09aStream nextPutAll: self printString",
-messageSends: ["nextPutAll:", "printString"],
-referencedClasses: []
-}),
-smalltalk.Object);
-
-smalltalk.addMethod(
-"_storeString",
-smalltalk.method({
-selector: "storeString",
-category: 'printing',
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st((smalltalk.String || String))._streamContents_((function(s){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._storeOn_(s);
-}, function($ctx2) {$ctx2.fillBlock({s:s},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"storeString",{},smalltalk.Object)})},
-args: [],
-source: "storeString\x0a\x09\x22Answer a String representation of the receiver from which the receiver\x0a\x09can be reconstructed.\x22\x0a\x0a\x09^ String streamContents: [:s | self storeOn: s]",
-messageSends: ["streamContents:", "storeOn:"],
-referencedClasses: ["String"]
-}),
-smalltalk.Object);
-
 smalltalk.addMethod(
 "_subclassResponsibility",
 smalltalk.method({
@@ -1139,6 +1130,22 @@ referencedClasses: []
 }),
 smalltalk.Boolean);
 
+smalltalk.addMethod(
+"_asString",
+smalltalk.method({
+selector: "asString",
+category: 'converting',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
 return self.toString() ;
+return self}, function($ctx1) {$ctx1.fill(self,"asString",{},smalltalk.Boolean)})},
+args: [],
+source: "asString\x0a\x09< return self.toString() >",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Boolean);
+
 smalltalk.addMethod(
 "_deepCopy",
 smalltalk.method({
@@ -1294,17 +1301,17 @@ referencedClasses: []
 smalltalk.Boolean);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return self.toString();
-return self}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Boolean)})},
-args: [],
-source: "printString\x0a\x09<return self.toString()>",
-messageSends: [],
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(self)._asString());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Boolean)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09aStream nextPutAll: self asString",
+messageSends: ["nextPutAll:", "asString"],
 referencedClasses: []
 }),
 smalltalk.Boolean);
@@ -1776,19 +1783,17 @@ referencedClasses: []
 smalltalk.Date);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self)._asString();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Date)})},
-args: [],
-source: "printString\x0a\x09^self asString",
-messageSends: ["asString"],
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(self)._asString());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Date)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09aStream nextPutAll: self asString",
+messageSends: ["nextPutAll:", "asString"],
 referencedClasses: []
 }),
 smalltalk.Date);
@@ -2274,19 +2279,17 @@ referencedClasses: []
 smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
-category: 'proxy',
-fn: function (){
+selector: "printOn:",
+category: 'printing',
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(_st(self)._jsObject())._toString();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.JSObjectProxy)})},
-args: [],
-source: "printString\x0a\x09^self jsObject toString",
-messageSends: ["toString", "jsObject"],
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(_st(self)._jsObject())._toString());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.JSObjectProxy)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09aStream nextPutAll: self jsObject toString",
+messageSends: ["nextPutAll:", "toString", "jsObject"],
 referencedClasses: []
 }),
 smalltalk.JSObjectProxy);
@@ -2629,13 +2632,11 @@ selector: "asString",
 category: 'converting',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self)._printString();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"asString",{},smalltalk.Number)})},
+return smalltalk.withContext(function($ctx1) { 
 return String(self) ;
+return self}, function($ctx1) {$ctx1.fill(self,"asString",{},smalltalk.Number)})},
 args: [],
-source: "asString\x0a\x09^self printString",
-messageSends: ["printString"],
+source: "asString\x0a\x09< return String(self) >",
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Number);
@@ -2869,32 +2870,32 @@ referencedClasses: []
 smalltalk.Number);
 
 smalltalk.addMethod(
-"_printShowingDecimalPlaces_",
+"_printOn_",
 smalltalk.method({
-selector: "printShowingDecimalPlaces:",
+selector: "printOn:",
 category: 'printing',
-fn: function (placesDesired){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return self.toFixed(placesDesired);
-return self}, function($ctx1) {$ctx1.fill(self,"printShowingDecimalPlaces:",{placesDesired:placesDesired},smalltalk.Number)})},
-args: ["placesDesired"],
-source: "printShowingDecimalPlaces: placesDesired\x0a\x09<return self.toFixed(placesDesired)>",
-messageSends: [],
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_(_st(self)._asString());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Number)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09aStream nextPutAll: self asString",
+messageSends: ["nextPutAll:", "asString"],
 referencedClasses: []
 }),
 smalltalk.Number);
 
 smalltalk.addMethod(
-"_printString",
+"_printShowingDecimalPlaces_",
 smalltalk.method({
-selector: "printString",
+selector: "printShowingDecimalPlaces:",
 category: 'printing',
-fn: function (){
+fn: function (placesDesired){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return String(self);
-return self}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Number)})},
-args: [],
-source: "printString\x0a\x09<return String(self)>",
+return smalltalk.withContext(function($ctx1) { 
return self.toFixed(placesDesired);
+return self}, function($ctx1) {$ctx1.fill(self,"printShowingDecimalPlaces:",{placesDesired:placesDesired},smalltalk.Number)})},
+args: ["placesDesired"],
+source: "printShowingDecimalPlaces: placesDesired\x0a\x09<return self.toFixed(placesDesired)>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -3510,19 +3511,22 @@ referencedClasses: []
 smalltalk.Package);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self)._name();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Package)})},
-args: [],
-source: "printString\x0a\x09^self name",
-messageSends: ["name"],
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Object.fn.prototype._printOn_.apply(_st(self), [aStream]);
+$1=aStream;
+_st($1)._nextPutAll_(" (");
+_st($1)._nextPutAll_(_st(self)._name());
+$2=_st($1)._nextPutAll_(")");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Package)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09super printOn: aStream.\x0a\x09aStream \x0a\x09\x09nextPutAll: ' (';\x0a\x09\x09nextPutAll: self name;\x0a\x09\x09nextPutAll: ')'",
+messageSends: ["printOn:", "nextPutAll:", "name"],
 referencedClasses: []
 }),
 smalltalk.Package);
@@ -4017,29 +4021,27 @@ referencedClasses: []
 smalltalk.Point);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $2,$1;
-$1=_st((smalltalk.String || String))._streamContents_((function(stream){
-return smalltalk.withContext(function($ctx2) {
_st(stream)._nextPutAll_(_st(_st(self["@x"])._printString()).__comma("@"));
-$2=_st(_st(self["@y"])._notNil())._and_((function(){
-return smalltalk.withContext(function($ctx3) {
return _st(self["@y"])._negative();
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-if(smalltalk.assert($2)){
-_st(stream)._space();
+return smalltalk.withContext(function($ctx1) { 
var $1;
+_st(self["@x"])._printOn_(aStream);
+_st(aStream)._nextPutAll_("@");
+$1=_st(_st(self["@y"])._notNil())._and_((function(){
+return smalltalk.withContext(function($ctx2) {
return _st(self["@y"])._negative();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+if(smalltalk.assert($1)){
+_st(aStream)._space();
 };
-return _st(stream)._nextPutAll_(_st(self["@y"])._printString());
-}, function($ctx2) {$ctx2.fillBlock({stream:stream},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.Point)})},
-args: [],
-source: "printString\x0a\x09\x22Print receiver in classic x@y notation.\x22\x0a\x0a\x09^String streamContents: [:stream |\x0a\x09\x09stream nextPutAll: x printString, '@'.\x0a\x09\x09(y notNil and: [y negative])\x0a\x09\x09\x09ifTrue: [\x0a\x09\x09\x09\x09\x22Avoid ambiguous @- construct\x22\x0a\x09\x09\x09\x09stream space].\x0a\x09\x09stream nextPutAll: y printString]",
-messageSends: ["streamContents:", "nextPutAll:", ",", "printString", "ifTrue:", "space", "and:", "negative", "notNil"],
-referencedClasses: ["String"]
+_st(self["@y"])._printOn_(aStream);
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.Point)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09\x22Print receiver in classic x@y notation.\x22\x0a\x0a\x09x printOn: aStream.\x0a\x09\x0a\x09aStream nextPutAll: '@'.\x0a\x09(y notNil and: [y negative]) ifTrue: [\x0a\x09\x09\x09\x22Avoid ambiguous @- construct\x22\x0a\x09\x09\x09aStream space ].\x0a\x09\x0a\x09y printOn: aStream",
+messageSends: ["printOn:", "nextPutAll:", "ifTrue:", "space", "and:", "negative", "notNil"],
+referencedClasses: []
 }),
 smalltalk.Point);
 
@@ -4833,17 +4835,17 @@ referencedClasses: []
 smalltalk.UndefinedObject);
 
 smalltalk.addMethod(
-"_printString",
+"_printOn_",
 smalltalk.method({
-selector: "printString",
+selector: "printOn:",
 category: 'printing',
-fn: function (){
+fn: function (aStream){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "nil";
-}, function($ctx1) {$ctx1.fill(self,"printString",{},smalltalk.UndefinedObject)})},
-args: [],
-source: "printString\x0a\x09^'nil'",
-messageSends: [],
+return smalltalk.withContext(function($ctx1) { 
_st(aStream)._nextPutAll_("nil");
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.UndefinedObject)})},
+args: ["aStream"],
+source: "printOn: aStream\x0a\x09aStream nextPutAll: 'nil'",
+messageSends: ["nextPutAll:"],
 referencedClasses: []
 }),
 smalltalk.UndefinedObject);

+ 6 - 4
st/Kernel-Classes.st

@@ -345,8 +345,8 @@ asJavascript
 
 !Class methodsFor: 'printing'!
 
-printString
-	^self name
+printOn: aStream
+	aStream nextPutAll: self name
 ! !
 
 !Class methodsFor: 'testing'!
@@ -403,8 +403,10 @@ asJavascript
 
 !Metaclass methodsFor: 'printing'!
 
-printString
-	^self instanceClass name, ' class'
+printOn: aStream
+	aStream
+		nextPutAll: self instanceClass name;
+		nextPutAll: ' class'
 ! !
 
 !Metaclass methodsFor: 'testing'!

+ 43 - 47
st/Kernel-Collections.st

@@ -35,18 +35,10 @@ value: aValue
 
 !Association methodsFor: 'printing'!
 
-printString
-	"print the contents of the Association into a string and return the string"
-	^String streamContents: [:aStream |
-		self storeOn: aStream]
-!
-
-storeOn: aStream
-	"Store in the format: key->value"
-
-	key storeOn: aStream.
-	aStream nextPutAll: '->'.
-	value storeOn: aStream.
+printOn: aStream
+	self key printOn: aStream.
+	aStream nextPutAll: ' -> '.
+	self value printOn: aStream
 ! !
 
 !Association class methodsFor: 'instance creation'!
@@ -231,18 +223,6 @@ errorNotFound
 	self error: 'Object is not in the collection'
 ! !
 
-!Collection methodsFor: 'printing'!
-
-printString
-	"print the contents of the Collection into a string and return it"
-	^String streamContents: [:aStream |
-		aStream
-			nextPutAll: super printString, ' ('.
-		self do: [:each | aStream nextPutAll: each printString]
-			separatedBy: [aStream nextPutAll: ' '].
-		aStream nextPutAll: ')']
-! !
-
 !Collection methodsFor: 'testing'!
 
 ifEmpty: aBlock
@@ -581,22 +561,14 @@ withIndexDo: aBlock
 
 !HashedCollection methodsFor: 'printing'!
 
-printString
-	"print the contents of the HashedCollection into a string and return the string"
-	^String streamContents: [:aStream |
-		aStream nextPutAll: 'a ', self class name, '('.
-		self associations
-			do: [:each | each storeOn: aStream]
-			separatedBy: [ aStream nextPutAll: ' , '].
-		aStream nextPutAll: ')']
-!
-
-storeOn: aStream
-	aStream nextPutAll: '#{'.
+printOn: aStream
+	super printOn: aStream.
+	
+	aStream nextPutAll: ' ('.
 	self associations
-		do: [:each | each storeOn: aStream]
-		separatedBy: [ aStream nextPutAll: '. '].
-	aStream nextPutAll: '}'
+		do: [:each | each printOn: aStream ]
+		separatedBy: [ aStream nextPutAll: ' , ' ].
+	aStream nextPutAll: ')'
 ! !
 
 !HashedCollection methodsFor: 'testing'!
@@ -1061,8 +1033,8 @@ errorReadOnly
 
 !CharacterArray methodsFor: 'printing'!
 
-printString
-	^self asString printString
+printOn: aStream
+	self asString printOn: aStream
 ! !
 
 !CharacterArray class methodsFor: 'instance creation'!
@@ -1222,8 +1194,11 @@ printNl
 	<console.log(self)>
 !
 
-printString
-	^'''', self, ''''
+printOn: aStream
+	aStream 
+		nextPutAll: '''';
+		nextPutAll: self;
+		nextPutAll: ''''
 ! !
 
 !String methodsFor: 'regular expressions'!
@@ -1350,6 +1325,12 @@ includesSubString: subString
 
 isString
 	^true
+!
+
+isVowel
+	"Answer true if the receiver is a one character string containing a voyel"
+	
+	^ self size = 1 and: [ 'aeiou' includes: self asLowercase ]
 ! !
 
 !String class methodsFor: 'accessing'!
@@ -1525,12 +1506,15 @@ value: anObject
 
 !Symbol methodsFor: 'printing'!
 
+printOn: aStream
+	aStream nextPutAll: '#'.
+	super printOn: aStream
+! !
+
+!Symbol methodsFor: 'testing'!
+
 isSymbol
 	^true
-!
-
-printString
-	^'#', self asString
 ! !
 
 !Symbol class methodsFor: 'instance creation'!
@@ -1623,6 +1607,18 @@ initialize
 	elements := #()
 ! !
 
+!Set methodsFor: 'printing'!
+
+printOn: aStream
+	super printOn: aStream.
+	
+	aStream nextPutAll: ' ('.
+	self 
+		do: [ :each | each printOn: aStream ]
+		separatedBy: [ aStream nextPutAll: ' ' ].
+	aStream nextPutAll: ')'
+! !
+
 !Set methodsFor: 'testing'!
 
 includes: anObject

+ 21 - 14
st/Kernel-Methods.st

@@ -352,21 +352,22 @@ selector: aString
 	selector := aString
 ! !
 
-!Message methodsFor: 'printing'!
-
-printString
-	^ String streamContents: [:aStream|
-												aStream
-													nextPutAll: super printString;
-													nextPutAll: '(';
-													nextPutAll: selector;
-													nextPutAll: ')' ]
-!
+!Message methodsFor: 'actions'!
 
 sendTo: anObject
 	^ anObject perform: self selector withArguments: self arguments
 ! !
 
+!Message methodsFor: 'printing'!
+
+printOn: aStream
+	super printOn: aStream.
+	aStream
+		nextPutAll: '(';
+		nextPutAll: self selector;
+		nextPutAll: ')'
+! !
+
 !Message class methodsFor: 'instance creation'!
 
 selector: aString arguments: anArray
@@ -412,10 +413,6 @@ pc
 	<return self.pc>
 !
 
-printString
-	^super printString, '(', self asString, ')'
-!
-
 receiver
 	<return self.receiver>
 !
@@ -444,6 +441,16 @@ asString
 		ifFalse: [ self receiver class printString, ' >> ', self selector ]
 ! !
 
+!MethodContext methodsFor: 'printing'!
+
+printOn: aStream
+	super printOn: aStream.
+	aStream 
+		nextPutAll: '(';
+		nextPutAll: self asString;
+		nextPutAll: ')'
+! !
+
 !MethodContext methodsFor: 'testing'!
 
 isBlockContext

+ 46 - 35
st/Kernel-Objects.st

@@ -246,19 +246,19 @@ printNl
 	<console.log(self)>
 !
 
-printString
-	^'a ', self class name
-!
-
-storeOn: aStream
-	aStream nextPutAll: self printString
+printOn: aStream
+	"Append to the aStream, a string representing the receiver."
+	
+	aStream nextPutAll: (self class name first isVowel
+		ifTrue: [ 'an ' ]
+		ifFalse: [ 'a ' ]).
+	aStream nextPutAll: self class name
 !
 
-storeString
-	"Answer a String representation of the receiver from which the receiver
-	can be reconstructed."
+printString
+	"Answer a String representation of the receiver."
 
-	^ String streamContents: [:s | self storeOn: s]
+	^ String streamContents: [ :stream | self printOn: stream ]
 ! !
 
 !Object methodsFor: 'testing'!
@@ -431,6 +431,10 @@ or: aBlock
 
 asJSON
 	^self
+!
+
+asString
+	< return self.toString() >
 ! !
 
 !Boolean methodsFor: 'copying'!
@@ -445,8 +449,8 @@ shallowCopy
 
 !Boolean methodsFor: 'printing'!
 
-printString
-	<return self.toString()>
+printOn: aStream
+	aStream nextPutAll: self asString
 ! !
 
 !Boolean methodsFor: 'testing'!
@@ -602,8 +606,8 @@ asTimeString
 
 !Date methodsFor: 'printing'!
 
-printString
-	^self asString
+printOn: aStream
+	aStream nextPutAll: self asString
 ! !
 
 !Date class methodsFor: 'instance creation'!
@@ -729,6 +733,12 @@ keysAndValuesDo: aBlock
 	>
 ! !
 
+!JSObjectProxy methodsFor: 'printing'!
+
+printOn: aStream
+	aStream nextPutAll: self jsObject toString
+! !
+
 !JSObjectProxy methodsFor: 'proxy'!
 
 addObjectVariablesTo: aDictionary
@@ -759,10 +769,6 @@ inspectOn: anInspector
 	anInspector setLabel: self printString.
 	self addObjectVariablesTo: variables.
 	anInspector setVariables: variables
-!
-
-printString
-	^self jsObject toString
 ! !
 
 !JSObjectProxy methodsFor: 'testing'!
@@ -918,7 +924,7 @@ asPoint
 !
 
 asString
-	^self printString
+	< return String(self) >
 !
 
 atRandom
@@ -1019,12 +1025,12 @@ to: stop do: aBlock
 
 !Number methodsFor: 'printing'!
 
-printShowingDecimalPlaces: placesDesired
-	<return self.toFixed(placesDesired)>
+printOn: aStream
+	aStream nextPutAll: self asString
 !
 
-printString
-	<return String(self)>
+printShowingDecimalPlaces: placesDesired
+	<return self.toFixed(placesDesired)>
 ! !
 
 !Number methodsFor: 'testing'!
@@ -1198,8 +1204,12 @@ sortedClasses
 
 !Package methodsFor: 'printing'!
 
-printString
-	^self name
+printOn: aStream
+	super printOn: aStream.
+	aStream 
+		nextPutAll: ' (';
+		nextPutAll: self name;
+		nextPutAll: ')'
 ! !
 
 !Package methodsFor: 'private'!
@@ -1392,16 +1402,17 @@ asPoint
 
 !Point methodsFor: 'printing'!
 
-printString
+printOn: aStream
 	"Print receiver in classic x@y notation."
 
-	^String streamContents: [:stream |
-		stream nextPutAll: x printString, '@'.
-		(y notNil and: [y negative])
-			ifTrue: [
-				"Avoid ambiguous @- construct"
-				stream space].
-		stream nextPutAll: y printString]
+	x printOn: aStream.
+	
+	aStream nextPutAll: '@'.
+	(y notNil and: [y negative]) ifTrue: [
+			"Avoid ambiguous @- construct"
+			aStream space ].
+	
+	y printOn: aStream
 ! !
 
 !Point methodsFor: 'transforming'!
@@ -1718,8 +1729,8 @@ shallowCopy
 
 !UndefinedObject methodsFor: 'printing'!
 
-printString
-	^'nil'
+printOn: aStream
+	aStream nextPutAll: 'nil'
 ! !
 
 !UndefinedObject methodsFor: 'testing'!