[please review] CharacterArray>>#%

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[please review] CharacterArray>>#%

Paolo Bonzini
I've just added CharacterArray>>#% to 2.3 and 3.0.

In 3.0 however I also want to change the callers.  Could a brave soul
help reviewing the attached patch?

Paolo

* looking for [hidden email]--2004b/smalltalk--devo--2.2--patch-419 to compare with
* auto-adding [hidden email]--2004b/smalltalk--devo--2.2--patch-419 to greedy revision library /Users/bonzinip/Archives/revlib
* found immediate ancestor revision in library ([hidden email]--2004b/smalltalk--devo--2.2--patch-418)
* patching for this revision ([hidden email]--2004b/smalltalk--devo--2.2--patch-419)
* comparing to [hidden email]--2004b/smalltalk--devo--2.2--patch-419
M  scripts/Package.st
M  compiler/STFileParser.st
M  scripts/Getopt.st
M  blox/gtk/BloxBasic.st
M  blox/gtk/BloxText.st
M  examples/Publish.st
M  kernel/Regex.st
M  blox/tk/BloxBasic.st
M  blox/tk/BloxText.st
M  blox/tk/BloxWidgets.st
M  browser/ClassBrow.st
M  browser/ClassHierBrow.st
M  browser/Inspector.st
M  browser/test.st
M  compiler/STDecompiler.st
M  compiler/STSymTable.st
M  i18n/Locale.st
M  java/JavaTranslation.st
M  kernel/AnsiExcept.st
M  kernel/Behavior.st
M  kernel/CStruct.st
M  kernel/CharArray.st
M  kernel/Collection.st
M  kernel/CompildCode.st
M  kernel/Directory.st
M  kernel/Float.st
M  kernel/Object.st
M  kernel/Semaphore.st
M  kernel/SeqCollect.st
M  kernel/VFS.st
M  net/SMTP.st
M  net/httpd/FileServer.st
M  net/httpd/WebServer.st
M  net/httpd/WikiServer.st
M  tests/AnsiRun.st
M  tests/ackermann.st
M  tests/ary3.st
M  tests/except.st
M  tests/hash2.st
M  tests/lists1.st
M  tests/matrix.st
M  tests/prodcons.st
M  tests/sieve.st
M  xml/XML.st
M  xml/XPath.st
M  xml/XSL.st

* modified files

--- orig/blox/gtk/BloxBasic.st
+++ mod/blox/gtk/BloxBasic.st
@@ -575,10 +575,10 @@ getKeyPressEventNames: key
     ^(keySym size = 1 and: [ keySym first isLetter ])
  ifTrue: [
     "Use both the lowercase and uppercase variants"
-    { '<%1KeyPress-%2>' bindWith: mod with: keySym asLowercase.
-      '<%1KeyPress-%2>' bindWith: mod with: keySym asUppercase } ]
+    { '<%1KeyPress-%2>' % { mod. keySym asLowercase } .
+      '<%1KeyPress-%2>' % { mod. keySym asUppercase } } ]
  ifFalse: [
-    { '<%1KeyPress-%2>' bindWith: mod with: keySym } ]!
+    { '<%1KeyPress-%2>' % { mod. keySym } } ]!
 
 translateModifier: mod platform: platform
     | name |


--- orig/blox/gtk/BloxText.st
+++ mod/blox/gtk/BloxText.st
@@ -851,7 +851,7 @@ tag: name bind: event to: aSymbol of: an
  to: aSymbol
  of: anObject
  parameters: params
- prefix: ('%1 tag bind %2' bindWith: self connected with: name)
+ prefix: ('%1 tag bind %2' % { self connected. name })
 ! !
 
 


--- orig/blox/tk/BloxBasic.st
+++ mod/blox/tk/BloxBasic.st
@@ -449,10 +449,10 @@ getKeyPressEventNames: key
     ^(keySym size = 1 and: [ keySym first isLetter ])
  ifTrue: [
     "Use both the lowercase and uppercase variants"
-    { '<%1KeyPress-%2>' bindWith: mod with: keySym asLowercase.
-      '<%1KeyPress-%2>' bindWith: mod with: keySym asUppercase } ]
+    { '<%1KeyPress-%2>' % { mod. keySym asLowercase }.
+      '<%1KeyPress-%2>' % { mod. keySym asUppercase } } ]
  ifFalse: [
-    { '<%1KeyPress-%2>' bindWith: mod with: keySym } ]!
+    { '<%1KeyPress-%2>' % { mod. keySym } } ]!
 
 translateModifier: mod platform: platform
     | name |
@@ -2694,6 +2694,6 @@ asTkImageString
 
     "R0lG is `GIF' in Base-64 encoding."
     ^(self match: 'R0lG*')
-        ifTrue: [ '{%1}' bindWith: self ]
+        ifTrue: [ '{%1}' % {self} ]
         ifFalse: [ self asTkString ]
 ! !


--- orig/blox/tk/BloxText.st
+++ mod/blox/tk/BloxText.st
@@ -807,10 +807,8 @@ destroyed
 
 from: aPoint to: endPoint
     ^'%1.%2 %3.%4'
- bindWith: aPoint y printString
- with: (aPoint x - 1) printString
- with: endPoint y printString
- with: (endPoint x - 1) printString
+ % { aPoint y printString.  (aPoint x - 1) printString.
+    endPoint y printString.  (endPoint x - 1) printString }
 !
 
 parseResult
@@ -835,7 +833,7 @@ tag: name bind: event to: aSymbol of: an
  to: aSymbol
  of: anObject
  parameters: params
- prefix: ('%1 tag bind %2' bindWith: self connected with: name)
+ prefix: ('%1 tag bind %2' % { self connected. name })
 !
 
 widgetType


--- orig/blox/tk/BloxWidgets.st
+++ mod/blox/tk/BloxWidgets.st
@@ -879,8 +879,8 @@ label: value
 !BButton methodsFor: 'private'!
 
 create
-    self create: ('-highlightthickness 0 -takefocus 1 -command {callback %1 invokeCallback} -font {', self class defaultFont, '}'
- bindWith: self asOop printString)
+    self create: ('-highlightthickness 0 -takefocus 1 -command {callback %1 invokeCallback} -font {%2}'
+ % { self asOop. self class defaultFont })
 !
 
 setInitialSize
@@ -3687,8 +3687,7 @@ initialize: parentWidget
     label := ''.
     exists := false.
     primitive := '%1.w%2'
- bindWith: self parent container
- with: (self asOop printString: 36).
+ % { self parent container. self asOop printString: 36 }).
 !
 
 newMenuItemFor: pair notifying: receiver


--- orig/browser/ClassBrow.st
+++ mod/browser/ClassBrow.st
@@ -41,7 +41,7 @@ nil!
 !ClassBrowser methodsFor: 'initializing'!
 
 createTopView
-    ^BrowserShell new: ('Class Browser on %1' bindWith: startingClass)!
+    ^BrowserShell new: ('Class Browser on %1' % { startingClass })!
 
 openOn: aClass
     "Create and open a class hierarchy browser on startingClass"


--- orig/browser/ClassHierBrow.st
+++ mod/browser/ClassHierBrow.st
@@ -419,8 +419,7 @@ printHierarchyOf: dict hierarchy: desc s
     [:each |
     | template |
     template := (dict at: each) ifTrue: ['%1%2'] ifFalse: ['%1(%2)'].
-    string := template bindWith: indent
- with: (each nameIn: self currentNamespace).
+    string := template % { indent. each nameIn: self currentNamespace }.
     shownClasses at: string put: each.
     stream nextPut: string.
     self


--- orig/browser/Inspector.st
+++ mod/browser/Inspector.st
@@ -131,10 +131,10 @@ initFieldListsMenu
 open
     | pane |
     topView := BrowserShell new: ('Inspecting %1%2'
- bindWith: (fieldList value isClass
+ % { fieldList value isClass
  ifFalse: [ fieldList value class article, ' ' ]
- ifTrue: [ '' ])
- with: (fieldList value class nameIn: Namespace current)).
+ ifTrue: [ '' ].
+    fieldList value class nameIn: Namespace current }.
     topView data: self.
     topView blox
  x: 20
@@ -322,7 +322,7 @@ currentFieldValue
 currentFieldString
     ^[ self currentFieldValue printString ] on: Error do: [ :ex |
  ex return: ('[%1 exception raised while printing item]'
- bindWith: ex class) ]!
+ % { ex class }) ]!
 
 fieldsSortBlock
     "nil = use OrderedCollection, else a block to be used as fields'


--- orig/browser/test.st
+++ mod/browser/test.st
@@ -149,7 +149,7 @@ points: p coords: coords
 dropdownTest
     ^[ :win || cb name size label |
         cb := [
-            [ label font: ('{%1} %2' bindWith: name text with: size text) ]
+            [ label font: ('{%1} %2' % { name text. size text }) ]
                 on: ExAll
                 do: [ :sig | sig return ]
         ].


--- orig/compiler/STDecompiler.st
+++ mod/compiler/STDecompiler.st
@@ -880,8 +880,8 @@ source
      primitive names in the decompiled code."
 
     ^context method primitive > 0
- ifTrue: [ '<primitive: %1>' bindWith:
-    (VMPrimitives keyAtValue: context method primitive) asString ]
+ ifTrue: [ '<primitive: %1>'
+      % { VMPrimitives keyAtValue: context method primitive } ]
  ifFalse: [ '' ]!
 
 tags: source


--- orig/compiler/STFileParser.st
+++ mod/compiler/STFileParser.st
@@ -280,7 +280,7 @@ next
 
 name
     "Answer a string that represents what the receiver is streaming on"
-    ^'(%1 %2)' bindWith: self species article with: self species name
+    ^'(%1 %2)' % { self species article. self species name }
 !
 
 segmentFrom: startPos to: endPos


--- orig/compiler/STSymTable.st
+++ mod/compiler/STSymTable.st
@@ -209,7 +209,7 @@ declareTemporary: tempName canStore: can
  ifTrue: [(variables at: symbol) scope < scopes size
      ifTrue: [stCompiler compileWarning:
   ('variable ''%1'' shadows another'
- bindWith: tempName)]
+ % { tempName })]
      ifFalse: [^stCompiler compileError:
    'duplicate variable name ', tempName]].
     variables at: symbol put: (STVariable


--- orig/examples/Publish.st
+++ mod/examples/Publish.st
@@ -884,7 +884,7 @@ Alphabetic list of classes:'.
  ('writing documentation into ', fileName, '.htm') displayNl.
  self publish: each onFile: fileName, '.htm'.
  aFileStream
-    nextPutAll: ('<A HREF="%1.htm">%1</A>' bindWith: fileName);
+    nextPutAll: ('<A HREF="%1.htm">%1</A>' % { fileName });
     nl.
     ].
 
