Clean Slate Smalltalk 0.3.5

Clean Slate Smalltalk is a new dialect and environment in the Smalltalk family.

  Add it to your Download Basket!

 Add it to your Watch List!


Rate it!
send us
an update
MIT/X Consortium License 
2.8/5 12
ROOT \ Programming \ Compilers
Slate is a prototype-based object-oriented programming language based on Self, CLOS, and Smalltalk-80. Slate syntax is intended to be as familiar as possible to a Smalltalker, for the clarity of messages as phrases.

Unlike the Smalltalk family, methods within Slate can be assigned to a signature of objects, instead of being installed on one favored receiver. Slate has also many further expansions of the semantics which enable more concise and natural ways to express solutions to problems.

Particular attention is being paid to the design of a fuller and more useful set of libraries than even the usual Smalltalk set, for collections, streams, meta-level protocols, concurrency, and exception-handling, among others. Our prime inspirations are the libraries of Strongtalk, Common Lisp, and Dylan.

Here are some key features of "Clean Slate Smalltalk":


Define methods, slots, instantiation, and inheritance per object.

Multiple Dispatching

Specialize methods for each argument, not just an "owner"; behavior is cooperative.

Optional Type Annotations

Annotate the intended type of a slot or expression with type inference and a extensible independent type system.

Syntactic Abstractions

Annotate and manipulate expression trees dynamically and abstractly with language support.

Optional Keywords

Pass along any optional local bindings with a message or to a block.

Subjective Dispatching

Conditionalize a method's implementation on elements of the context.


Aggregate, transform, and fold your data into different shapes easily and generically.


Quickly plug together flexible stream facilities to and from many data types, with the same power of collections.


Handle exceptional situations powerfully with live customizable condition and restart objects.


Spawn service requests at will, and forget about blocking and locking. Promise objects keep you interacting safely.

Slate is also a "living" environment, and is intended to support the full services that one would expect from an Operating System, including a graphical interface. There are many new designs and ideas that will be implemented for the language, including a modification of the Morphic user interface to support the notions in the CLIM user interface architecture.

We plan to fully bootstrap Slate using similar optimization methods as its predecessor Self used, as well as some more recent advances. We believe, however, that a properly self-hosted implementation of these ideas will support better integration and extension, and in the end result in a much lighter-weight system.

What's New in This Release:

Fixed macro issues: cascades with locals, Macro evaluateIn:, Range project:.
Fixed Collection issues: LinkedList, collect:into:, atAll:, BitArray size.
MR code was brought to a reasonable level of functionality and testability.
Added an "arg: N" expression form for the Debugger which evaluates to context values which are not named.
Omitted the traitsWindow slots from standard REPL printing to cut down on the noise.
Added selectorsCalledOnInputNo:/selectorsCalledOnArg: to Syntax Block.
Added hasIndexedSlots which tells if an object has an indexed payload for all objects to abstract away Array/ByteArray-ness tests.
Changed the object-map relation name from #map to #_map so other slots can be named #map.
Fixed bugs in the heap-iteration primitives (see src/mobius/vm/interp/memory.slate).
Added a src/mobius/persist/ to handle source database, module migration and linking issues. Right now there is just a simple Tracer and utilities.
Moved repl.slate from src/mobius/ to src/lib/.
Refactored the bootstrapping code to use object-ified VM Definition and Image Definition. The build API and instructions in README were also updated (for the lazy, load src/mobius/init.slate and call fullCleanBootstrap).
Refactored Magnitude/Number into Comparable/Number/CoercibleNumberMixin to reflect the actual semantics and extract useful coercion code.
Added simple asynchronous slot-observer code as src/lib/observer.slate.
Added aliasSlotNamed:as: to simulate linked-slot-values.
Added the Y combinator as Method Y.
ExternalLibrary errors are now accessible with currentErrorString.
Added a `math macro which handles basic arithmetic Slate expressions in conventional precedence interpretation.
Added Converter, Encoder, and Decoder types with a simple Base-64 implementation to src/lib/converter.slate.
Added compareAndHashUsingSlots: and extendCompareAndHashUsingSlots: to src/lib/macro.slate which generate standard =/hash methods based on slot names/values.
Added Directory home, current and Home/Current, based on the Platform plugin. The latter dynamically represent that result, and the former are evaluated for the particular moment of the call only.
Made use of define: in most libraries.
Added a "Platform" plugin which access standard platform information, the Environment as a Dictionary, and a system() wrapper. See src/plugins/platform/.
Added a noviceMode switch slot on the REPL which suppresses the Debugger for errors encountered as a result of REPL expressions. "repl noviceMode: False" disables it.
Extended the Parser's error reporting with check: token is: {types} and expected:butFound: to standardize and clarify Parser error-reporting.
Added a Converter abstraction with >> support, as well as a Base64 encoder/decoder in converter.slate.
Added a `math macro to handle convential precedence assumptions in arithmetic code. It however will not handle non-arithmetic code within yet.
Fixed the QuickSort algorithm in Sequence sortFrom:to:by: to not require two executions to reach final sorted state.
Added String 'sorted' method.
Added Method "adverbial" (called so after their APL/K language origins) methods: reducer, collector, acrosser, selecter, tracer, injector, converger which turn their respective Collection method normal variants into blocks with the argument block filled-in with the receiver.
Added Root converge: which takes a block and runs it on the object and results until there is a fixed-point or cycle of values.
Added Collection trace: which acts like inject:into: but returns all the intermediate values.
Added Method across: Collection which applies the block to matching elements of collections in the argument. If it's a binary block, it works like reduce:, otherwise the block's arity should be the same as the number of collections in the argument.
Added a Namespace 'new' method.
Added &slots: to ensureNamespace: and ensureDelegatedNamespace: for the simple construction case of a Namespace of simple (immutable) values.
Added define:&parents:&builder:&slots: to wrap the varying ways to define immutable and well-known objects and derivations (&builder: triggers define:using: but the other two optionals are suitable for derivation customization).
Cleaned up define:using:.
Added ExternalPrimitivesHolder as a facade for ExternalLibrary facilities that are reasonably regular.
Cleaned up and simplified the SDL backend, also turning it into a plugin.
Fixed/cleaned-up AutoLoader database code.
Added LineStream R/W/RW variants as attributes / wrappers of R/W/RWStreams; each LineStream takes/emits whole lines as elements. The generic accessor "lines" on a Stream instantiates an appropriate type. Reading from this Stream type will auto-detect line endings.
Added Everything and Nothing as PredicateCollections.
Made Sequence rotate/rotated efficient, and added shiftFrom:by:count:, replaceFrom:with:, and reverse (in-place variant of reversed).
Fixed Sequence first:/last: to work for N > sequence size.
Added Sequence endsWith:, includesSubSeq:.
Added UniqueNumber to refactor Infinities and Epsilons.
Fixed the SourceWriter's usage of parentheses, and the Parser's output of them (this did not affect compilation).
Added a default grow method for ExtensibleSequences.
Added E-style language concurrency, using % to prefix message selectors or expressions as a whole for deferred-resolution, with dependency management for nested-eventualness. See concurrency.slate; the initial Process used is currently REPL-driven.

Last updated on August 10th, 2005

#programming language #Slate syntax #dialog #environment #prototype-based #object-oriented

Add your review!