home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 116.lha / SmallTalk / Manual / AT.MS next >
Text File  |  1986-11-20  |  5KB  |  136 lines

  1. .LP
  2. (note: this is the first of a series of essays descriging how various 
  3. features of the Little Smalltalk bytecodes work).
  4. .SH
  5. Where It's At
  6. .PP
  7. This short note explains how the messages \fBat:\fP, \fBat:put:\fP, and their 
  8. relatives are defined and used in collections.  We start by discussing the 
  9. simplest form of collections, arrays and strings.
  10. .PP
  11. The message \fBat:\fP is not defined anywhere in class \fBArray\fP or any of
  12. its subclasses.  Instead, this message is inherited from 
  13. class \fBCollection\fP, which defines it using the following method:
  14. .DS I
  15. \fBat:\fP index
  16.     \(ua self at: index
  17.         ifAbsent: [ smalltalk error: 'index to at: illegal' ]
  18. .DE
  19. .PP
  20. The functioning of the message \fBerror:\fP is the topic of another essay;
  21. it is sufficient for our purposes to note only that this message prints out
  22. the error string and returns nil.  By redefining \fBat:\fP in this fashion,
  23. the subclasses of \fBCollection\fP need not be concerned about how to deal
  24. with errors in cases where no error recovery action has been specified.
  25. .PP
  26. For an array, an index is out of bounds if it is either less than 1 or greater
  27. than the size of the array.  This is tested by a method in class \fBArray\fP:
  28. .DS I
  29. \fBincludesKey:\fP index
  30.     ^ index between: 1 and: self size
  31. .DE
  32. .PP
  33. The message \fBsize\fP is defined in class \fBArray\fP in terms of the
  34. message \fBbasicSize\fP
  35. .DS I
  36. \fBsize\fP
  37.     ^ self basicSize
  38. .DE
  39. .PP
  40. The message \fBbasicSize\fP (as well as \fBbasicAt:\fP, discussed below) 
  41. is inherited from class 
  42. \fBObject\fP.  It can be used on any object; on non-arrays it returns
  43. the number of instance variables for the object.  The messages \fBbasicSize\fP 
  44. and \fBbasicAt:put:\fP can be used by system
  45. classes, for example debuggers, to access instance variables in an object 
  46. without having explicit access to the instance variables.  One must be 
  47. careful, however,
  48. \fBbasicAt:\fP produces a system error, and not a Smalltalk error message,
  49. if it is given an index value that is out of range.
  50. .PP
  51. Using \fBincludesKey:\fP for a test, a value is only accessed if the index
  52. is legal.  The following method appears in class \fBArray\fP:
  53. .DS I
  54. \fBat:\fP index \fBifAbsent:\fP exceptionBlock
  55.     ^ (self includesKey: index)
  56.         ifTrue: [ self basicAt: index ]
  57.         ifFalse: [ exceptionBlock value ]
  58. .DE
  59. .PP
  60. A subclass of \fBArray\fP is the class \fBByteArray\fP.  A byte array is a form
  61. of array in which the elements can only take on values from zero to 255, or
  62. to put it another way, values that can be stored in one byte.
  63. On most 16 bit machines, we can store two such bytes in the space it takes
  64. to store one object pointer.  Thus, the message \fBsize\fP is redefined
  65. in class \fBByteArray\fP as follows:
  66. .DS I
  67. \fBsize\fP
  68.     \(ua self basicSize * 2
  69. .DE
  70. .LP
  71. Note that this implies that byte arrays always have an even number of
  72. elements.  Next the message \fBbasicAt:\fP is redefined to use a byte,
  73. instead of object, form of index.  This is accomplished using a primitive
  74. method, (the message \fBbasicAt:\fP is handled in a similar fashion in
  75. class \fBObject\fP, only using a different primitive).
  76. .DS I
  77. \fBbasicAt:\fP index
  78.     \(ua <26 self index>
  79. .DE
  80. .PP
  81. Like a byte array, a string can also store two byte values in the space
  82. it takes to store a single object pointer.  Unlike a byte array, however,
  83. a string can be any length, not just an even length.  Therefore the message
  84. \fBsize\fP is redefned in class \fBString\fP, a subclass of \fBByteArray\fP.
  85. .DS I
  86. \fBsize\fP
  87.     \(ua <14 self>
  88. .DE
  89. .PP
  90. Another difference between a string and a byte array is that the value
  91. returned by a string must be a character, not an integer.  Therefore
  92. \fBbasicAt:\fP must also be redefined.  By using the message \fBbasicAt:\fP
  93. defined in \fBByteArray\fP, (the superclass of String, and therefore accessible
  94. via the pseudo variable \fBsuper\fP) the method can obtain the integer value 
  95. of the appropriate character.  This value is then used to create a new
  96. instance of class \fBChar\fP:
  97. .DS I
  98. \fBbasicAt:\fP index
  99.     \(ua Char new; value: (super basicAt: index)
  100. .DE
  101. .PP
  102. A value is placed into an array using the message \fPat:put:\fP.  As with 
  103. \fBat:\fP, a value should only be placed if the index represents a legal
  104. subscript.  This is checked in the following method:
  105. .DS I
  106. \fBat:\fP index \fBput:\fP value
  107.     (self includesKey: index)
  108.         ifTrue: [ self basicAt: index put: value ]
  109.         ifFalse: [ smalltalk error: 
  110.             'illegal index to at:put: for array' ]
  111. .DE
  112. .PP
  113. As was the case with \fBbasicAt:\fP, one version of \fBbasicAt:put:\fP,
  114. to be used by arrays of objects, is defined as part of class \fBObject\fP.
  115. A different version is found in class \fBByteArray\fP.  Finally a third 
  116. version, which first checks to see if the argument is a Character, is found
  117. in class \fBString\fP.
  118. .DS I
  119. \fBat:\fP index \fBput:\fP aValue
  120.     (aValue isMemberOf: Char)
  121.         ifTrue: [ super basicAt: index put: aValue asciiValue ]
  122.         ifFalse: [ smalltalk error:
  123.             'cannot put non Char into string' ]
  124. .DE
  125. .SH
  126. Exercises
  127. .IP 1.
  128. Describe the sequence of messages used to respond to the following:
  129. .DS B
  130. x \(<- #(1 2 3) at: 2
  131. .DE
  132. .IP 2.
  133. Describe how the execution of the above expression could be speeded up by
  134. adding new methods.  Note if your methods are specific to arrays of objects,
  135. arrays of bytes, or strings.
  136.