@@ -989,10 +989,7 @@ Filed out from %1 on %2 %3 -->
     <TITLE>%4</TITLE>
 </HEAD>
 <BODY>
-' bindWith: Smalltalk version
-  with: (now at: 1) printString
-  with: (now at: 2) printString
-  with: self className).
+' % { Smalltalk version. now at: 1. now at: 2. self className }).
 
     self
  nextPutAll: '<DL><DT><B>Category: ';
@@ -1364,7 +1361,7 @@ emitHeader: now
 @section %1
 @clindex %1
 
-' bindWith: self className).
+' % { self className }).
 
     self
  nextPutAll: '@table @b'; nl;


--- orig/i18n/Locale.st
+++ mod/i18n/Locale.st
@@ -384,9 +384,7 @@ id
 languageDirectory: rootDirectory
     "Answer the directory where data files for the current language reside,
      given the root directory of the locale data."
-    ^'%1/%2'
- bindWith: rootDirectory
- with: self language!
+    ^'%1/%2' % { rootDirectory. self language }!
 
 languageDirectory
     "Answer the directory where data files for the current language reside."
@@ -396,10 +394,7 @@ territoryDirectory: rootDirectory
     "Answer the directory where data files for the current language,
      specific to the territory, reside, given the root directory of the
      locale data."
-    ^'%1/%2_%3'
- bindWith: rootDirectory
- with: self language
- with: self territory!
+    ^'%1/%2_%3' % { rootDirectory. self language. self territory }!
 
 territoryDirectory
     "Answer the directory where data files for the current language,


--- orig/java/JavaTranslation.st
+++ mod/java/JavaTranslation.st
@@ -3756,7 +3756,7 @@ makeDirtyBlock
 !
 
 popIntoArray: anIndex
-    stream tab; nextPutAll: ('pop and store into array element[%1]' bindWith: anIndex); nl
+    stream tab; nextPutAll: ('pop and store into array element[%1]' % { anIndex }); nl
 !
 
 popJumpIfFalseTo: destination
@@ -3796,7 +3796,7 @@ pushGlobal: anObject
 !
 
 pushInstVar: anIndex
-    stream tab; nextPutAll: ('push Instance Variable[%1]' bindWith: anIndex); nl
+    stream tab; nextPutAll: ('push Instance Variable[%1]' % { anIndex }); nl
 !
 
 pushLiteral: anObject
@@ -3805,7 +3805,7 @@ pushLiteral: anObject
     (printString isNil or: [ printString size > 40 ]) ifTrue: [
         printString := anObject isClass
     ifTrue: [ anObject name displayString ]
-    ifFalse: [ '%1 %2' bindWith: anObject class article with: anObject class name displayString ]].
+    ifFalse: [ '%1 %2' % { anObject class article. anObject class name } ]].
 
     stream tab; nextPutAll: 'push '; nextPutAll: printString; nl
 !
@@ -3815,11 +3815,11 @@ pushSelf
 !
 
 pushTemporary: anIndex
-    stream tab; nextPutAll: ('push Temporary[%1]' bindWith: anIndex); nl
+    stream tab; nextPutAll: ('push Temporary[%1]' % { anIndex }); nl
 !
 
 pushTemporary: anIndex outer: scopes
-    stream tab; nextPutAll: ('push Temporary[%1] from outer context #%2' bindWith: anIndex with: scopes); nl
+    stream tab; nextPutAll: ('push Temporary[%1] from outer context #%2' % { anIndex. scopes }); nl
 !
 
 returnFromContext
@@ -3831,7 +3831,7 @@ returnFromMethod
 !
 
 send: aSymbol numArgs: anInteger
-    stream tab; nextPutAll: ('send %2 args message %1' bindWith: aSymbol storeString with: anInteger); nl
+    stream tab; nextPutAll: ('send %2 args message %1' % { aSymbol storeString. anInteger }); nl
 !
 
 storeGlobal: anObject
@@ -3839,19 +3839,19 @@ storeGlobal: anObject
 !
 
 storeInstVar: anIndex
-    stream tab; nextPutAll: ('store into Instance Variable[%1]' bindWith: anIndex); nl
+    stream tab; nextPutAll: ('store into Instance Variable[%1]' % { anIndex }); nl
 !
 
 storeTemporary: anIndex
-    stream tab; nextPutAll: ('store into Temporary[%1]' bindWith: anIndex); nl
+    stream tab; nextPutAll: ('store into Temporary[%1]' % { anIndex }); nl
 !
 
 storeTemporary: anIndex outer: scopes
-    stream tab; nextPutAll: ('store into Temporary[%1] from outer context #%2' bindWith: anIndex with: scopes); nl
+    stream tab; nextPutAll: ('store into Temporary[%1] from outer context #%2' % { anIndex. scopes }); nl
 !
 
 superSend: aSymbol numArgs: anInteger
-    stream tab; nextPutAll: ('send %2 args message %1 to super' bindWith: aSymbol with: anInteger); nl
+    stream tab; nextPutAll: ('send %2 args message %1 to super' % { aSymbol. anInteger }); nl
 ! !
 
 !TargetInstructionPrinter methodsFor: 'decoding bytecodes'!


--- orig/kernel/AnsiExcept.st
+++ mod/kernel/AnsiExcept.st
@@ -877,8 +877,7 @@ description
 
 messageText
     "Answer an exception's message text."
-    ^'%1: %2 element(s) missing' bindWith: self basicMessageText
- with: self remainingCount!
+    ^'%1: %2 element(s) missing' % { self basicMessageText. self remainingCount }!
 
 remainingCount
     "Answer the number of items that were to be read."
@@ -913,7 +912,7 @@ description
 
 messageText
     "Answer an exception's message text."
-    ^'Invalid value %1: %2' bindWith: self value with: self basicMessageText!
+    ^'Invalid value %1: %2' % { self value. self basicMessageText }!
 
 value
     "Answer the object that was found to be invalid."
@@ -927,9 +926,7 @@ value: anObject
 
 messageText
     "Answer an exception's message text."
-    ^'Invalid argument %1: %2'
- bindWith: self value
- with: self basicMessageText! !
+    ^'Invalid argument %1: %2' % { self value. self basicMessageText }! !
 
 !SystemExceptions.AlreadyDefined methodsFor: 'accessing'!
 
@@ -994,8 +991,7 @@ description
 
 messageText
     "Answer an exception's message text."
-    ^'Invalid index %1: %2'
- bindWith: self value with: self basicMessageText!
+    ^'Invalid index %1: %2' % { self value. self basicMessageText }!
 
 collection
     "Answer the collection that triggered the error"
@@ -1062,7 +1058,7 @@ messageText
     self validClasses isNil
  ifTrue: [ ^'Invalid argument ', self value printString ].
     ^'Invalid argument %1: must be %2'
- bindWith: self value with: self validClassesString!
+ % { self value. self validClassesString }!
 
 validClasses
     "Answer the list of classes whose instances would have been valid."
@@ -1255,9 +1251,8 @@ signalOn: selector useInstead: aSymbol
 
 messageText
     "Answer an exception's message text."
-    ^'%1, use %2 instead'
- bindWith: self basicMessageText
- with: self suggestedSelector storeString!
+    ^'%1, use %2 instead' %
+ { self basicMessageText. self suggestedSelector storeString }!
 
 selector
     "Answer which selector was sent."


