NEWS FROM 2.2 TO 2.3
IMPORTANT: GNU Smalltalk now adds an explicit exception to the GNU GPL
license, allowing the programs running under the virtual machine to use
a GPL-incompatible license. This exception is used both by the
virtual machine and by the library bindings included in GNU Smalltalk.
This clears gray areas when a Smalltalk program is using functions
in the external library bindings via dynamic linking and the foreign
function call interface (C call-outs).
o C call-outs returning #void now return self rather than nil.
Performance of code heavily using C call-outs has improved.
o FileStreams can now use pwrite for more efficient operation on files
opened for read/write, and will do many less gratuitous lseek
operations. pread will also be used by FileStream>>#copyFrom:to:.
The number of system calls issued when generating the documentation,
for example, is reduced by a third.
o Fixed bug in methods containing both -0.0 and 0.0 (positive and negative
floating-point zero).
o Fixed bug in Directory class>>#create:, that could not create a
directory relative to the current directory.
o Fixed bug in File>>#touch, which did not work really. There are also
methods to modify a file's atime and mtime.
o Fixed bug in SortedCollection. After #removeAtIndex:, adds would leave
the collection unordered.
o Fixed many more bugs.
o Introduced a method to efficiently convert a WriteStream into a ReadStream.
It is called #readStream and makes WriteStream more polymorphic with String.
o Introduced two more class shapes, #character and #utf32, that can be used
for String and UnicodeString.
o More reliable detection of at-end-of-file condition for pipes, TTYs,
and so on (especially on Mac OS X), and of sockets closed by the peer.
Due to incompatibilities between various OSes, you are advised to test
end-of-stream conditions *before* rather than after reading a character
from stdin. In 2.2, either way would work, but serious bugs were
found on Mac OS X unless stdin was redirected from a file.
o Moved gdk_draw_ functions to GdkDrawable.
o New goodie to parse the command line. Look at the documentation for
the Getopt class and for SystemDictionary>>#arguments:do:.
o New example, lazy collections. When loaded, #select:, #reject: and
#collect: do not create a new collection unless necessary. Idioms like
(a select: [ :each | ... ]) do: [ : each | ... ]
or
a := a select: [ :each | ... ].
a := a reject: [ :each | ... ].
a := a select: [ :each | ... ].
^a size
can be much faster when this example is loaded.
o Regular expressions are now included in the default image. The interface
is now definitive and is similar to 2.2. The concrete classes for
RegexResults are in a private namespace (since the user need not
instantiate them anyway). Right now, regular expressions are only
usable for String objects (see Unicode support below). This may
change in the future.
o The backtraces now omit again the internal methods in the exception
handling system.
o The class above which super-send bytecodes start searching is now embedded
in the bytecode stream. This provides the infrastructure to implement
'here' as in Smalltalk/X or 'self.Foo b' to execute the Foo>>#b method
(these possible extensions have not been implemented).
o The header files compile cleanly with a C++ compiler. For the occasion,
the preferred name of the old `mst_Object' has changed to `gst_object'.
o Various speedups.
Unicode support:
o Characters above 127 are no longer used to represent extended ASCII
characters. Instead, they are only used to represent a byte in
the encoding of the Unicode characters from 128 on. To create
them use the Blue Book method Character class>>#value:.
To represent Unicode characters above 127 use the (ANSI Smalltalk)
Character class>>#codePoint: method. Note that these characters
*cannot* be shown on a stream with #nextPut: (use #display: instead)
nor compared with #== (use #= instead).
Character literals like $+ or $A are guaranteed to create normal
"Character" objects, for which you can safely use #nextPut:. Right
now, these are valid only for characters between 0 and 127. To create
Character literals for unicode characters, use the new syntax to
express characters using their Unicode code point. This may be
extended in the future to support Unicode character literals.
A ``safe'' way to obtain the character whose encoding is between
128 and 255 is this (which requires the Iconv module to be loaded):
##('' asUnicodeString first)
(This snippet has no shortcut by design because, in general, converting
a Character to a UnicodeCharacter is not a well-defined operation).
o New UnicodeCharacter and UnicodeString classes. These new classes
can also be passed to and received from C functions. See the
manual for more information.
o New syntax $<13> to express characters using their Unicode code point.
As anticipated, this syntax will create instances of the new UnicodeCharacter
class when the number is > 127.
o Part of the I18N module was separated into the Iconv module, which
provides support for printing Unicode characters and strings correctly.
Other goodies:
o NCurses bindings, contributed by Brad Watson.