Release / Change Notes: Slate-current: - Added methods cloneSettingSlots:to:, cloneWithUpdates:, cloneSettingSlots:from: which provide a convenience for instantiation of immutable objects. The first takes an array of slot names and an array of values, the second an array of Associations thereof, and the third takes slot names and then a source object with those slots to get values. - Consolidation of the mobius Makefile rules. - Fixed Sequence concatenatedTimes:. - Added translate:for: and speaks: to Trait code, with an initial outline of a macro for defining a service based on a method definition expression. - Defined equality/hash on CompiledMethods. - Defined ExternalMethod's selector as its name slot value, making printouts a little better. - Added some relevant documents to read for further i18n considerations. - Commented out the adverb #selector on Method because it overrides and breaks #selector as accessor-like method on Method. - Added Signature defineAs: method to safely wrap asMethod:on:. - Added over: for MapOverlay creation. - An initial crude port of the Squeak Trait work. This is just a record of the initial design which will likely change and expand. - Added an arity method to Signature and added empty checks to Symbol arity query methods. - Added allSelectorsSentToInputs to Syntax Block. - Refactor to use #suiteForSelectors:, and update progman. - Refactored the selectorsSent queries and the corresponding unused ones defined on syntax node objects themselves to share code and protocol. - The beginnings of stream protocol tests. - TestCase #suiteForSelectors: - Made withRoot: a &root: optional for printing of Path objects. - Added a manual section on writing unit tests. - Added Method query methods for determining what selectors are called on given or all inputs, or on the implicit context. The latter does not work properly yet. - Next steps for socket code. - Added contrib and unfinished directories to src/. - Split mainLoop into smaller methods, for debuggability and live-update. - Simple I/O multiplexor - not tested properly yet. - Added handleSave and saveActions to Image code for pre-save hooks (currently unused but they will be useful in the future). - Moved the traitsTally method up to Root. - Added Scheduler unblock: method. - Placeholder for a manual section on image persistence - Big bad sockets patch - half-implemented so far. - Fixed endianness problems with BigIntegers in extlib on big-endian machines. - Add Sequence join method, depending on Cords. - Convert FFI results to BigInteger where required. - Detail in socket_CreateSocketAndConnectByDNS in case of error. - Fixed the arity and allSelectorsSent protocols. - Added a #swing method to Method ported from relative obscurity of Haskell. - Fixed splitWith: to honor the &includeEmpties: optional. - Added `defaultsTo: for setting the default value of optional block arguments. - Various Syntax Node additions (parenthesize) and fixes. - Added a roleIndices introspection method which returns an Array of all indices an object has roles for dispatch positions. Also a reset method was added for RoleReadStream. - Added InjectStream last method to quickly get the last value. - Makefile clean rule update to recurse over platform directory and plugins. - Temporary patch to boot.c to bootstrap in the InterruptFlag change to the VM interface. - Fix prototype of slate_GetTimeZoneOffsetInSeconds to allow plugins to compile. - Install shortcut to socket primitives. - Rename thread.slate to process.slate, replacing the old process.slate. - Modification to boot.c to drive a context-switch loop, plus support code. - Support an interrupt flag, and primitive for building an Interpreter. - Fix simple bugs in Interpreter Frame abstraction. - Cut String into ASCIIString/String for I18N integration. - Fixed BigInteger bugs. - Fixed nested condition printing in the Debugger. - Fixed Time plugin issues and cygwin compatibility. - Removed implicit assumptions in ReadStream next:putInto:. - Fixed ReadBufferStream. - Fixed RingBuffer addAllFirst: and addAllLast:. - Fixed Inspector close. - Fixed Queue do:. - Added some benchmark tests from the Computer Language Shootout to tests/benchmark.slate. - Signal infinite loop fix on test failures and various other test updates. - Fixed ExternalMethod support for Double-type parameters. - Extended ExternalMethod to handle up to 16 word-sized parameters. - Adjusted collectGarbage primitive. - Changed Dictionary Nil-key handling to warn instead of signal an error, for transition purposes. - Bootstrap bug-fixes. - Added accessorMethods and mutatorMethods methods. - Moved slotCount and delegateCount to pre-bootstrap code, since they are shadowed now by vm/interp/map.slate. - Noted and handled Nil keys in a Dictionary. - Exposed the garbageCollect VM routine as collectGarbage primitive. - Fixed File Locator printing to escape its contents, and fixed String escaped for space characters. - Added Integer byteShift: for bootstrap code. - Added a #sign method to Comparable, based on < and <=>. - Added Integer intoByte. - Cleanups to bootstrapping code. - Added Syntax equality/hash methods. - Added #roles and #methods to access all roles and methods on a given object. - Fixed role/method introspection due to a bug in RoleReadStream. - Added beginningWith:, endingWith:, containing: to the global Symbols table for convenient searching. - Some more plug-in Makefile enhancements (take 2). - Refactored rolesDo: and callers into a roleReader stream-based protocol and roleReadStream for Map objects. - Consolidated the reference manual's introspection notes into one section, and added more entries. - Replaced the use of "Call" in message-send tracing routines with "Send" for uniformity with sendWith:/sendTo:/allSelectorsSent, etc. So the new methods are #senders, #macroSenders, #methodsSending:. - Added macroCallers&in: to Symbol, and supporting methods allMacroSelectorsSent and methodsCallingMacro:. - Added CompiledMethod recompile for updating methods based on their annotated sources. - Refactored plugins Makefiles. - Added BOOTFILES as a rule pre-requisite for building the VM. - Made use of the VERSION file in common.mk. - Added a VERSION file for automation/build update purposes. - Added an Image save &startupREPL: option to allow live saving that does not continue the stack from the immediate context. - Added an openResource method to ExternalResource Locator for polymorphic construction of resources from locators. - Removed the dependency on PATH including ./ and cleaned up the byte-order testing for the Makefile. - New Makefile / common.mk architecture from Nick Forde. - Refactored load: into a locator vs. File variant. - Added a globals SlateDir, Directory / pathSpec definition. - Fixed the handling of Warnings - Condition fixes. - Bug-fix for File exists which was fouling Image-saves. - Fixed LogicalDirectory =. - Uncommenting out Directory Home/Current. - Byte compiler fix for literal sharing. - Fixed MethodDefinition constructor. - Fixed compareAndHashUsingSlots:. - LogicalDirector locator fix. - Moved compareAndHasUsingSlots: calls from core library sources to just after their definitions in post-bootstrap macro.slate. - Clean-up of the C if/then translation fix. - Updates to generation of nested if statements for GCC 4.0 - Bug-fix in Directory Locator readFrom:. - Re-parented Directory Proxy to Directory so it's just an extension. - Fixed Directory Proxy to use the new dictionary-style access. - An attempt to fix extendCompareAndHashUsingSlots: using a new MethodDefinition constructor method. - Avoided the use of extendCompareAndHashUsingSlots: until its bug is fixed. - Many bug-fixes for File/Directory and their Locator types. - Added readFrom: to Syntax Token Token. - Enhanced LogicalDirectory into a general facility, and made explicit the startup need to re-initialize them. - Refactored the restart UI system to use describeOn: and queryFrom: vs. describe/query, made a console slot for the Debugger, and added File NotFound handlers and exists check for connectionFailed. - File/Directory Locator cleanups and bug-fixes, mainly re: root directories. - Improved String as: Integer to support negation. - Fixed vm.c GCC 4.0 warnings. - Small little clean-ups for message debugging printouts. - Added an #ifdef DEBUG symbol-printing clause to the message-dispatch algorithm in the VM for easier debugging when the Slate debugger is not activated or available. - Bug-fixes for C compiler warnings from Nick Forde (patch reconstituted due to a patch hash error). - IR/MR Label fixes. - Assembler updates. - Improve cleaning for socket plugin - Renamed ExternalPrimitivesHolder to ExternalInterface and CStruct to CObject for clarity. - Removed .dylib assumption for mac platform under the unix/ VM sources area. - Added a simple error-handler for the build step of compiling the output VM sources. - Renamed ensureDelegatedNamespace: to a &delegate: option to ensureNamespace:. - Refactored file-linking methods to symbolicLinkTo:/hardLinkTo:/linkTo:&static: which defaults to a symbolic link. - Changed command-line options -help/-version to getopt/gnu-compatible --help/--version. - Added John Leuner's State Replication Protocol code and tests. - Corrected the merged-version bugs from defining generateNewImages in different contexts. - Added File baseName method. - Tuple code fixes, renamed dot:/cross: to / and implemented thanks to Slava Pestov. - Time code fixes. - Added Method ifCompletes: to complement unlessCompletes:. - Fixed the Slate editing mode to highlight binary selectors with alphanumerics. - Fixed notifyThat:changed:to: in the observer code. - Separated image-generation from the build scripts into a new method generateNewImages. - Initial sketch of a port of Ruby rake, the build system. This does not work yet (it requires mod-time access for files for one). - Filled in POSIX file/directory control Slate wrappers. - Removed the once-potential platform primitive in favor of the working platform plugin. - Cleaned up the raw-SDL FFI setup signature code. - Added buildPlugin: as a convenience method for calling "make" on a Slate plugin's C sources. - Added a POSIX-API plugin, initially with file/directory manipulation support. - Added a loadPlugin: convenience wrapper for load: which encodes our plugin convention. - Added VM Definition compileOutput which calls "make". - Corrected Platform run: to return the correct return code to interpret as a success Boolean. - Added an ANSI time function plugin which is incredibly naive. - Documented caseOf:(otherwise:) in the reference manual. - Updated SmartConsole code using the Platform plugin. - Removed obsolescent outputSize parameter from the Segment representations. - Made the ncurses plugin optional in the main Makefile. - Bug-fixes for Directory newNamed: where the pathstring cannot be distinguished from a file locator specifier. - Fixed further File Locator issues. - Fixed File vs. Directory Locator readFrom: interaction. Slate-0.3.5: - 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 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. Slate-0.3.4: - Fixed Symbol intern calls so that it would not return an un-interned copy. - Added support for standalone Windows executable-building using MinGW with top-level Makefile support. - Fixed bit-rot in the BeOS build setup. - Changed print to perform a printOn: Console and altered existing print calls to the more appropriate underlying call, printString. - Added "help" messages for the context in the REPL and Debugger. - Added &mode: optional to File sessionDo:. - Added escaped/unescaped to Strings. - Added readFrom: for Strings and File Locators. - Added length method to Sequence (aliasing size). - Fixed upToAnyOf: for Streams. - Fixed off-by-one bugs in copyAfter:/copyAfterLast:/copyUpTo:/copyUpToLast:. - Fixed indexOfSubSeq: method and its kin. - Improved File Locator parsing and printing to automatically detect Windows- style path conventions and to parse drive letters as well as hostnames. - Added probablistic isPrime method to Integer. - Added atRandom to Integer (restricted in randomness by a deterministic seed). - Fixed parentheses-usage in source-printing. - Added `match:with: macro for dispatch on elements of a Sequence. - Added support for optional keywords in macros. - Factored delegation slots into maps to save space. - Much more efficient stack unwinding in the VM. - VM bug-fix for resending with optional keywords. - Added the FFI and most of the src/lib/ contents to the AutoLoad database and added a step in post-bootstrap to read it in. - Added an optional AutoLoad database to the bootstrap files list so that file parsing for auto-loading need be done only occasionally. The controller AutoLoader object is documented in the manual under "modules". - This loads Modules when any definition of the module is mentioned. The auto-loaders are method stubs that call the Module to load itself and then answer whatever the method should have answered once the Module has defined everything. - Rewrote the `>> and `withSlotsDo: macros to be more efficient. - Many bug fixes for macro expansion to ensure variables and closures are properly captured by the scopes they are embedded in. - Improved the debugger to allow inspection of lexical variables via arbitrary expressions in the method frame context. - Fleshed out the MR generation code and an x86 backend. - Added a macro `swapWith: for swapping values of variables local to a Method. - Renamed Number with: to of: for UnitValue creation. - Made named-Unit creation result in methods of that name/abbrev. to be defined as constructor messages on Number (e.g. "1 km"). - Aliased remove: as exclude: for NoDupicatesCollection. - Added Method signature and roleHolders as well as Symbol findRoleHoldersOn: and findSignatureOn: for finding the signature of a (named) Method. (these all take an &in: namespace parameter). - Added unlessCompletes: to complement ensure: for failure-only blocks. - Added Integer raisedTo:mod: to optimize (raisedTo:)mod:. - Added Integer inverseMod: to take the inverse modulus of a pair of numbers. - Added String plural which returns a pluralized form of the contents of the String considered as a noun. (Modulo English lexicon weirdness.) - Added String/Sequence methods concatenateAll:&separator: (alias ;*), toCamelCase, fromCamelCase, split (using whitespace default for optional &separators:), capitalize. - Added combinationsDo:, combinationsCollect:, combinationsSelect:, combinationsInject:into: to perform combinatorial iteration over Collections. - Added the `cache macro which takes an expression and expands into a setup where it is stored into a local variable in the given Method context, after which all occurrences of that expression in the same context is replaced with accessing that variable's value. So the expression is evaluated exactly once. `cacheAs: performs the same function, using a Symbol as the variable name and allowing it to be referred-to safely in pre-macroExpand'd source code. - Added currying features as <-, <-1, <-2, <-3, ... <-* messages which curry the N'th argument, (* for the last). Currying answers a new Method based on the argument that has one less argument and the missing argument being one filled in with the other value given. The bytecode compiler also has generation rules for it to be efficient. Slate-0.3.3: - Added addVariable&name: and addInputVariable&name: to generate default non-intersecting variable names (for macros that work on Methods). - Added implicit-context "here" method for Namespaces to return the current enclosing Namespace. - Fixed macroExpand to avoid circularity of `macroExpand (`() macroExpand works instead). - Added an optional &environment: parameter for all macros using the macroExpand mechanism. It answers the current surrounding Method. - Made the default printing for Syntax Nodes to be pretty-printing. - Added indexFirst and indexMiddle to Sequence for complete index-based start abstraction. - Fixed SmartConsole/SmartREPL to work across image saves, and added Ctrl-c handler to clear the line. Also, there are a number of cleanups. - Fixed FilterStream (stream select:) bugs. - Fixed startupActions handling so that individual errors would not cause skipping all remaining actions. - Added Float as: Fraction using continued fractions. - Added Stream traversal (Order) object types, and a TraversalStream which can do depth-first and breadth-first traversal and parametrizable specification of what constitutes an object's children. - Added GeneratorStream and generate:(until:) to allow arbitrary unfolding of objects as a Stream. - Added not-boolean checking and error-signalling to the VM for the bytecodes used for logical operations within bytecode methods. - Enabled Tab-completion for the SmartREPL. - Numerous general SDL binding improvements. - Added handling for SDL input events, with a demo Paint/Scribble application. - Added Image startup, shutdown, and save action hooks, using Dictionaries. - Improved ExtensibleArray handling, using makeGapAt: and other changes. - Added #implementations and #callers methods to Symbol to return methods implementing and calling given message selectors. &in: allows searching from a given Root object-as-namespace. - Added methodsNamed:, methodsNamed:at:, and methodsCalling: to all objects. - Added isAbstract to Method, checking for overrideThis. - Removed traitsless objects from the image and bootstrap, including the special but unused Raw Oddball. This also involved a type inference system cleanup, and removal of sendto:through: calls in root.slate. - Added commentTemplate to Root, ansering a simple explanation structure. - Added ArrayMD pretty-printing. - Added ArrayMD Streams, with a default row-major traversal order. - Improved addPrototype: further so that the existing traits object will be directly re-used if an existing prototype is found. This eliminates a previous difficulty in reloading library definitions where attribute types are defined in separate units. - Fixed the VM to not allocate an Array of negative size, instead using 0. - Added allSlotsDo:(withSeen:) to Root - recursively traverses slot values. - Improved sessionDo: so that open/close actions would not happen if already open. This allows for nesting calls. Also, sessionDo: now works on streams. - Renamed MapComposition to MapOverlay and the improved the Mapping code. - Improved File RelativeLocators parsing and printing. - Added FlattenedReadStream which allows the use of the flatten message to create a recursive traversal of all contained ReadStreams. - Added a common implementation basis ArrayBacked between ExtensibleSequence and ExtensibleArray so the other array-backed Sequence variants can re-use the same simple methods. - Refactored RingBuffer into Queue which is resizable and RingBuffer as derived version which overwrites the other end when full and adding. It also follows the Stack push/pop protocol. - Added REPL access via "repl", command result history, and hooks for extension. - Fixed a bug in bootstrapping where True and False were created as Oddball instances, not Boolean instances, confusing all Oddballs including Nil. - Added copyWithoutDuplicates to Collection using Set (in set.slate). - Bootstrapping was slightly cleaned up. pre/post-load.slate were renamed to pre/post-bootstrap.slate. - Renamed src/lib/ordered.slate to extensibleSeq.slate (fixes legacy name). - Added an &in: Namespace optional parameter to load: to allow "sandbox" installation of code. import:from: was also added to Namespace but probably needs more utilities for this functionality to be easy and useful. load:/requires:/provides: can also be called directly on any namespace. - Improved the quotation mechanism so that macros within `unquote nodes are expanded properly. - Added addPrototype:&parents: which makes the default parent Cloneable. - Fixed an addPrototype:derivedFrom: bug where re-running it on a type where = was redefined would cause an error trying to apply = to the traits. Now, == is used per parent. - Altered/fixed the semantics of `>> so that if the top-most method is not unary, the left-most argument is altered to use the cascade object as its implicit argument as necessary. - Extracted the Message type from MethodNotFound. - Began the incorporation of SDL UI backend code. - Added Directory current and enter/current: methods to get and set the current Slate Directory. This wraps existing primitives in directory.c. - Added Regex library based on Vassili Bykov's portable Smalltalk-80 version. - Added rotate/rotated methods to Sequence with a &step optional. Rotated is non-destructive. They "rotate" the elements around by the given amount. - Added equality (=) methods to Syntax Nodes to ease building pattern-matchers on source. - Added `commutatively which expands a method definition two with mirrored signatures of each other. - Moved license.txt to LICENSE. - Migrated repository to DARCS. Slate-0.3.2: - Added darcs repository test. - Added Method composition ** which works on any blocks or named methods, and any valid argument arity (not just 1-1 as with functional languages). See comments in src/lib/method.slate and the manual under Methods. - Added a macro-message `er for Symbol expressions, expanding into a literal block which takes the number of arguments the symbol supports as a selector and sending the message. (E.g. #= `er => [| :x1 :x2 | x1 = x2]) - Extended backtick (`) support so it can preface any expression and have the same effect as macro-sending `quote. (E.g. `4 = 4 `quote) - Abstract socket layer and BSD socket layer implemented as a plugin, including a select() interface. This still needs work and better tests. See src/lib/net/socket.slate, src/plugins/socket/, and the manual. - Destructive stable merge-sort added (Sequence destructiveStableSort(By:)). - Added a BUGS file to track long-term issues and a CREDITS file for attribution/blame. - Added radix-specification for Floats. E.g. the syntax 2r0.1 yields 0.5. - Added readFrom: for Numbers to read from strings or arbitrary streams, which checks for the parsed-value's type. - Added ExternalLibrary support for different calling conventions and accessing C structs with the help of CStruct, which is a ByteArray with member accessors generated from a Types C Structure definition. - Added a SmartREPL which provides command history and simple line-editing. - Added src/plugins directory and a SmartConsole plugin for console applications. - SkipList data aggregations were added with unit tests. - Windows (VC) builds were brought in sync with the Makefile conventions. - Makefile portability and robustness enhancements. - Fixed various bugs in ExtensibleArray and InsertionSequence. - Added a defaultElement selector to Sequences so they can vary on their underlying Array safely (removes bugs where Nils were inserted into Strings/ByteArrays). - Modified the parser to accomodate optimistic / interactive parsing. This may be toggled with interactiveMode/pasteMode at the REPL. - Added an ncurses plugin with cross-platform support. - Refactored traits to be composed in the traits window and only delegate to one parent. External derivation protocols are unchanged. - Augmented addDelegateNamed: with addDelegate:before: and addDelegate:after: to handle delegation precedence control to a slot name. - Visiting shared-behavior objects during lookup will no longer repeat; this avoids "Traits traits"-style leakage of behavior. It relies on a flag bit in an object's map being set from userland. - Overhauled delegation and traits organization to use traitsWindows to mediate / compose traits. - Renamed select: methods which preserve key-value mappings to mapSelect:. Sequence select: methods will now reposition / "compress" their results. - Added a stream-iteration protocol over all objects in the image, all delegating to a given one, and all referring to a given one. - Renamed addProtectedSlot:in:valued: to addDynamicSlot:valued:. - Added an ExternalLibrary library and primitives for interacting with external dynamically-linked libraries. Slate-0.3.1: - Fixed a serious bug that prevented the VM from properly handling message resends in nested blocks. - Added project: and project:into: idioms that allow one to easily project a collection of keys onto a method result and thus easily construct Mappings/Dictionaries. - Added `>> and `withSlotsDo: macros that allow "cascading" messages to objects and using their slots in a convenient way. - Fixed various Sequence bugs, involving hashes, sorting. The methods sort and sortBy: were renamed to destructiveSort(By:). - Added with:sessionDo: for easy pair-wise file operations. - Added user-land access to the map object along with a role introspection API in src/mobius/vm/interp/map.slate. - Fixed the Makefile so that building modified VM's with different names did not result in a broken image by re-using old header files. - Saving an image no longer requires shutdown. saveImageNamed: is now wrapped with Image save &name: where the name is stored persistently. This allows for further extension as well. - Added an exception handler specifically for printing errors under the REPL, to avoid resulting infinite recursions. - Added an internationalization framework under src/i18n/ with much left to be done, but basic UTF-8 encoding and decoding are provided with initial tests. - Added a library for object-paths in src/lib/path.slate with tests under tests/path.slate. - Optimized BigInteger printing using quoRem:. - Added define:using: to aid in making reloading of code reliable for basic cases. - Consolidated derive- methods into derive &mixins: &rejects:. - Fixed a VM bug where resends within method invocations with optional arguments would not pass the optionals on. - /\ and \/ overrides' blocks are now inlined. - Added inject:into: for streams. - Added an install-target to the Makefile. - and: and or: were renamed as overrides of /\ and \/, and core libraries and Mobius code were refactored to use them. Slate-0.3: - The bootstrap/ source tree has now become the main src/ tree, and the old Lisp bootstrapping code has been removed. - Many fixes to the C generator so that the C compiler can properly inline code. - Global selector caching was added to speed up dispatch. - Closures are now stack allocated if they do not contain any blocks or methods. - The VM and image are totally bootstrapped, and can generate themselves. - Portable file primitives were added. Image-saving in the VM was finished. - File protocols were refactored to support persistent re-opening of files and further separation of resource from stream logic in accordance with Flow. - Many many bugs were eliminated from the VM and garbage collector. In the process, the GC has become a mark-sweep-compact allocator with card-marking to objects only referred-to from the C stack. It also helps handle object- forwarding ("become" operations). - Assertions were added to Pidgin and the VM source to enable early detection of consistency errors. (assert: expr -> assert(expr);) - atEnd renamed to isAtEnd for streams. - Collection protocols were enhanced for Streams as much as possible, e.g. do:, collect:, select:, reject:. - A separate bootstrap/ source tree was made for VM-supported development. - A working VM and image were generated. Slate-0.2.3 aka Pre-Smalltalk Solutions 2004: - init.slate is now loaded by build.lisp, due to the refactoring of printing, so the initial Slate image now has the standard libraries already. - Printing was totally refactored out of Lisp into Slate. - Specialized method-caching was established for array access and slot access, as well as an optimization to cut short lookup when the first found method was provably the correct one. The overall speedup was several- to a dozen- fold due to these being key slow points previously. - Bytecode and object format changes were made to improve resulting space considerations for the image and its code. - VM source and header files are now producible, though not final or complete. - The pidgin C-generator is now debugged and usable. - value,value:,values:, etc. for invoking blocks on arguments have been renamed to do, applyWith:, applyTo:, for consistency with do: Slate-0.2.2: - addPrototype:derivedFrom: was modified to not replace the existing slot value if the new definition were the same as the old, as compared by delegations and their order. This makes it more robust to reload sources. Also, addPrototype: was added which just makes a Cloneable. - The evaluate interface was made less dependent upon ByteCompiler, and the compilation interface was refactored into a separate compileAndRun. - newWith: for descriptive errors was renamed to newDescription:. Also, a general breakOn: method was added to Method. - SUnit methods were made more robust and bugs were fixed. - The external stream interfaces were enhanced: File streams now perform in newOn: stringPathName the required file-opening in the appropriate mode. Also, signalling Exhaustion errors for external streams was fixed. - Compiler SyntaxNode and kin were refactored to Syntax Node. Other source files only related to Syntax were also moved into this namespace. - Number ceiling was added. - src/group.slate was added, which has a Grouping type and groupBy: constructor for collections. - Bugs in various collections methods and streams were eliminated. Notably: Dictionary, which now also has a unit-test suite. - The emacs mode was improved with better comments and corrected character syntax and highlighting for block headers and type annotations. C-h is also no longer treated as backspace. - Removed src/build-libs.slate. This mode of compiling files is deprecated. - An init.slate was created for the VM directory which loads the Slate-side relevant sources, including the self-hosted interpreter. - Method was refactored into LispMethod and abstract Method. - Work on Beziers, Quadratic, and other kinds of curves was added to the repository, already with basic functionality tested. - Fixed a bug preventing the use of optionals while debugMode is True (when the libraries are loaded) and for the Slate-hosted parser. Slate-0.2.1: - High Lisp compiler optimization settings were added to the interpreter's component files, so release speeds should be faster "out of the box". - File Stream's PositionableStream interface was corrected, via the fix to removeSlotNamed:. - The VM code was rounded out based on the new memory-management framework, and a couple of code groups were added for object utilities and native methods (primitives corresponding to a method). See src/mobius/vm/. - The object heap and GC code were adapted from Squeak, with refactorings just about everywhere, but there are still some design differences that need to be resolved to complete it. - The C translation code was rounded out and debugged a bit, but still very much a work in progress. - Shearing operations were added to the display transform library. - The Matrix libraries were filled out and tested on all basic operations. - Numerics were extended with sine/cosine primitives, and the DisplayTransforms can now perform rotations and such properly as a result. - Collection is no longer primitively-defined, and the array primitive bootstrapping was cleaned up. - Console was made a full ExternalResource. No user-visible changes were involved. - The File and File Locator code were refactored and bugs were fixed. Also, both File and Socket resource types were refactored from the primitive handle types to keep the library code independent from the implementation. - The X11 primitives were made usable, and connected to the X11 Port library. - src/namespace.slate was added to the standard libraries, and every file was refactored to use ensureNamespace: and ensureDelegatedNamespace: for Namespace setup. - A general debugging sweep was made on every Slate file, weeding out the fundamental bugs that prevented loading or caused poor interactions with other libraries. - Numeric operations were made more robust, sound, and generic, thanks to kirtai. Slate-0.2: - Condition-handling, restarts, and a basic interactive (non-REPL) debugger were added. See src/condition.slate and src/debugger.slate. - Method dispatch BUG fixed, where the delegate-traversal order was reversed for all but the most-recently-added delegate slot. - Subjective dispatch added, with two options: interleaved-dispatch Subjects or layered-dispatch "advisors" (Layers). Notes are provided in the manual. - deriveWith: BUG fixed. The new traits object was delegating to the given prototypes and not their traits objects. - addRolesFrom: was added to enhance mixin-style derivation. - Optional keyword message-sends are now implemented in the interpreter. - The streaming framework was refactored to support the ideas of the Squeak- related Flow framework by Craig Latta. - CLISP shell support added, hooked on Shell and Environment globals. - All methods in prims.lisp which were not needed initially or could be defined in terms of other primitives were moved to the standard libraries, notably src/root.slate. Methods included just for bootstrapping were annotated. - atSlot:, atSlot:put:, and removeSlot: were replaced with atSlotIndex:, atSlotIndex:put:, and removeSlotNamed: for clarity's sake about the argument (and for later Slot meta-object protocols). - The lexer/parser/IR-generator combination were combined in a stream-based Compiler interface, which loads the necessary libraries itself. - An addPrototype:derivedFrom: protocol was set up and the libraries refactored to use this more-automated method for setting up prototypes+traits. - A Slate-based inspector facility was introduced, a basic one that can be run just with the primitives, or a full one that makes use of other Slate libraries. Notes are on the Swiki and in the comments - both are one-page implementations: inspect.slate and src/inspect.slate - The Emacs mode was improved to support dynamic syntax-highlighting. Also a Slate workspace buffer setup was created. - A simple formatted printer was added in src/print.slate. - Buffer renamed to RingBuffer, and Read/WriteBufferStreams were finished. Slate-0.1: - An initial named release of Slate, with an included documented build procedure for producing stand-alone executables (and loadable binary libraries out of Slate sources). - Slate's implementation is still based upon Common Lisp, although it performs some compilation, so has acceptable performance for basic testing and evaluation. - The current libraries include file access, extensive collection and stream support, and many other basic libraries. - There is no support yet for concurrency or system event-handling. - The manual covers all language features and issues in sufficient detail now for beginners to grasp, and covers all libraries which are not subject to design changes. - The graphics / interface architecture is included in outline form, but is not yet functional. - The bootstrap process is incomplete, but in a presentable state so that you can see the intended run-time architecture and optimizations.