--- orig/kernel/Behavior.st
+++ mod/kernel/Behavior.st
@@ -101,7 +101,7 @@ createGetMethod: what default: value
     ^self compile: ('%1
     "Answer the receiver''s %1. Its default value is %2"
     %1 isNil ifTrue: [ %1 := %2 ].
-    ^%1' bindWith: what with: value)
+    ^%1' % { what. value })
 !
 
 createGetMethod: what
@@ -109,7 +109,7 @@ createGetMethod: what
 
     ^self compile: ('%1
     "Answer the receiver''s %1"
-    ^%1' bindWith: what)
+    ^%1' % { what })
 !
 
 createSetMethod: what
@@ -120,7 +120,7 @@ createSetMethod: what
     
     ^self compile: ('%1: %2
     "Set the receiver''s %1 to %2"
-    %1 := %2' bindWith: what with: parameter)
+    %1 := %2' % { what. parameter })
 !
 
 defineAsyncCFunc: cFuncNameString
@@ -134,9 +134,7 @@ defineAsyncCFunc: cFuncNameString
     code := (
 '%1
     <asyncCCall: ''%2'' args: #%3>')
- bindWith: selectorAndArgs
- with: cFuncNameString
- with: argsArray printString.
+ % { selectorAndArgs. cFuncNameString. argsArray printString }.
 
     ^self compile: code ifError: [ :file :line :error | code error: error ].
 !
@@ -153,10 +151,8 @@ defineCFunc: cFuncNameString
     code := (
 '%1
     <cCall: ''%2'' returning: %3 args: #%4>')
- bindWith: selectorAndArgs
- with: cFuncNameString
- with: returnTypeSymbol storeString
- with: argsArray printString.
+ % { selectorAndArgs. cFuncNameString. returnTypeSymbol storeString.
+    argsArray printString }.
 
     ^self compile: code ifError: [ :file :line :error | code error: error ].
 !
@@ -1123,7 +1119,7 @@ name
     "Answer the class name; this prints to the name of the superclass
      enclosed in braces.  This class name is used, for example, to print
      the receiver."
-    ^'{%1}' bindWith: self asClass printString
+    ^'{%1}' % { self asClass }
 ! !
 
 


--- orig/kernel/CStruct.st
+++ mod/kernel/CStruct.st
@@ -210,8 +210,7 @@ computeTypeString: type block: aBlock
 
     type isSymbol ifFalse: [
  typeString := '#{%1} value type'
-    bindWith: ((type value nameIn: Namespace current)
-    copyReplaceAll: $  with: $.).
+    % { type value nameIn: Namespace current }.
 
  ^aBlock value: type value value: typeString.
     ].


--- orig/kernel/CharArray.st
+++ mod/kernel/CharArray.st
@@ -305,14 +305,14 @@ subStrings: aCharacter
 
 bindWith: s1
     "Answer the receiver with every %1 replaced by the displayString of s1"
-    ^self bindWithArguments: { s1 }
+    ^self % { s1 }
 !
 
 bindWith: s1 with: s2
     "Answer the receiver with every %1 or %2 replaced by s1 or s2,
      respectively.  s1 and s2 are `displayed' (i.e. their
      displayString is used) upon replacement."
-    ^self bindWithArguments: { s1. s2 }
+    ^self % { s1. s2 }
 !
 
 bindWith: s1 with: s2 with: s3
@@ -320,7 +320,7 @@ bindWith: s1 with: s2 with: s3
      respectively.  s1, s2 and s3 are `displayed' (i.e. their
      displayString is used) upon replacement."
 
-    ^self bindWithArguments: { s1. s2. s3 }
+    ^self % { s1. s2. s3 }
 !
 
 bindWith: s1 with: s2 with: s3 with: s4
@@ -328,7 +328,7 @@ bindWith: s1 with: s2 with: s3 with: s4
      or s4, respectively.  s1, s2, s3 and s4 are `displayed' (i.e. their
      displayString is used) upon replacement."
 
-    ^self bindWithArguments: { s1. s2. s3. s4 }
+    ^self % { s1. s2. s3. s4 }
 !
 
 bindWithArguments: anArray
@@ -338,6 +338,16 @@ bindWithArguments: anArray
      %<trueString|falseString>n is replaced with one of the two
      strings depending on the n-th element of anArray being true or false."
 
+    ^self % anArray
+!
+
+% anArray
+    "Answer the receiver with every %n (1<=n<=9) replaced by the n-th element
+     of anArray.  The replaced elements are `displayed' (i.e. their
+     displayString is used).  In addition, the special pattern
+     %<trueString|falseString>n is replaced with one of the two
+     strings depending on the n-th element of anArray being true or false."
+
     | result wasPercent pattern char ifTrue ifFalse |
     result := WriteStream on: (self copyEmpty: self size + 20).
     wasPercent := false.


--- orig/kernel/Collection.st
+++ mod/kernel/Collection.st
@@ -519,8 +519,8 @@ inspect
      output := [ object printString ]
       on: Error
       do: [ :ex | ex return: ('%1 %2'
-      bindWith: object class article
-      with: object class name asString) ].
+      % { object class article.
+       object class name asString }) ].
 
  Transcript nextPutAll: '  ';
     nextPutAll: (instVars at: i);
@@ -534,8 +534,8 @@ inspect
      output := [ obj printString ]
       on: Error
       do: [ :ex | ex return: ('%1 %2'
-      bindWith: obj class article
-      with: obj class name asString) ].
+      % { obj class article.
+       obj class name asString }) ].
  Transcript
     nextPutAll: '    ';
     nextPutAll: output;


--- orig/kernel/CompildCode.st
+++ mod/kernel/CompildCode.st
@@ -394,8 +394,8 @@ inspect
      output := [ object printString ]
       on: Error
       do: [ :ex | ex return: ('%1 %2'
-      bindWith: object class article
-      with: object class name asString) ].
+      % { object class article.
+       object class name asString }) ].
      Transcript
         nextPutAll: '  ';
         nextPutAll: (instVars at: i);
@@ -727,31 +727,31 @@ invalidOpcode: aStream
     aStream tab; nextPutAll: 'invalid opcode'; nl!
 
 pushInstVar: anIndex with: aStream
-    aStream tab; nextPutAll: ('push Instance Variable[%1]' bindWith: anIndex); nl!
+    aStream tab; nextPutAll: ('push Instance Variable[%1]' % { anIndex }); nl!
 
 storeInstVar: anIndex with: aStream
-    aStream tab; nextPutAll: ('store into Instance Variable[%1]' bindWith: anIndex); nl!
+    aStream tab; nextPutAll: ('store into Instance Variable[%1]' % { anIndex }); nl!
 
 popIntoArray: anIndex with: aStream
-    aStream tab; nextPutAll: ('pop and store into array element[%1]' bindWith: anIndex); nl!
+    aStream tab; nextPutAll: ('pop and store into array element[%1]' % { anIndex }); nl!
 
 pushTemporary: anIndex outer: scopes with: aStream
-    aStream tab; nextPutAll: ('push Temporary[%1] from outer context #%2' bindWith: anIndex with: scopes); nl!
+    aStream tab; nextPutAll: ('push Temporary[%1] from outer context #%2' % { anIndex. scopes }); nl!
 
 storeTemporary: anIndex outer: scopes with: aStream
-    aStream tab; nextPutAll: ('store into Temporary[%1] from outer context #%2' bindWith: anIndex with: scopes); nl!
+    aStream tab; nextPutAll: ('store into Temporary[%1] from outer context #%2' % { anIndex. scopes }); nl!
 
 pushTemporary: anIndex with: aStream
-    aStream tab; nextPutAll: ('push Temporary[%1]' bindWith: anIndex); nl!
+    aStream tab; nextPutAll: ('push Temporary[%1]' % { anIndex }); nl!
 
 storeTemporary: anIndex with: aStream
-    aStream tab; nextPutAll: ('store into Temporary[%1]' bindWith: anIndex); nl!
+    aStream tab; nextPutAll: ('store into Temporary[%1]' % { anIndex }); nl!
 
 pushLiteral: anObject with: aStream
     | printString |
     printString := anObject printString.
     (anObject isClass not and: [ printString size > 30 ])
- ifTrue: [ printString := '%1 %2' bindWith: anObject class article with: anObject class name asString ].
+ ifTrue: [ printString := '%1 %2' % { anObject class article. anObject class name asString } ].
 
     aStream tab; nextPutAll: 'push '; nextPutAll: printString; nl!
 
@@ -795,10 +795,10 @@ jumpTo: destination with: aStream
     aStream tab; nextPutAll: 'jump to '; print: destination; nl!
 
 superSend: aSymbol numArgs: anInteger with: aStream
-    aStream tab; nextPutAll: ('send %2 args message %1 to super' bindWith: aSymbol with: anInteger); nl!
+    aStream tab; nextPutAll: ('send %2 args message %1 to super' % { aSymbol. anInteger }); nl!
 
 send: aSymbol numArgs: anInteger with: aStream
-    aStream tab; nextPutAll: ('send %2 args message %1' bindWith: aSymbol with: anInteger); nl!
+    aStream tab; nextPutAll: ('send %2 args message %1' % { aSymbol. anInteger }); nl!
 
 bytecodeIndex: byte with: aStream
     "Private - Print the bytecode index for byte"


--- orig/kernel/Directory.st
+++ mod/kernel/Directory.st
@@ -120,17 +120,14 @@ append: fileName to: directory
  ifTrue: [
     (fileName at: 1) isPathSeparator ifTrue: [
  ^(directory size >= 2 and: [ (directory at: 2) = $: ])
-    ifTrue: [ '%1:%2' bindWith: directory first with: fileName ]
+    ifTrue: [ '%1:%2' % { directory first. fileName } ]
     ifFalse: [ fileName ] ].
             (fileName size >= 2 and: [ (fileName at: 2) = $: ])
  ifTrue: [ ^fileName ] ].
 
     ^(directory at: directory size) isPathSeparator
  ifTrue: [ directory, fileName ]
- ifFalse: [ '%1%2%3'
-    bindWith: directory
-    with: self pathSeparator
-    with: fileName ]
+ ifFalse: [ directory, self pathSeparatorString, fileName ]
 !
 
 pathSeparator


--- orig/kernel/Float.st
+++ mod/kernel/Float.st
@@ -420,14 +420,11 @@ printOn: aStream special: whatToPrintArr
 
     "First, take care of the easy cases."
     self isNaN ifTrue: [
- ^aStream nextPutAll:
-    ((whatToPrintArray at: 3) bindWith: self class) ].
+ ^aStream nextPutAll: ((whatToPrintArray at: 3) % { self class }) ].
     self = self class infinity ifTrue: [
- ^aStream nextPutAll:
-    ((whatToPrintArray at: 1) bindWith: self class) ].
+ ^aStream nextPutAll: ((whatToPrintArray at: 1) % { self class }) ].
     self = self class negativeInfinity ifTrue: [
- ^aStream nextPutAll:
-    ((whatToPrintArray at: 2) bindWith: self class) ].
+ ^aStream nextPutAll: ((whatToPrintArray at: 2) % { self class }) ].
 
     "We deal only with positive values."
     me := self abs.


--- orig/kernel/Object.st
+++ mod/kernel/Object.st
@@ -598,8 +598,8 @@ inspect
      output := [ object printString ]
       on: Error
       do: [ :ex | ex return: ('%1 %2'
-      bindWith: object class article
-      with: object class name asString) ].
+      % { object class article.
+          object class name asString }) ].
 
         i <= instVars size
     ifTrue: [


--- orig/kernel/Regex.st
+++ mod/kernel/Regex.st
@@ -558,7 +558,7 @@ copyFrom: from to: to replacingRegex: pa
     "Returns the substring of the receiver between from and to.  
      If pattern has a match in that part of the string, the match
      is replaced with str after substituting %n sequences with the
-     captured subexpressions of the match (as in #bindWithArguments:)."
+     captured subexpressions of the match (as in #%)."
     | regs beg end repl res |
     regs := self searchRegex: pattern from: from to: to.
 
@@ -566,7 +566,7 @@ copyFrom: from to: to replacingRegex: pa
  ifTrue: [
     beg := regs from.
     end := regs to.
-    repl := str bindWithArguments: regs.
+    repl := str % regs.
     res := self species new: (to - from) - (end - beg) + repl size.
     res replaceFrom: 1 to: beg - from with: self startingAt: from.
     res replaceFrom: beg - from + 1 to: beg - from + repl size with: repl.
@@ -579,7 +579,7 @@ copyFrom: from to: to replacingRegex: pa
 copyReplacingRegex: pattern with: str
     "Returns the receiver after replacing the first match of pattern (if
      any) with str.  %n sequences present in str are substituted with the
-     captured subexpressions of the match (as in #bindWithArguments:)."
+     captured subexpressions of the match (as in #%)."
 
     ^self copyFrom: 1 to: self size replacingRegex: pattern with: str
 !
@@ -588,7 +588,7 @@ copyFrom: from to: to replacingAllRegex:
     "Returns the substring of the receiver between from and to.  
      Any match of pattern in that part of the string is replaced with
      str after substituting %n sequences with the captured subexpressions
-     of the match (as in #bindWithArguments:)."
+     of the match (as in #%)."
 
     | res idx regex beg end regs |
     regex := pattern asRegex.
@@ -601,7 +601,7 @@ copyFrom: from to: to replacingAllRegex:
  beg := regs from.
  end := regs to.
  res next: beg - idx putAll: self startingAt: idx.
- res nextPutAll: (str bindWithArguments: regs).
+ res nextPutAll: (str % regs).
  idx := end + 1.
  beg > end ifTrue: [ res nextPut: (self at: idx). idx := idx + 1 ].
  idx > self size ifTrue: [ ^res contents ].
@@ -614,7 +614,7 @@ copyFrom: from to: to replacingAllRegex:
 copyReplacingAllRegex: pattern with: str
     "Returns the receiver after replacing all the matches of pattern (if
      any) with str.  %n sequences present in str are substituted with the
-     captured subexpressions of the match (as in #bindWithArguments:)."
+     captured subexpressions of the match (as in #%)."
 
     ^self copyFrom: 1 to: self size replacingAllRegex: pattern with: str
 !


--- orig/kernel/Semaphore.st
+++ mod/kernel/Semaphore.st
@@ -103,9 +103,7 @@ printOn: aStream
     aStream
         nextPutAll: self class name;
         nextPutAll: ('(%1: %<free|held>2, %3 %<available signals|waiting processes>2)'
-    bindWith: self name printString
-    with: self signals > 0
-    with: self signals abs)! !
+    % { self name printString. self signals > 0. self signals abs })! !
 
 
 !Semaphore methodsFor: 'private'!


--- orig/kernel/SeqCollect.st
+++ mod/kernel/SeqCollect.st
@@ -77,8 +77,8 @@ inspect
      output := [ object printString ]
       on: Error
       do: [ :ex | ex return: ('%1 %2'
-      bindWith: object class article
-      with: object class name asString) ].
+      % { object class article.
+          object class name asString }) ].
 
  Transcript nextPutAll: '  ';
     nextPutAll: (instVars at: i);
@@ -92,8 +92,8 @@ inspect
      output := [ obj printString ]
       on: Error
       do: [ :ex | ex return: ('%1 %2'
-      bindWith: obj class article
-      with: obj class name asString) ].
+      % { obj class article.
+          obj class name asString }) ].
  Transcript
     nextPutAll: '    [';
     print: i;


--- orig/kernel/VFS.st
+++ mod/kernel/VFS.st
@@ -680,7 +680,7 @@ vfsFor: file name: fsName subPath: subPa
 
     command := self fileTypes at: fsName.
     temp := FileStream openTemporaryFile: Directory temporary, '/vfs'.
-    Smalltalk system: (command bindWith: file with: temp name).
+    Smalltalk system: (command % { file. temp name }).
     ^self new name: file realFileName: temp name! !
 
 
@@ -874,10 +874,7 @@ vfsFor: file name: fsName
 createDir: dirName
     "Create a subdirectory of the receiver, naming it dirName."
 
-    Smalltalk system: command,
- (' mkdir %1 %2'
-    bindWith: self name
-    with: dirName)!
+    Smalltalk system: ('%1 mkdir %2 %3' % { command. self name. dirName })!
 
 do: aBlock
     "Evaluate aBlock once for each file in the directory represented by the
@@ -897,11 +894,8 @@ extractMember: anArchiveMemberHandler
     ^extractedFiles at: anArchiveMemberHandler ifAbsentPut: [
  | temp |
         temp := FileStream openTemporaryFile: Directory temporary, '/vfs'.
-        Smalltalk system: command,
-    (' copyout %1 %2 %3'
-        bindWith: self name
-        with: anArchiveMemberHandler name
-        with: temp name).
+        Smalltalk system: ('%1 copyout %2 %3 %4'
+    % { command. self name. anArchiveMemberHandler name. temp name }).
 
         File fullNameFor: temp name
     ]!
@@ -948,26 +942,17 @@ removeMember: anArchiveMemberHandler
  ifTrue: [ 'rmdir' ]
  ifFalse: [ 'rm' ].
 
-    Smalltalk system: command,
- (' %1 %2 %3'
-    bindWith: subcmd
-    with: self name
-    with: anArchiveMemberHandler name)!
+    Smalltalk system: ('%1 %2 %3 %4'
+ % { command. subcmd. self name. anArchiveMemberHandler name. })!
 
 updateMember: anArchiveMemberHandler
     "Update the member represented by anArchiveMemberHandler by
      copying the file into which it was extracted back to the
      archive."
 
-    | temp |
-    temp := FileStream openTemporaryFile: Directory temporary, '/vfs'.
-    Smalltalk system: command,
- (' copyin %1 %2 %3'
-    bindWith: self name
-    with: anArchiveMemberHandler name
-    with: anArchiveMemberHandler realFileName).
-
-    ^temp name!
+    Smalltalk system: ('%1 copyin %2 %3 %4'
+ % { command. self name. anArchiveMemberHandler name.
+    anArchiveMemberHandler realFileName })!
 
 refresh
     "Extract the directory listing from the archive"


--- orig/net/SMTP.st
+++ mod/net/SMTP.st
@@ -83,9 +83,7 @@ example2Host: host
     "self example2Host: 'localhost'."
 
     | user message client |
-    user := '%1@%2'
- bindWith: (Smalltalk getenv: 'USER')
- with: IPAddress localHostName.
+    user := '%1@%2' % { Smalltalk getenv: 'USER'. IPAddress localHostName }.
 
     message := MIME.MimeEntity readFrom:
 ('From: ', user, '
@@ -106,9 +104,7 @@ exampleHost: host
     "self exampleHost: 'localhost'."
 
     | user message client |
-    user := '%1@%2'
- bindWith: (Smalltalk getenv: 'USER')
- with: IPAddress localHostName.
+    user := '%1@%2' % { Smalltalk getenv: 'USER'. IPAddress localHostName }.
     message := MIME.MimeEntity readFrom:
 ('From: ', user, '
 To: ', user, '


--- orig/net/httpd/FileServer.st
+++ mod/net/httpd/FileServer.st
@@ -678,9 +678,7 @@ contentLength
 !MultiRangeResponse methodsFor: 'caching'!
 
 getBoundary
-    ^'------%1-!-GST-!-%2'
- bindWith: Time secondClock printString
- with: Time millisecondClock printString!
+    ^'------%1-!-GST-!-%2' % { Time secondClock. Time millisecondClock }!
     
 mimeType
     "Cache the MIME type as computed by the FileResponse implementation"


--- orig/net/httpd/WebServer.st
+++ mod/net/httpd/WebServer.st
@@ -1138,7 +1138,7 @@ authorizer: aString
     authorizer := aString!
 
 challengeFor: aServlet
-    ^'Basic realm="%1"' bindWith: aServlet name!
+    ^'Basic realm="%1"' % { aServlet name }!
 
 authorize: aRequest in: aServlet ifAuthorized: aBlock
     ^(self authorize: aRequest)


--- orig/net/httpd/WikiServer.st
+++ mod/net/httpd/WikiServer.st
@@ -1276,10 +1276,9 @@ sendBody
 emitMatchList
     self findMatches.
     referringPages isEmpty ifTrue: [ ^self emitNoMatches ].
-    self heading: [self << ((referringPages size = 1
- ifTrue: ['There is 1 reference to the phrase:']
- ifFalse: ['There are %1 references to the phrase:'])
- bindWith: referringPages size printString)].
+    self heading: [
+ self << ('There %<is|are>2 %1 reference%<|s>2 to the phrase:'
+ % { referringPages size. referringPages size = 1 })].
     self << '<I>  ...'; << self searchString; << '...</I>'; lineBreak.
     self << '<UL>'; nl.
     referringPages do: [:each | self listItem: [self linkToPage: each]].


--- orig/scripts/Getopt.st
+++ mod/scripts/Getopt.st
@@ -40,5 +40,5 @@ Getopt
  o := opt ifNil: [ '' ].
  pat := o isString ifTrue: [ '--%1 %2' ] ifFalse: [ '-%1 %2' ].
  a := arg ifNil: [ '' ].
- (pat bindWith: o with: a) displayNl ]
+ (pat % { o. a }) displayNl ]
     ifError: [ 'ERROR' displayNl ]


--- orig/scripts/Package.st
+++ mod/scripts/Package.st
@@ -98,30 +98,25 @@ Kernel.PackageDirectories subclass: Pack
 
 File extend [
     emitRemove [
- ('rm -f %1' bindWith: self) displayNl
+ ('rm -f %1' % { self }) displayNl
     ]
 
     emitSymlink: dest [
  self isDirectory ifTrue: [ ^(Directory name: dest) emitMkdir ].
-
- ('$LN_S -f %1 %2'
- bindWith: self
- with: (File name: dest)) displayNl
+ ('$LN_S -f %1 %2' % { self. File name: dest }) displayNl
     ]
 
     emitInstall: dest [
  | mode |
  mode := self isExecutable ifTrue: [ 8r755 ] ifFalse: [ 8r644 ].
  ('$INSTALL -m %1 %2 %3'
- bindWith: (mode printString: 8)
- with: self
- with: (File name: dest)) displayNl
+    % { mode printString: 8. self. File name: dest }) displayNl
     ]
 ]
 
 Directory extend [
     emitMkdir [
- ('$mkdir_p %1' bindWith: self) displayNl
+ ('$mkdir_p %1' % { self }) displayNl
     ]
 ]
 


--- orig/tests/AnsiRun.st
+++ mod/tests/AnsiRun.st
@@ -35,7 +35,7 @@ Transcript message: stdout -> #nextPutAl
 
 Smalltalk arguments do: [ :each || results |
     results := (Smalltalk at: each asSymbol) suite run.
-    Transcript showCr: ('%1: %2' bindWith: each with: results printString).
+    Transcript showCr: ('%1: %2' % { each. results }).
     results failureCount > 0 ifTrue: [ results failures printNl ].
     results errorCount > 0 ifTrue: [ results errors printNl ].
     results correctCount < results runCount ifTrue: [ ObjectMemory quit: 1 ]


--- orig/tests/ackermann.st
+++ mod/tests/ackermann.st
@@ -41,6 +41,6 @@ Eval [
  ifTrue: [ 4 ]
  ifFalse: [ Smalltalk arguments first asInteger ].
 
-    ('Ack(3,%1): %2' bindWith: n with: (3 ack: n)) displayNl
+    ('Ack(3,%1): %2' % { n. (3 ack: n) }) displayNl
 
 ]


--- orig/tests/ary3.st
+++ mod/tests/ary3.st
@@ -38,5 +38,5 @@ Eval [
     1000 timesRepeat: [
         n to: 1 by: -1 do: [ :i | y at: i put: (y at: i) + (x at: i) ]
     ].
-    ('%1 %2' bindWith: y first with: y last) displayNl
+    ('%1 %2' % { y first. y last }) displayNl
 ]


--- orig/tests/except.st
+++ mod/tests/except.st
@@ -72,6 +72,6 @@ Eval [
     ifFalse: [ 1 max: Smalltalk arguments first asInteger ].
     
     1 to: n do: [ :each | each someFunction ].
-    ('Exceptions: HI=%1 / LO=%2'
-    bindWith: HiException count with: LoException count) displayNl
+    ('Exceptions: HI=%1 / LO=%2' % { HiException count. LoException count })
+ displayNl
 ]


--- orig/tests/hash2.st
+++ mod/tests/hash2.st
@@ -43,8 +43,9 @@ Eval [
         hash1 keysAndValuesDo: [ :k :v |
         hash2 at: k put: (hash2 at: k ifAbsent: [0]) + v ]].
 
-    ('%1 %2 %3 %4' bindWith: (hash1 at: 'foo_1')
- with: (hash1 at: 'foo_9999')
- with: (hash2 at: 'foo_1')
- with: (hash2 at: 'foo_9999')) displayNl
+    ('%1 %2 %3 %4' % {
+ hash1 at: 'foo_1'.
+ hash1 at: 'foo_9999'.
+ hash2 at: 'foo_1'.
+ hash2 at: 'foo_9999' }) displayNl
 ]


--- orig/tests/lists1.st
+++ mod/tests/lists1.st
@@ -36,7 +36,7 @@ SmallInteger extend [
         [ a isEmpty ] whileFalse: [
         b addLast: a removeLast ].
 
-        ('%1 %2' bindWith: (b at: 1) with: (b at: 2)) displayNl.
+        ('%1 %2' % { b at: 1. b at: 2 }) displayNl.
 
         b := b reverse.
         (b includes: 0) printNl.
@@ -56,7 +56,7 @@ SmallInteger extend [
         sum printNl.
         a := a, b.
 
-        ('%1 %2' bindWith: a size with: a last) displayNl
+        ('%1 %2' % { a size. a last }) displayNl
     ]
 ]
 


--- orig/tests/matrix.st
+++ mod/tests/matrix.st
@@ -77,7 +77,9 @@ Eval [
     m1 := Array newMatrix: size columns: size.
     m2 := Array newMatrix: size columns: size.
     n timesRepeat: [ mm := m1 mmult: m2 ].
-    ('%1 %2 %3 %4' bindWith: (mm atXY: 1@1)
-        with: (mm atXY: 3@4) with: (mm atXY: 4@3)
-        with: (mm atXY: 5@5)) displayNl
+    ('%1 %2 %3 %4' % {
+ mm atXY: 1@1.
+        mm atXY: 3@4.
+ mm atXY: 4@3.
+        mm atXY: 5@5 }) displayNl
 ]


--- orig/tests/prodcons.st
+++ mod/tests/prodcons.st
@@ -41,5 +41,5 @@ Eval [
     
     join wait.
     join wait.
-    ('%1 %2' bindWith: produced with: consumed) displayNl
+    ('%1 %2' % { produced. consumed }) displayNl
 ]


--- orig/tests/sieve.st
+++ mod/tests/sieve.st
@@ -44,5 +44,5 @@ Eval [
         count := count + 1 ]].
     ].
 
-    ('Count: %1' bindWith: count) displayNl
+    ('Count: %1' % { count }) displayNl
 ]


--- orig/xml/XML.st
+++ mod/xml/XML.st
@@ -1739,7 +1739,7 @@ definition: aPattern
     definition := aPattern!
 
 description
-    ^'an <%1> element' bindWith: tag!
+    ^'an <%1> element' % { tag }!
 
 elementNamed: elementName
     | list |
@@ -2076,8 +2076,7 @@ completeValidationAgainst: aParser
     ndata isNil
      ifFalse: [aParser dtd notationAt: ndata ifAbsent:
      [aParser invalid: ('Unparsed entity "%1" uses an undeclared notation "%2"'
-     bindWith: name
-     with: ndata)]]! !
+     % { name. ndata })]]! !
 
 !SAXDriver methodsFor: 'other'!
 
@@ -2692,7 +2691,7 @@ normalizeFor: aParser
      ifFalse: [aParser malformed: 'Incomplete translation'].
      (self duplicatesNeedTested and: [t hasDuplicatesInFollowSet])
      ifTrue: [aParser warn: ('Nondeterministic content model %1'
-     bindWith: self printString)].
+     % { self })].
      done add: t.
      t followSet do: [:t1 |
      (done includes: t1) ifFalse: [list add: t1]]].
@@ -2854,7 +2853,7 @@ named: aName
 !NamePattern methodsFor: 'accessing'!
 
 description
-    ^'<%1>' bindWith: name!
+    ^'<%1>' % { name }!
 
 name
     ^name! !
@@ -3041,7 +3040,7 @@ next
     large values of ch. If primitive failure code can not be trusted to do
     this, then the bounds check would have to be added back."
     (ch isNil or: [(CharacterClasses at: ch asInteger + 1) > 0])
-     ifFalse: [parser errorHandler fatalError: (BadCharacterSignal new messageText:('A character with Unicode value %1 is not legal' bindWith: ch asInteger))].
+     ifFalse: [parser errorHandler fatalError: (BadCharacterSignal new messageText:('A character with Unicode value %1 is not legal' % { ch asInteger }))].
     ^ch!
 
 skip: n
@@ -3517,8 +3516,7 @@ hasExpanded: anEntity
     [s == nil] whileFalse:
      [s entity == anEntity
      ifTrue: [self malformed: ('The %1 entity "%2" invokes itself recursively'
-     bindWith: anEntity entityType
-     with: anEntity name)].
+     % { anEntity entityType. anEntity name })].
      s := s nextLink].
     ^false!
 
@@ -3918,7 +3916,7 @@ PERef: refType
      exp := self dtd parameterEntityAt: nm.
      exp == nil
      ifTrue: [self warn: ('The parameter entity "%1" has not been defined'
-     bindWith: nm)].
+     % { nm })].
      exp == nil
      ifTrue: [self isValidating
      ifTrue:
@@ -4060,7 +4058,7 @@ charEntity: data startedIn: str1
     large values of ch. If primitive failure code can not be trusted to do
     this, then the bounds check would have to be added back."
     (CharacterClasses at: n + 1) = 0
-     ifTrue: [sax fatalError: (BadCharacterSignal new messageText:('A character with Unicode value %1 is not legal' bindWith: n))].
+     ifTrue: [sax fatalError: (BadCharacterSignal new messageText:('A character with Unicode value %1 is not legal' % { n }))].
     data nextPut: (Character value: n).
     self getNextChar!
 
@@ -4071,7 +4069,7 @@ closeTag: tag
     self skipSpace.
     self mustFind: '>'.
     nm = tag
-     ifFalse: [self malformed: ('The close tag for %1 was not found' bindWith: tag asString)].
+     ifFalse: [self malformed: ('The close tag for %1 was not found' % { tag asString })].
     sax endElement: nm namespace localName: nm type qName: nm asString.
     elementStack last definesNamespaces
      ifTrue: [elementStack last namespaces
@@ -4176,7 +4174,7 @@ elementContent: tag openedIn: str
     braceCount := 0.
     buffer reset.
     [hereChar == nil
-     ifTrue: [self malformed: ('The end tag for <%1> was expected' bindWith: tag)].
+     ifTrue: [self malformed: ('The end tag for <%1> was expected' % { tag })].
     hereChar == $<
      ifTrue:
      [braceCount := 0.
@@ -4239,7 +4237,7 @@ generalEntityInText: str canBeExternal:
     exp == nil
      ifTrue:
      [msg := 'The general entity "%1" has not been defined'
-     bindWith: nm.
+     % { nm }.
      self isValidating
      ifTrue: [self invalid: msg]
      ifFalse: [self warn: msg].
@@ -4270,7 +4268,7 @@ popTag
     self isValidating
      ifTrue:
      [elementStack last canTerminate
-     ifFalse: [self invalid: ('One of %1 was expected, but none was found' bindWith: elementStack last followSetDescription)]].
+     ifFalse: [self invalid: ('One of %1 was expected, but none was found' % { elementStack last followSetDescription })]].
     elementStack removeLast.!
 
 pushNewTag: nm
@@ -4287,13 +4285,13 @@ pushNewTag: nm
      types == nil
      ifTrue: [self invalid:
      ('"%1" is not permitted at this point in the "%2" node'
-     bindWith: nm asString
-     with: elm tag asString)].
+     % { nm asString.
+     elm tag asString })].
      elm types: types].
      elementStack addLast: (ElementContext new tag: nm).
      p := self dtd elementFor: nm from: self.
      p == nil
-     ifTrue: [self invalid: ('Using a tag (%1) without declaring it is not permitted' bindWith: nm asString)].
+     ifTrue: [self invalid: ('Using a tag (%1) without declaring it is not permitted' % { nm asString })].
      elementStack last type: p]
      ifFalse:
      [elementStack addLast: (ElementContext new tag: nm)]!
@@ -4357,7 +4355,7 @@ attType
      'ENTITY' 'ENTITIES'
      'NMTOKEN' 'NMTOKENS').
      (all includes: nm)
-     ifFalse: [self malformed: ('One of %1 was expected, but none was found' bindWith: all storeString)].
+     ifFalse: [self malformed: ('One of %1 was expected, but none was found' % { all })].
      type := #(#{NOTATION_AT} #{CDATA_AT} #{ID_AT}
      #{IDREF_AT} #{IDREFS_AT}
      #{ENTITY_AT} #{ENTITIES_AT}
@@ -4586,7 +4584,7 @@ checkReservedAttributes: nm type: type v
      ifFalse: [self malformed: 'xml:space must have a value of "preserve" or "default"']].!
 
 illegalLanguageCode: value
-    self malformed: ('Illegal value (%1) for xml:lang' bindWith: value)!
+    self malformed: ('Illegal value (%1) for xml:lang' % { value })!
 
 isValidName: aTag
     aTag size = 0 ifTrue: [^false].
@@ -4615,7 +4613,7 @@ processAttributes: nm
      attributes addLast: (self attributeFor: nm).
      (attributes collect: [:i | i tag asString]) asSet size = attributes size
      ifFalse: [self malformed: ('The attribute "%1" was used twice in this element''s tag'
-     bindWith: attributes last tag asString)]].
+     % { attributes last tag asString })]].
     self isValidating
      ifTrue: [attributes := self validateAttributes: attributes for: nm].
     attributes := self resolveNamespaces: attributes.
@@ -4642,7 +4640,7 @@ validateAttributes: attributes for: tag
     attributeList do: [:i |
      (attr includesKey: i key asString)
      ifFalse: [self invalid: ('the attribute %1 was not defined in the DTD'
-     bindWith: i key)]].
+     % { i key })]].
     attr do: [:adef | | a |
      a := attributeList detect: [:at | at key isLike: adef name] ifNone: [].
      a == nil
@@ -4654,8 +4652,8 @@ validateAttributes: attributes for: tag
      (Attribute name: adef name value: adef default)]
      ifFalse: [adef isRequired
      ifTrue: [self invalid: ('"%1" elements are required to have a "%2" attribute'
-     bindWith: tag asString
-     with: adef name asString)]]]
+     % { tag asString.
+     adef name asString })]]]
      ifFalse: [adef validateValueOf: a for: self]].
     ^attributeList size = 0
      ifTrue: [nil]
@@ -4665,12 +4663,12 @@ validateAttributes: attributes for: tag
 
 checkUnresolvedIDREFs
     (self isValidating and: [unresolvedIDREFs isEmpty not])
-     ifTrue: [self invalid: ('The IDREFs %1 have not been resolved to IDs' bindWith: unresolvedIDREFs asSortedCollection asArray)]!
+     ifTrue: [self invalid: ('The IDREFs %1 have not been resolved to IDs' % { unresolvedIDREFs asSortedCollection asArray })]!
 
 registerID: attribute
     latestID := attribute value.
     (definedIDs includes: latestID)
-     ifTrue: [self invalid: ('The id "%1" was used more than once' bindWith: latestID)].
+     ifTrue: [self invalid: ('The id "%1" was used more than once' % { latestID })].
     definedIDs add: latestID.
     unresolvedIDREFs remove: latestID ifAbsent: []!
 
@@ -4797,7 +4795,7 @@ documentNode
     ^self document!
 
 expected: string
-    self malformed: ('%1 expected, but not found' bindWith: string)!
+    self malformed: ('%1 expected, but not found' % { string })!
 
 expectedWhitespace
     self malformed: 'White space expected but not found'!
@@ -4863,12 +4861,12 @@ validateEncoding: encName
     c := encName first.
     (c asInteger < 128 and: [c isLetter])
      ifFalse: [self malformed: ('The first letter of the encoding ("%1") must be an ASCII alphabetic letter'
-     bindWith: encName)].
+     % { encName })].
     2 to: encName size do: [:i |
      c := encName at: i.
      (c asInteger < 128 and: [c isLetter or: [c isDigit or: ['._-' includes: c]]])
      ifFalse: [self malformed: ('A letter in the encoding name ("%1") must be ''.'', ''_'', ''-'', or an ASCII letter or digit'
-     bindWith: encName)]]!
+     % { encName })]]!
 
 warn: aMessage
     sax warning: (WarningSignal new messageText: aMessage)!
@@ -4979,7 +4977,7 @@ findNamespace: ns
      nsURI = nil ifFalse: [^nsURI]].
     ^ns = ''
      ifTrue: ['']
-     ifFalse: [self invalid: ('The namespace qualifier %1 has not been bound to a namespace URI' bindWith: ns)]!
+     ifFalse: [self invalid: ('The namespace qualifier %1 has not been bound to a namespace URI' % { ns })]!
 
 resolveNamespaces: attributes
     | newAttributes showDecls t1 t2 k |
@@ -5008,8 +5006,8 @@ resolveNamespaces: attributes
      (t1 type = t2 type and: [t1 namespace = t2 namespace])
      ifTrue:
      [self malformed: ('The attributes "%1" and "%2" have the same namespace and type'
-     bindWith: t1 asString
-     with: t2 asString).
+     % { t1 asString.
+     t2 asString }).
      k := newAttributes size].
      k := k + 1]]].
     elementStack last tag: (self correctTag: elementStack last tag).
@@ -5641,9 +5639,9 @@ validateValueOf: anAttribute for: aParse
     type validateValueOf: anAttribute for: aParser.
     (self isFixed not or: [anAttribute value = self default])
      ifFalse: [aParser invalid: ('The attribute "%1" was declared FIXED, but the value used in the document ("%2") did not match the default ("%3")'
-     bindWith: anAttribute tag asString
-     with: anAttribute value
-     with: self default)].! !
+     % { anAttribute tag asString.
+        anAttribute value.
+        self default })].! !
 
 !AttributeDef methodsFor: 'private'!
 
@@ -5905,22 +5903,22 @@ attributeFor: key subKey: k2 from: anErr
     | val |
     (val := attributeDefs at: key asString ifAbsent: []) == nil
      ifTrue: [anErrorReporter invalid: ('The attribute "%1 %2" has not been defined'
-     bindWith: key asString
-     with: k2 asString)].
+     % { key asString.
+        k2 asString })].
     ^val at: k2 asString
      ifAbsent: [anErrorReporter invalid: ('The attribute "%1 %2" has not been defined'
-     bindWith: key asString
-     with: k2 asString)]!
+     % { key asString.
+        k2 asString })]!
 
 attributeFor: key subKey: k2 put: value from: anErrorReporter
     | dict |
     dict := attributeDefs at: key asString ifAbsentPut: [Dictionary new].
     (dict includesKey: k2 asString)
      ifTrue: [^anErrorReporter warn: ('The attribute "%1 %2" has been defined more than once'
-     bindWith: key asString
-     with: k2 asString)].
+     % { key asString.
+        k2 asString })].
     (value type isID and: [dict contains: [:attr | attr type isID]])
-     ifTrue: [^anErrorReporter invalid: ('The element %1 has two attributes typed as ID' bindWith: key asString)].
+     ifTrue: [^anErrorReporter invalid: ('The element %1 has two attributes typed as ID' % { key asString })].
     dict at: k2 asString put: value!
 
 attributesFor: key
@@ -5943,7 +5941,7 @@ elementFor: key from: anErrorReporter
     | val |
     (val := elementDefs at: key asString ifAbsent: []) == nil
      ifTrue: [anErrorReporter warn: ('The element "%1" has not been defined'
-     bindWith: key asString)].
+     % { key asString })].
     ^val!
 
 elementFor: key put: value from: anErrorReporter
@@ -5951,7 +5949,7 @@ elementFor: key put: value from: anError
      ifTrue:
      [| msg |
      msg := ('The element "%1" has been defined more than once'
-     bindWith: key asString).
+     % { key asString }).
      anErrorReporter isValidating
      ifTrue: [anErrorReporter invalid: msg]
      ifFalse: [anErrorReporter warn: msg]].
@@ -5977,7 +5975,7 @@ generalEntityAt: key
 generalEntityAt: key put: value from: anErrorReporter
     (generalEntities includesKey: key)
      ifTrue: [^anErrorReporter warn: ('The general entity "%1" has been defined more than once'
-     bindWith: key)].
+     % { key })].
     generalEntities at: key put: value!
 
 notationAt: name from: anErrorReporter
@@ -5997,7 +5995,7 @@ parameterEntityAt: key
 parameterEntityAt: key put: value from: anErrorReporter
     (parameterEntities includesKey: key)
      ifTrue: [^anErrorReporter warn: ('The parameter entity "%1" has been defined more than once'
-     bindWith: key)].
+     % { key })].
     parameterEntities at: key put: value! !
 
 !DocumentType methodsFor: 'private'!
@@ -6133,8 +6131,7 @@ completeValidationAgainst: aParser from:
     typeNames do: [:nm |
      aParser dtd notationAt: nm ifAbsent:
      [aParser invalid: ('Undeclared Notation "%1" used by attribute type "%2"'
-     bindWith: nm
-     with: anAttributeDef tag asString)]]!
+     % { nm. anAttributeDef tag asString })]]!
 
 validateValueOf: anAttribute for: aParser
     | v |
@@ -6142,9 +6139,8 @@ validateValueOf: anAttribute for: aParse
     v := anAttribute value.
     (typeNames includes: v)
      ifFalse: [aParser invalid: ('A NOTATION attribute (%1="%2") should have had a value from %3.'
-     bindWith: anAttribute tag asString
-     with: v
-     with: typeNames asArray)].! !
+     % { anAttribute tag asString
+        v. typeNames asArray })].! !
 
 !NOTATION_AT class methodsFor: 'instance creation'!
 
@@ -6161,8 +6157,7 @@ validateValueOf: anAttribute for: aParse
      ifTrue: [aParser invalid: 'white space must not occur in NMTOKEN attributes'].
     (aParser isValidNmToken: v)
      ifFalse: [aParser invalid: ('An NMTOKEN attribute (%1="%2") does not match the required syntax of an NmToken.'
-     bindWith: anAttribute tag asString
-     with: v)]! !
+     % { anAttribute tag asString. v })]! !
 
 !IDREF_AT methodsFor: 'validating'!
 
@@ -6174,8 +6169,7 @@ validateValueOf: anAttribute for: aParse
      ifTrue: [aParser invalid: 'white space must not occur in IDREF attributes'].
     (aParser isValidName: v)
      ifFalse: [aParser invalid: ('An IDREF attribute (%1="%2") does not match the required syntax of a Name.'
-     bindWith: anAttribute tag asString
-     with: v)].
+     % { anAttribute tag asString. v })].
     aParser rememberIDREF: v! !
 
 !NMTOKENS_AT methodsFor: 'validating'!
@@ -6187,8 +6181,7 @@ validateValueOf: anAttribute for: aParse
     (all := self stringAsTokens: v) do: [:nm |
      (aParser isValidNmToken: nm)
      ifFalse: [aParser invalid: ('An NMTOKENS attribute (%1="%2") does not match the required syntax of a list of NmTokens.'
-     bindWith: anAttribute tag asString
-     with: v)]].
+     % { anAttribute tag asString. v })]].
     all size = 0 ifTrue: [aParser invalid: 'Attribute has empty list of NMTOKENS'].! !
 
 !ENTITY_AT methodsFor: 'validating'!
@@ -6208,17 +6201,14 @@ validateValueOf: anAttribute for: aParse
      ifTrue: [aParser invalid: 'white space must not occur in ENTITY attributes'].
     (aParser isValidName: v)
      ifFalse: [aParser invalid: ('An ENTITY attribute (%1="%2") does not match the required syntax of a Name.'
-     bindWith: anAttribute tag asString
-     with: v)].
+     % { anAttribute tag asString. v })].
     ent := aParser dtd generalEntityAt: v.
     ent == nil
      ifTrue: [aParser invalid: ('Undeclared unparsed entity "%1" used by attribute type "%2"'
-     bindWith: v
-     with: anAttribute tag asString)]
+     % { v. anAttribute tag asString })]
      ifFalse: [ent isParsed
      ifTrue: [aParser invalid: ('The entity "%1" used by attribute type "%2" is a parsed entity and should be unparsed'
-     bindWith: v
-     with: anAttribute tag asString)]
+     % { v. anAttribute tag asString })]
      ifFalse: []]! !
 
 !CDATA_AT methodsFor: 'validating'!
@@ -6240,8 +6230,7 @@ validateValueOf: anAttribute for: aParse
      ifTrue: [aParser invalid: 'white space must not occur in ID attributes'].
     (aParser isValidName: v)
      ifFalse: [aParser invalid: ('An ID attribute (%1="%2") does not match the required syntax of a Name.'
-     bindWith: anAttribute tag asString
-     with: v)].
+     % { anAttribute tag asString. v })].
     aParser registerID: anAttribute! !
 
 !ID_AT methodsFor: 'testing'!
@@ -6265,9 +6254,8 @@ validateValueOf: anAttribute for: aParse
     v := anAttribute value.
     (values includes: v)
      ifFalse: [aParser invalid: ('An attribute (%1="%2") should have had a value from %3.'
-     bindWith: anAttribute tag asString
-     with: v
-     with: values asArray)]! !
+     % { anAttribute tag asString. v
+        values asArray })]! !
 
 !Enumeration_AT class methodsFor: 'instance creation'!
 
@@ -6283,8 +6271,7 @@ validateValueOf: anAttribute for: aParse
     (all := self stringAsTokens: v) do: [:nm |
      (aParser isValidName: nm)
      ifFalse: [aParser invalid: ('An IDREFS attribute (%1="%2") does not match the required syntax of a list of Names.'
-     bindWith: anAttribute tag asString
-     with: v)].
+     % { anAttribute tag asString. v })].
      aParser rememberIDREF: nm].
     all size = 0 ifTrue: [aParser invalid: 'Attribute has empty list of IDREFS'].! !
 
@@ -6304,17 +6291,14 @@ validateValueOf: anAttribute for: aParse
     (all := self stringAsTokens: v) do: [:nm |
      (aParser isValidName: nm)
      ifFalse: [aParser invalid: ('An ENTITIES attribute (%1="%2") does not match the required syntax of a list of Names.'
-     bindWith: anAttribute tag asString
-     with: v)].
+     % { anAttribute tag asString. v })].
      ent := aParser dtd generalEntityAt: nm.
      ent == nil
      ifTrue: [aParser invalid: ('Undeclared unparsed entity "%1" used by attribute type "%2"'
-     bindWith: nm
-     with: anAttribute tag asString)]
+     % { nm. anAttribute tag asString })]
      ifFalse: [ent isParsed
      ifTrue: [aParser invalid: ('The entity "%1" used by attribute type "%2" is a parsed entity and should be unparsed'
-     bindWith: nm
-     with: anAttribute tag asString)]
+     % { nm. anAttribute tag asString })]
      ifFalse: []]].
     all size = 0 ifTrue: [aParser invalid: 'Attribute has empty list of ENTITIES'].! !
 
@@ -6396,7 +6380,7 @@ defineDefaultNamespace: attribute
 
 defineNamespace: attribute from: aParser
     (#('xmlns' 'xml') includes: attribute tag type)
-     ifTrue: [self error: ('It is illegal to redefine the qualifier "%1".' bindWith: attribute tag type)].
+     ifTrue: [self error: ('It is illegal to redefine the qualifier "%1".' % { attribute tag type })].
     attribute value isEmpty ifTrue: [aParser invalid: 'It is not permitted to have an empty URI as a namespace name'].
     self namespaces at: attribute tag type put: attribute value!
 


--- orig/xml/XPath.st
+++ mod/xml/XPath.st
@@ -388,7 +388,7 @@ xpathCompareEquality: aData using: aBloc
      ifTrue: [^nodes contains: [:nd1 |
      aData unsortedNodes contains: [:nd2 |
      aBlock value: nd1 xpathStringData value: nd2 xpathStringData]]].
-    self error: ('Can''t compare a %1 with a node set' bindWith: aData class printString)!
+    self error: ('Can''t compare a %1 with a node set' % { aData class })!
 
 xpathCompareOrder: aData using: aBlock
     ^aData xpathIsNodeSet
@@ -448,6 +448,11 @@ xpathUsedVarNames
 xpathUsedVarNames
     ^OrderedCollection new! !
 
+!Object methodsFor: 'xpath'!
+
+xpathUsedVarNames
+    ^OrderedCollection new! !
+
 !XPathExpression methodsFor: 'matching'!
 
 baseValueIn: aNodeContext
@@ -850,7 +855,7 @@ baseValueIn: aNodeContext
     | var |
     var := aNodeContext variables
      at: self name
-     ifAbsent: [self error: ('No binding found for the variable $%1' bindWith: self name)].
+     ifAbsent: [self error: ('No binding found for the variable $%1' % { self name })].
     ^var! !
 
 !XPathVariable methodsFor: 'accessing'!
@@ -1372,7 +1377,7 @@ initializeNumeric
 !XPathBinaryExpression class methodsFor: 'instance creation'!
 
 operator: op with: arg1 with: arg2
-    ^(operators at: op ifAbsent: [self error: ('Not implemented yet %1' bindWith: op)]) copy
+    ^(operators at: op ifAbsent: [self error: ('Not implemented yet %1' % { op })]) copy
  operator: op with: arg1 with: arg2! !
 
 !XPathSortingVector methodsFor: 'sorting'!
@@ -1611,7 +1616,7 @@ axis: axisName test: test
     | stepClass step |
     stepClass := self class nodeTypes
      at: axisName
-     ifAbsent: [self error: ('%1 is not an axis' bindWith: axisName)].
+     ifAbsent: [self error: ('%1 is not an axis' % { axisName })].
     step := stepClass new.
     step axisName: axisName. "Some classes represent multiple axes, and must be told which"
     step baseTest: test.
@@ -2028,6 +2033,9 @@ atEndOfExpression
 init: streamOrString notifying: nothing failBlock: bah
     self source: streamOrString!
 
+init: streamOrString notifying: nothing failBlock: bah
+    self source: streamOrString!
+
 source: streamOrString
     buffer := String new writeStream.
     stack := OrderedCollection new.
@@ -2053,6 +2061,9 @@ result
 initScanner
     "Present for compatibility with the parser in VW."!
 
+initScanner
+    "Present for compatibility with the parser in VW."!
+
 xmlNode: aNode
     xmlNode := aNode! !
 
@@ -2060,7 +2071,7 @@ xmlNode: aNode
 
 functionNamed: fName
     functions == nil ifTrue: [functions := XPathFunction baseFunctions].
-    ^(functions at: fName ifAbsent: [self error: ('Not implemented yet %1()' bindWith: fName)]) copy!
+    ^(functions at: fName ifAbsent: [self error: ('Not implemented yet %1()' % { fName })]) copy!
 
 namespaceAt: aQualifier
     | elm ns |
@@ -2072,7 +2083,7 @@ namespaceAt: aQualifier
      elm := elm parent].
     aQualifier = 'xml' ifTrue: [^XML_URI].
     self error: ('No namespace binding found for namespace qualifier "%1".'
-     bindWith: aQualifier)!
+     % { aQualifier })!
 
 peekFor: trialValue
     "Test to see if tokenType matches aType and token equals trialValue. If so,
@@ -2498,7 +2509,7 @@ xpathCompareEquality: aData using: aBloc
     aData xpathIsNodeSet
      ifTrue: [^aData unsortedNodes contains: [:nd2 |
      aBlock value: self value: nd2 xpathStringData xpathAsBoolean]].
-    self error: ('Can''t compare a %1 with a boolean' bindWith: aData class printString)!
+    self error: ('Can''t compare a %1 with a boolean' % { aData class })!
 
 xpathCompareOrder: aData using: aBlock
     | v |
@@ -2564,7 +2575,7 @@ xpathCompareEquality: aData using: aBloc
     aData xpathIsNodeSet
      ifTrue: [^aData unsortedNodes contains: [:nd2 |
      aBlock value: self value: nd2 xpathStringData xpathAsNumber]].
-    self error: ('Can''t compare a %1 with a number' bindWith: aData class printString)!
+    self error: ('Can''t compare a %1 with a number' % { aData class })!
 
 xpathCompareOrder: aData using: aBlock
     | v |
@@ -2631,7 +2642,7 @@ xpathCompareEquality: aData using: aBloc
     aData xpathIsNodeSet
      ifTrue: [^aData unsortedNodes contains: [:nd2 |
      aBlock value: self value: nd2 xpathStringData]].
-    self error: ('Can''t compare a %1 with a string' bindWith: aData class printString)!
+    self error: ('Can''t compare a %1 with a string' % { aData class })!
 
 xpathCompareOrder: aData using: aBlock
     | v |


--- orig/xml/XSL.st
+++ mod/xml/XSL.st
@@ -419,7 +419,7 @@ addNamedTemplate: aRule
     all := namedTemplates at: aRule name
      ifAbsentPut: [OrderedCollection new].
     (all contains: [:c | c importance = currentImportance value])
-     ifTrue: [self error: ('There are two named templates named %1 with the same importance' bindWith: aRule name)].
+     ifTrue: [self error: ('There are two named templates named %1 with the same importance' % { aRule name })].
     all add: aRule!
 
 addRule: aRule
@@ -438,13 +438,13 @@ addVariable: aVariable
     all := variables at: aVariable name
      ifAbsentPut: [OrderedCollection new].
     (all contains: [:c | c importance = currentImportance value])
-     ifTrue: [self error: ('There are two variables named %1 with the same importance' bindWith: aVariable name)].
+     ifTrue: [self error: ('There are two variables named %1 with the same importance' % { aVariable name })].
     all add: aVariable!
 
 attributesForSet: setName
     | list map |
     list := attributeSets at: setName
-     ifAbsent: [self error: ('No attribute set named "%1".' bindWith: setName asString)].
+     ifAbsent: [self error: ('No attribute set named "%1".' % { setName asString })].
     map := Dictionary new.
     list do: [:as |
      (as allAttributesFrom: self) do: [:attr |
@@ -454,8 +454,8 @@ attributesForSet: setName
     map do: [:singleList |
      (singleList size > 1 and: [(singleList at: 1) key = (singleList at: 2) key])
      ifTrue: [self error: ('Attribute set "%1" includes more than one definition of the attribute "%2".'
-     bindWith: setName asString
-     with: singleList first name asString)].
+     % { setName asString.
+        singleList first name asString })].
      list add: singleList first value].
     ^list!
 
@@ -535,7 +535,7 @@ readString: aString
 resolveAttributesForSet: setName
     | list |
     list := attributeSets at: setName
-     ifAbsent: [self error: ('No attribute set named "%1".' bindWith: setName asString)].!
+     ifAbsent: [self error: ('No attribute set named "%1".' % { setName asString })].!
 
 setOutput: anOutputCommand
     output := anOutputCommand!
@@ -1291,11 +1291,11 @@ checkURISyntax: aString
     type := aString copyFrom: n + 1 to: aString size.
     ch := type at: 1.
     (ch = $_ or: [ch isLetter])
-     ifFalse: [self error: ('Type name syntax error in "%1".' bindWith: type)].
+     ifFalse: [self error: ('Type name syntax error in "%1".' % { type })].
     2 to: type size do: [:i |
      ch := type at: i.
      (ch isLetter or: [ch isDigit or: ['.-_' includes: ch]])
-     ifFalse: [self error: ('Type name syntax error in "%1".' bindWith: type)]]!
+     ifFalse: [self error: ('Type name syntax error in "%1".' % { type })]]!
 
 collate: node1 to: node2 within: aNodeContext
     | list sign |
@@ -1309,8 +1309,7 @@ collate: node1 to: node2 within: aNodeCo
 readAttribute: attName
     ^self readAttribute: attName
      default: [self error: ('%1 needs to have an attribute named %2'
-     bindWith: self tag asString
-     with: attName)]!
+     % { self tag asString. attName })]!
 
 readAttribute: attName default: def
     | att |
@@ -1325,18 +1324,17 @@ readInteger: attName default: def
     ^att == nil
      ifTrue: [def value]
      ifFalse:
-     [att isEmpty ifTrue: [self error: ('The %1 attribute is empty' bindWith: attName)].
+     [att isEmpty ifTrue: [self error: ('The %1 attribute is empty' % { attName })].
      att := att readStream.
      val := Number readFrom: att.
      val = 0 ifTrue: [self error: 'Bad number format, ', (att instVarAt: 1)].
-     att atEnd ifFalse: [self error: ('The %1 attribute is not a legal integer value' bindWith: attName)].
+     att atEnd ifFalse: [self error: ('The %1 attribute is not a legal integer value' % { attName })].
      val]!
 
 readMatchPattern: attName
     ^self readMatchPattern: attName
      default: [self error: ('%1 needs to have an attribute named %2'
-     bindWith: self tag asString
-     with: attName)]!
+     % { self tag asString. attName })]!
 
 readMatchPattern: attName default: def
     | att |
@@ -1350,8 +1348,7 @@ readMatchPattern: attName default: def
 readSelectPattern: attName
     ^self readSelectPattern: attName
      default: [self error: ('%1 needs to have an attribute named %2'
-     bindWith: self tag asString
-     with: attName)]!
+     % { self tag asString. attName })]!
 
 readSelectPattern: attName default: def
     | att d |
@@ -1372,8 +1369,7 @@ readTag: attName
     att := self valueOfAttribute: attName ifAbsent: [nil].
     ^att == nil
      ifTrue: [self error: ('%1 needs to have an attribute named %2'
-     bindWith: self tag asString
-     with: attName)]
+     % { self tag asString. attName })]
      ifFalse: [att]!
 
 readTagList: attName default: defaultBlock
@@ -1437,7 +1433,7 @@ generatesAttributes
 
 isStylesheetEntry
     Transcript nl; tab; show: ('Stylesheet contains a top-level element that is not permitted (%1)'
-     bindWith: self tag).
+     % { self tag }).
     Transcript nl; tab; show: 'It has been ignored'.
     ^false!
 
@@ -1523,7 +1519,7 @@ resolveComputedTag: nm
      qualifier := self findQualifierAtNamespace: 'quote:', ns.
      qualifier == nil
      ifTrue: [qualifier := self findQualifierAtNamespace: ns].
-     qualifier == nil ifTrue: [self error: ('The namespace %1 has not been bound to a qualifier in this stylesheet, and automatic creation of qualifiers has not been implemented.' bindWith: ns)].
+     qualifier == nil ifTrue: [self error: ('The namespace %1 has not been bound to a qualifier in this stylesheet, and automatic creation of qualifiers has not been implemented.' % { ns })].
      NodeTag new qualifier: qualifier ns: ns type: type]
      ifFalse:
      [self checkQNameSyntax: nm.
@@ -1542,7 +1538,7 @@ resolveTag: aTagString
      ifTrue: [self error: 'A qualified name cannot begin or end with a colon.'].
      qual := aTagString copyFrom: 1 to: c - 1.
      ns := self findNamespaceAt: qual.
-     ns == nil ifTrue: [self error: ('The namespace qualifier %1 has not been bound to a namespace in this stylesheet' bindWith: qual)].
+     ns == nil ifTrue: [self error: ('The namespace qualifier %1 has not been bound to a namespace in this stylesheet' % { qual })].
      "Use a # in the match to make sure there's at least one more character"
      ('quote:#*' match: ns)
      ifTrue: [ns := ns copyFrom: 'quote:' size + 1 to: ns size].
@@ -1988,7 +1984,7 @@ sequenceSrc
 format: number by: aFormat
     | n s |
     aFormat size = 1
-     ifFalse: [self error: ('Unrecognized number format = "%1"' bindWith: aFormat)].
+     ifFalse: [self error: ('Unrecognized number format = "%1"' % { aFormat })].
     aFormat = 'a'
      ifTrue:
      [n := self radix: number base: 26.
@@ -2352,7 +2348,7 @@ topLevelAddToRuleDB: aDB
 
     self tag namespace = XSL_URI
      ifTrue: [self error: ('"%1" not recognized as an XSL command'
-     bindWith: self tag asString)].
+     % { self tag asString })].
     aDB addRule: self! !
 
 !VariableDefinition methodsFor: 'loading'!




_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk
Reply | Threaded
Open this post in threaded view
|

Re: [please review] CharacterArray>>#%

Paolo Bonzini-2
Paolo Bonzini wrote:
> I've just added CharacterArray>>#% to 2.3 and 3.0.
>
> In 3.0 however I also want to change the callers.  Could a brave soul
> help reviewing the attached patch?

I spotted a couple of mistakes and committed the fixed patch as
[hidden email]/smalltalk--devo--2.2--patch-297 and
[hidden email]--2004b/smalltalk--devo--2.2--patch-421 respectively.

Also I had forgotten to say that #% is just a shortcut to
#bindWithArguments:.

Paolo


_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk
Reply | Threaded
Open this post in threaded view
|

Re: [please review] CharacterArray>>#%

S11001001
In reply to this post by Paolo Bonzini
On Mon, 2007-06-25 at 15:40 +0200, Paolo Bonzini wrote:
> I've just added CharacterArray>>#% to 2.3 and 3.0.

I think this is great.  I'll be changing my #bindWith:* sends to it as
soon as I update again.

>  from: aPoint to: endPoint
>      ^'%1.%2 %3.%4'
> - bindWith: aPoint y printString
> - with: (aPoint x - 1) printString
> - with: endPoint y printString
> - with: (endPoint x - 1) printString
> + % { aPoint y printString.  (aPoint x - 1) printString.
> +    endPoint y printString.  (endPoint x - 1) printString }
>  !

I don't think these #'printString's are necessary, not that that has
anything to do with it....

>  setInitialSize
> @@ -3687,8 +3687,7 @@ initialize: parentWidget
>      label := ''.
>      exists := false.
>      primitive := '%1.w%2'
> - bindWith: self parent container
> - with: (self asOop printString: 36).
> + % { self parent container. self asOop printString: 36 }).

Extra paren, I think.

>      ^(directory at: directory size) isPathSeparator
>   ifTrue: [ directory, fileName ]
> - ifFalse: [ '%1%2%3'
> -    bindWith: directory
> -    with: self pathSeparator
> -    with: fileName ]
> + ifFalse: [ directory, self pathSeparatorString, fileName ]

{directory. self pathSeparatorString. fileName} join :)

--
;;; Stephen Compall ** http://scompall.nocandysw.com/blog **
"Peta" is Greek for fifth; a petabyte is 10 to the fifth power, as
well as fifth in line after kilo, mega, giga, and tera.
  -- Lee Gomes, performing every Wednesday in his tech column
     "Portals" on page B1 of The Wall Street Journal

_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk

signature.asc (196 bytes) Download Attachment