Planet Smalltalk

June 25, 2016

ESUG news - ESUG 2016, Innovation Technology Awards

ESUG 2016, 13th Innovation Technology Awards

Have you written innovative Smalltalk? The developers of any Smalltalk-based software can enter by submitting a 3-5min video of their software. Entrants demo their systems in a session at the end of Monday August 22, 2016, after which the conference attendees vote. (A vote consists in providing a sorted list of 3 preferred pieces of software.)

The top 3 teams with the most innovative software will receive, respectively, 500 Euros, 300 Euros and 200 Euros. The results are announced in the Awards ceremony that is held during the social event.

Applicants should provide the following information on the conference registration server. Once you have registered your personal info, an 'Awards' menu allows submitting your software. You can provide this information when you first register, or login again later and update your details.

Info to provide:

  • Name of the software
  • Licence information (free, shareware, or commercial)
  • Name of the Smalltalk dialect used
  • Name, Affiliation and Country of developers

Besides, it would be great if the submission could include:

  • URL for a video (3-5 min) showing a screencast / demo of the software
  • URL for downloading the software or at least a runnable demo
  • Deadline: August 21, 2016

Any Smalltalker can apply (students, companies, ...). The presented piece of code/software should be written in Smalltalk or directly support Smalltalk (e.g. Smalltalk VM). All Smalltalk dialects are accepted. The applicant should be "strongly related" to the presented code, be it as an author, as owner of the copyright/copyleft, or as an official representative of the copyright/copyleft owner.

Jordi Delgado - ESUG 2016 Innovation Technology Awards

ESUG 2016, 13th Innovation Technology Awards

Have you written innovative Smalltalk? The developers of any Smalltalk-based software can enter by submitting a 3-5min video of their software. Entrants demo their systems in a session at the end of Monday August 22, 2016, after which the conference attendees vote. (A vote consists in providing a sorted list of 3 preferred pieces of software.)

The top 3 teams with the most innovative software will receive, respectively, 500 Euros, 300 Euros and 200 Euros. The results are announced in the Awards ceremony that is held during the social event.

Applicants should provide the following information on the conference registration server. Once you have registered your personal info, an 'Awards' menu allows submitting your software. You can provide this information when you first register, or login again later and update your details.

Info to provide:

Besides, it would be great if the submission could include:

Any Smalltalker can apply (students, companies, ...). The presented piece of code/software should be written in Smalltalk or directly support Smalltalk (e.g. Smalltalk VM). All Smalltalk dialects are accepted. The applicant should be "strongly related" to the presented code, be it as an author, as owner of the copyright/copyleft, or as an official representative of the copyright/copyleft owner.

June 24, 2016

Torsten Bergmann - Walls, Pillars and Beams: A 3D Decomposition of Quality Anomalies

A video demonstration of a 3D approach (in Pharo) from the paper with the same title.

Torsten Bergmann - Functional callbacks on all Cog platforms

Pharo as well as Squeak are based on a common virtual machine implementation (Squeak VM, later Cog). This virtual machine source code recently was moved over to GitHub as OpenSmalltalk VM to better maintain the (small but existing) differences in the virtual machines for Squeak, Pharo, Newspeak and Cuis Smalltalk.

Within all open source Smalltalks derived from Squeak (Squeak, Pharo, Newspeak) historically and initially there was a mechanisms to call external code outside the Smalltalk environment. This mechanism was called FFI - which is the abbreviation for foreign function interface. So you could call external libraries to perform an action.

Later there was another mechanism called Alien FFI that also allowed to pass a callback function to the ouside world. Alien was provided in 2007 by Eliot Miranda and old docu could be found here and here.

In Pharo later there was another mechanism called "NativeBoost" (provided by Igor Stasenko) to call external functions. NB allowed to be using native code directly and really fast as the native code was attached to a compiled method and lived within the image. Relying on assembler (provided by a package called ASMJit) the NativeBoost solution is very fast - but also hard to maintain because NB was not as portable as the initial FFI solutions.

Later Pharo decided to resynch all these efforts into what is now known as UFFI (Unified Foreign Function Interface) provided by Esteban Lorenzano. UFFI unifies and also borrows from FFI, Alien and even NativeBoost.

Also with the more aligned OpenSmalltalk VM the different open source Smalltalks come closer together. Current work in progress on the virtual machine side is to allow for 64 bit Smalltalk systems and to better support ARM architecture beside x86 one.

Eliot now announced that Alien now has functional callbacks on all x86 platforms, ARM32 platforms and x86_64 platforms. This is another major step in having a portable interface to the outside world as we can use callbacks on all these platforms. Great stuff!!!

June 23, 2016

Torsten Bergmann - CuboidMatrix: Exploring Dynamic Structural Connections in Software Components using Space-Time Cube

A demonstration video of the VISSOFT paper by Teseo Schneider, Yuriy Tymchuk, Ronie Salgado and Alexandre Bergel. Done in Pharo.

Pharo Weekly - Functional callbacks on all Cog platforms

Hi All,

just wanted to report that as of Alien-eem.35 and we now have functional callbacks on all x86 platforms, ARM32 platforms and x86_64 platforms.

There’s a simple example Alien class>>exampleCqsort that shows how to use the system and tests the implementation using the C library’s sort quick sort implementation that takes a function pointer as an argument to use for comparing pairs of elements.  This is mapped onto a Smalltalk block by Alien’s callback implementation.  The example sorts 100 random double-precision floats using qsort and a callback into Smalltalk.

Pharo Weekly - New version of Interactive Fiction Framework

New version of Interactive Fiction Framework

I think it is mature enough to be used, but of course there might be some
rough edges.

Contributors, users and testers would be very welcome!


June 22, 2016

Cincom Smalltalk - Smalltalk Digest: June Edition

The June edition of The Cincom Smalltalk Digest is available now.

June 21, 2016

Torsten Bergmann - SmallWorlds for Pharo

Interactive Fiction framework in Smalltalk is released. Read more

June 20, 2016

Torsten Bergmann - Talking Small

Another newbee is discovering Smalltalk. Looks like he tries to learn a language each month and also stumbled over Pharo.

If he really wants to learn Smalltalk and find out more he for sure will need more time than just a simple month. Initial steps in Smalltalk are easy, also syntax is easy to learn - but learning what power it contains requires more time and a deeper understanding. Also it takes a while to understand why things are the way they are. Often learning to deal with pure OO also means to unlearn (bad) things from the mainstream programming languages...

Nonetheless nice summary of his early steps.

Torsten Bergmann - LRP - Live Robot Programming in Pharo

How does a PR2 move through a door opening? By using LRP of course! Live Robot Programming (LRP) is a live programming language designed for the creation of the behavior layer of robots. It is implemented in Pharo.

June 19, 2016

Pharo Weekly - Continuous improvements: the agile way

18520 EyeTreeInspector is broken

18527 #halt should not be in the badSelectors rule

18525 fix for IconStyler
18524 Add Icon Styler for haltOnce and haltOnCount:

18496 duplicate shortcut usage for window close and tab close

18514 ConfigurationOfEpicea not in sync with Pharo

18511 DNU MorphicDiffAdapter keyStroke:fromMorph:
18517 ConfigurationOfVersionner needs update to be in sync with Pharo

18522 Add icon styler for “self halt”

18518 ConfigurationOfCatalog needs update to be in sync with Pharo

18513 NEC fails to guess the type of non-class bindings

18521 Add manifest for Random-Core

18512 cleanup related to deprecations

18509 per send-site #haltOnCount:

18507 add #deprecated:transformWith: (automatic rewrites of deprecated sends)
18477 QualityAssistant v3.0.5

15849 Remove NewList

18282 Scrollbar doesnt move when scrollValue is set in TextModel

18501 icons -> icons iconNamed: (part 2)

18497 EncoderForSistaV1: last integration to be usable.

18484 instance variable refactoring without instance variables

18489 remove more old deprecated methods

18488 remove “recover lost changes…”

18486 remove some methods deprecated in Pharo 5
18492 safer access to charset

15085 non-english character input

18485 TabsExample broken (icon access)

18490 Configuration of TxText needs update stable version
18470 EncoderForSistaV1 update

18480 remove MCMockRPackage

18479 Process termination trick for Semaphore critical method should be refactored to be reusable for other lock objects

18481 Better #haltOnce: per haltOnce state, auto-enable

18332 ClassRefs menu items should be moved at the same level than analyze

18478 “Instance variables defined in all subclasses” rule not clear
18448 Rubric: “Do not use #ifNotNilDo:ifNil:, #ifNil:ifNotNilDo:, #ifNotNilDo:”

18468 Use readOnlyQueue when reading source files
18474 move var to class refactoring broken II

18476 update Versionner to 2.13.15

18072 TxModel >>#applyAttribute:to: sends unimplemented message

18473 move var to class refactoring broken

18475 Do not announce method creation if the class is anonymous

June 18, 2016

Göran Krampe - Fowltalk - a new Smalltalk

In my quest making Spry I also learned about other efforts in the Nim community to construct Smalltalk-like dynamic languages. The most ambitious one may be Fowltalk by "fowl" who typically hangs out in the #nim channel on Freenode. Fowltalk started out written in Nim but since fowl wanted to learn more C++ it's now written in C++17.

At the moment he is rewriting the parser and code generator parts in the language itself, following a similar bootstrapping style as Ian Piumarta's idst. For example, here is the method parsing keyword messages.

At the moment Fowltalk is nowhere near usefulness but its fun stuff!

It's interesting to look at these bootstrap* files - we can immediately notice some syntactic differences to Smalltalk-80:

Block arguments are written like [| :x :y | ... ] and you can mix both locals and params there: [| :aParam aLocalHasNoColon | ... ]. Instinctively I can agree with the combination, but I would probably then make the first | optional.

Some messages have been changed, like ifTrue:ifFalse: is instead ifTrue:else:. I have done similar simplifications in Spry. And just like in Spry ivars are referenced using @myIvar.

There isn't any documentation on Fowltalk yet, but it's clearly a rather elaborate implementation. It compiles to bytecodes, uses numbered primitives (I think) and there is an image mechanism.

It was also quite easy to get the REPL up and running, but just as with Spry, it's hard to know how to use it! On Ubuntu I installed boost sudo apt-get install libboost1.58-dev and then it was easy to get it running following the instructions, as long as you change to

The image constructed by the bootstrap process is 67Mb in size. Then we can do the canonical Smalltalk test in the REPL:

``` bash gokr@yoda:~/fowltalk/idk$ ./bin/oop -i oop.img --mmap --repl

(3 + 4) print 7

!quit gokr@yoda:~/fowltalk/idk$ ```

Fowl mentioned that the new parser can be loaded using !read bootstrap.1 but... at the moment that causes errors.

It will be interesting to see where this goes! Fowltalk is very early in its evolution, and it's not a JIT, but it's a real bytecode VM with an image and we can never have enough Smalltalk-like languages! :)

Pharo Weekly - Updated Pharo Launcher


I just updated Pharo Launcher. A new version 0.2.11 is available.
Here are the change log:
  • move Pharo Launcher to the latest stable pharo image: pharo 5.0. It implies That Pharo Launcher is now shipped with Spur VM.
  • allow an easy download of the new beta image: pharo 6.0
  • the Launcher now comes with 2 VMs:
    • Spur VM (pharo 5.0 and Pharo 6.0)
    • Non-Spur VM (to be able to run old images)
  • the Launcher is now shipped with a default template that is the current default Pharo image. It can be found in local templates.
  • there is a new OS bundle for linux: we now ship more files with the launcher and it was needed to have a bundle.
  • update of the default name propose when you create an image from a template: the default name will be the project name.

Self Blogs - Improvement proposals

I would like to spur discussion about structure of the project and also about the community, its organization and knowledge bases. I believe that this discussion is really important for the future of Self development.

Self is open source, which is important, but not sufficient condition to thrive. Open source success is only partially given by the license, but more importantly by the community of people around projects. In the end, it is the people what makes all the difference.

Self has somehow sleeping community, which I think is partially because we don’t have good tools for communication and self-organization.

Here is what I think that would be useful:

Official Github organization

Github allows to create „organizations“, which is used to group multiple projects under one „official“ entity.

Current state of Self on Github is confusing, especially for newcomers. From what I understand, „official“ repository is the one in Russel Allen’s personal account, but there is no „THIS IS OFFICIAL REPOSITORY, CONTRIBUTE HERE“ sign. People have to figure this on their own and hope that they didn’t figure it wrong.

I would also recommend to split the Self repository into several smaller, single-purpose-oriented repositories. For example: separate the handbook, and maybe application directory (git can do this without the loss of history).

It would be probably good idea to decide if we want to allow anyone to access this „organization“ and to let anyone add their own application repositories. This would simplify the discovery of available Self software. Other possibility is to use it only for „official“ stuff and „syndicate“ Self packages somewhere else (wiki or package repository).

Talking to the people

We need to start to talk to the people. This is a problem that all smaller projects have; there is too much context in your head (this is relevant to the bus factor from previous blog).

The „THIS IS OFFICIAL REPOSITORY, CONTRIBUTE HERE“ sign is the classical example of the context that everyone from the mail-list have. It was posted few times into Self conference, but for anyone coming outside the Self community, this is really hard to figure. You have to talk to people, or they won’t know.

The Self wiki is another example of this problem. There is no sign that there actually is a wiki. [CENSORED (see discussion in mail conference, search keyword drama)]

If you want something from the people (eg. contribution), you have to tell them. They are not mindreaders and they won’t engage without knowing that it is ok to engage.

For example, I pushed a lot of typo and RST formatting fixes to the Self Handbook / Russel Allen’s git repository and I felt really uneasy doing this. Is it okay to contribute? Is it okay to make changes in someone else’s work?

Community WIKI

15.12.2010, 09:55 Thorsten Dittmar written:
hello folks,

for me self is still one of the most beautiful languages I know, but the lib's are not so shapelily. So we have a kind of an Ugly Duckling here... a lady with amazing intrinsic values and horrible "lips"... 

Of course, we can start with some cosmetics.. We can change the UI and other stuff, but for me that doesn't look like the right way... Self has so many unfinished stuff, that I guess we will not make it better to open another bottle.

What is „unfinished stuff“? What is the state of Self? Where is the FAQ? Where is the screenshot section? Where is community knowledge base? Where is documentation? Where is the detailed description of VM? Where do you collect information?

Currently, only way to get a clear idea about Self and its state is to read the mail archive and the 115 thousands lines of C++ sources. Mail archive is the worst possible database for this kind of stuff. Not only that history is not easily accessible for newcomers, it also cannot be edited and improved. Also attachments don’t work much.

We need good community Wiki, where we can:

  • collect information about Self
  • document the VM
  • document aspects of programming in Self
    • It is really hard to find any source code to study. There are applications in Self’s git repository, but it took me 6 months to notice. Again, there is no signs pointing to this.
  • discuss various stuff about Self, ideas, improvements, highlights and so on
  • document what is in bad shape, what needs to be done and plan future work
  • provide user’s sections
    • Something like a blog, but for all kinds of data, files, snippets and information related to Self, that user’s may save for benefit of themselves and others.
    • This need to be under user’s control.
  • have user profiles – some small section, where you may shortly introduce yourself and maybe tell others what you do
    • It is hard to tell who is working on the Self and what are they doing. Again – this is context information which are not available.
  • collect list of links to all relevant Self information sources
    • I am willing to do this and maintain this section.
  • collect list of links to Self alternative interpreters and inspired languages
    • I partially did this in previous blog.
  • tell people how to contribute, where to contribute and other community information
    • Viz „Talking to the people“.

Wiki is important part of the plan to increase the Self’s bus factor (see previous blog). It also helps people (newcomers especially) to put themselves into perspective of what Self is, how to interact with community and how to contribute.

I am willing to be maintainer of this Wiki. I don’t really want to, but I have strong feeling, that if I am not going to do it, nobody will.

Github wiki

I don’t think it is a good idea to use this specific wiki software, because to me, it looks like it is seriously limited in capabilities.

I like, that it uses the Git for synchronization, but I feel, that we will need something more advanced. Something that will be able to host large variety of content, categories and discussions. When I think about it, I see it like the hybrid between the c2 wiki and Wikipedia.

I don’t expect anyone to come with clear solutions, but I think that we need to talk about this and look at alternatives. What do you think?

Package repository

One of the services, which I think is critical for success of any language is the package repository and package manager.

I am not that sure how easily this may be done for Self, but I am 100% sure, that this is necessary for larger adoption;

We need to give people the tool, which will allow them to build applications on top of other people libraries. Not just that – also the place where we can discover new libraries and projects, instead of having them scattered all over the Internet.

I have a lot of experiences with Python and believe me when I say, that this is big win for the language and big reason to use it.

Community decision

I know, that Self was a research language, and partially probably still is. I will impersonate the Generic Beginner* and speak using his voice, when I say:

I think that after 26 years, it is time to make up your mind. How do you perceive Self? What is it to you? Do you take Self seriously, or is this just a game?

I can’t build a product on Self in its current state. I can’t afford to wait decades for improvements. I need to know, whether I can count on you (the community).

I may put my time and/or resources into Self, but I need to know that I won’t be wasting my time, and that I am not alone.

I want to know your opinion. It may be clear in your head, but again – if you don’t talk to the people, they won’t know.

For me,


What about you?

*Not necessarily my opinion, but I think it comes to mind of all newcomers looking at Self and thinking „hey, this looks nice, should I use it?“

June 17, 2016

Pharo Weekly - Automatic Deprecation Refactoring


I have dusted off and improved the automatic refactoring of deprecations.

- when the refactoring engine is not present, it falls back to a standard deprecation
- It does not introduce any dependencies (can just be in the Kernel, the only cost is one method of 10 lines).
- It sets the author so it does not require initials
- It refactors *only* the sending (offending, deprecated) send site. So a second selector that is identical (which might be a different method and not deprecated) will not be affected.

The way to use it is this:

ifNotNilDo: aBlock
        deprecated: 'Please use #ifNotNil: instead'
        transformWith: '`@receiver ifNotNilDo: `@statements' -> '`@receiver ifNotNil: `@statements'.
    ^ aBlock ifNotNil: aBlock

As we try to provide already Lint rules for deprecations (or at least should have..) the amount of additional work is not much.

This is the full implementation:

deprecated: anExplanationString transformWith: aRule
    | rewriteRule method context node |
    context := thisContext sender sender.
    (Smalltalk globals hasClassNamed: #RBParseTreeRewriter) 
        ifFalse: [ ^self deprecated: anExplanationString ].
    method := context method.
    node := context sourceNodeExecuted.
    rewriteRule := (Smalltalk globals classNamed: #RBParseTreeRewriter) new replace: aRule key with: aRule value.
    (rewriteRule executeTree: node)
        ifFalse: [ ^ self ].
    node replaceWith: rewriteRule tree. 
        useAuthor: 'AutoDeprecationRefactoring'
        during: [method methodClass compile: method ast formattedCode classified: method protocol]

This is *with intention* the absolute “simplest thing that can possibly work”. There is no interactive tool to preview refactoring in interactive
mode, or some way to opt in or out. 

The power of things like this comes from actually using them, not from being perfect...


June 16, 2016

Torsten Bergmann - Pharo and 3D

The nice work of Ronie Salgado with Pharo and 3 summarized on his page. Nice!

Torsten Bergmann - Voyage with Unqlite support

For relational databases there is the tiny SQLite database solution that just requires a simple linked library (DLL/SO file) including the full database engine.

There is a similar tiny database called Unqlite in the NoSQL world. Pharo already had a Unqlite binding in the past. Before Pharo 5 this "PUnqlite" project was based on Native Boost. It was provided by Masashi Umezawa and I extended the project with a spec based UI to provide a database browser for Unqlite.

During the Pharo 5 development I discussed with Esteban many issues on #Slack about porting several of my projects to UFFI. We also discusssed about Unqlite and Esteban quickly ported the PUnqlite binding over from NB to UFFI. This was done on GitHub. Additionally I remigrated the changes back to the original repo of PUnqlite on STHub and made it loadable from Catalog in Pharo 5 again. So with Pharo 5 you again have a package "PUnqlite" that you can load from Catalog. Just open Spotter and type in the name.

During these #Slack sessions we also discussed about Estebans Voyage framework. Voyage is a layer that allows for very simple persistence in Pharo. It is explained here and here.

So far Voyage only worked with MongoDB as backend. Often Mongo requires some setup which might be overkill for simple deployable applications that you want to build with Pharo. So we also discussed about using UnQlite as a backend for Voyage.

Esteban wanted to work on this for a project and now first results are available: Voyage is now restructured with a second backend to support also UnQlite beside MongoDB.

Cool - thanks Esteban!

Torsten Bergmann - More than 15 arguments

support is on its way. But I guess if you have need more than 15 arguments in a method you should think about your design. Possibly an argument object would be applicable.

June 15, 2016

Pharo Weekly - Nicer haltOnce


Yesterday we improved #haltOnce to be more like a “once” BreakPoint:

	-> state per *each* haltOnce send
		(this means you can put two in one method and they are independent)
	-> when putting a haltOnce, it is enabled by default
	-> The global menu entry just resets all haltOnce to be active again.

Interesting is how trivial this was to implement… in class Halt 
    | node |
    node := thisContext sender sender sourceNodeExecuted.
    (node hasProperty: #haltOnce) ifTrue: [^self]. 
    node propertyAt: #haltOnce put: true.
    ^ self signal.

This means, we get the AST node of the “haltOnce” message send. Then we put an annotation there.
To reset all (enable all), the global many just does:

	#haltOnce senders do: #recompile.


This will be in 60082.


Cincom Smalltalk - Cincom® ObjectStudio® 8.7.1 and Cincom® VisualWorks®8.1.1 Are Here!

It is our pleasure to bring you the Personal Use License (PUL) version of Cincom Smalltalk™. This PUL release includes the maintenance releases of Cincom ObjectStudio 8.7.1 andCincom VisualWorks 8.1.1.

Self Blogs - Lessons learnt from the Self archive

I’ve spent 26 days reading 26 years of messages from the Self mail conference archive. Here is what I’ve learned. Please note, that everything is highly subjective and may be even wrong.

Interesting messages

If you don’t want to go through all 4334 messages of whole archive, you may read just this dataset, which contains only 295 messages I’ve found interesting enough to save into separate directory. I’ve saved each message because it answered some of the questions I had, or because it was marking important milestone in Self development.

List of alternative languages / interpreters

When I’ve got to year 2004, I’ve realized it may be valuable also to store list of alternative interpreters and languages, which were sent to the conference, so I’ve began to collect them too. When I finished the reading, I’ve spent an hour by scanning the 1990-2004 timeframe, but I’ve maybe skipped something.

Just to give you the idea, here is the reduced list of topics (there is more in the archive):

  • tinySelf progress report
  • JSelf Home Page
  • Announcing OpenSelf
  • A Self _ BETA Language Hybrid Project
  • premature announcement: SELFISH
  • Brain language
  • SELF for VisualWorks 5i
  • dSelf
  • New release of Cel
  • Self_R not started yet
  • Io
  • Zero, a programming system
  • [ANN] Slate 0.3 Released!
  • Re: Self for Squeak
  • Klein open-source release
  • Self-style outliners for Javascript
  • Phos
  • Anyone have a copy of Kevo?
  • Re: Distributed Objects
  • Re: UnitTests
  • AmbientTalk
  • Self in Javascript progress
  • Re: Self in Javascript progress
  • Re: goals (was: dynamic deoptimization)
  • Pooi: A prototypical object-oriented interpreter
  • Avacado: JavaScript trying to be more like Self
  • BOS1.2 release — play it again, sam
  • Smalltalk interpreter of Self

Everything is dead, or dying

Self is small project maintained, discussed and used by only handful of people over two and half decades (one generation). It is slow game, and changes may take years (new releases), or decades (porting to new systems). This leads to massive link rot.

It may not be evident if you are just participating from time to time, but when you look into archive, it is a clear trend. Only a few people were able to keep attention and interest over the decades and maintain resources they created. There were a lot of those who lost interest or just didn’t have the time and their resources are dead.

Beginning of the Self conference archive is in 1990, which was a few years before the HTML and HTTP was invented.

I have no idea, how people organized work and thoughts in groups at that time (text files via FTP maybe? telephone and paper notepads?), but it is either converted to a few existing HTML resources, or (most likely) dead. You won’t see the design decisions, discussions or thoughts from that time.

Then HTML and HTTP came. People were excited about this new protocol:

From Sat, 19 Mar 1994 11:53:23 PST:

Thanks mostly to Bay-Wie Chang, Self now has a Mosaic home page,

All of our material continues to be available via ftp, but the Mosaic
interface is definitively friendlier (e.g., it has an online
bibliography and paper abstracts).



It was definitely an improvement. But idea to create articles and webpages about Self and put them on your web lead to massive resource fragmentation. I am not criticizing, merely pointing to a fact, that almost every link from that time is dead, because it was not maintained in long-term and that whole situation is actually unmaintainable by one person, even if that person really wanted to maintain it. That url in the email is by the way – dead.

When you think about it, almost every time anyone counted on third-party service, it didn’t pay off. From that point of view, everything is dying, we just don’t see it, because it still exists. But for the future newcomer to Self, it is already dead.

If you think in the time-frame of decades, all providers of services will end, often without replacement. Look at geocities for example. Once it was hosting for hundreds of thousands of webs. Now it is dead. Sourceforge killed itself by adding adware to user’s packages, and Yahoo is slowly dying and it is only matter of time until someone will buy it and shut down most of its services for good, because it is not profitable. University pages are chapter for itself, because almost all of them are dead soon after the person who created them leaves the university.

Even if the webarchive or other web cache archives the original, this is not the long time solution. There are various copyright attack in place right now, which may cause such services to close.

This may not look like a big issue, but for newcomers, this means that half of the valuable resources is not available.

If you look at what survives, it is almost always only files which were downloadable and thus shared by large number of people. In this sense, git is the best solution, because it allows everyone to clone the repository and synchronize it with others, even if the original resource is gone.

There is two possible options on how to overcome this problem:

  • distributed standalone information resources shared by everyone
  • maintained centralized group resources

If you create your own webpages, make them easily downloadable and sharable. Otherwise, they will be dead soon (5-20 years from now). Other option is to write articles in postscript / PDF and generally standalone files, which will be distributed to large number of people.

Second option is to make central repository of knowledge consciously maintained and hosted over the years by Self community at one place. Preferably in the form of Wiki. I will get back to this later.

Honorable mentions

FTP that refused to die

Date: Fri, 25 Aug 1995 12:45:08 +0200
From: (Rainer Blome)
Subject: non-official ftp site in germany (solaris only)

The link speed to Sun was really not acceptable when I tried it, so I was
glad to be able to get Self from Manchester.  Seems that I have been lucky
now that the site is down.  The FTP admin of our local computing centre was
so kind as to put Self 4.0 on his server.  It is not official and may
vanish any time, but they have lots of disk space and I suppose it won't.
Still, please don't use this site unless it is a lot faster than your link
to the USA.

Since the stuff is the one that I used to install Self here,
it doesn't look exactly like the original (all files have the Self-4.0
prefix) and it is not complete (I only installed the solaris version).

  total 12110
  -rw-rw-r--   1 emoenke         1475 Jul 26 17:05 Self-4.0.Install
  -rw-rw-r--   1 emoenke         1933 Jul 26 17:04 Self-4.0.LICENSE
  -rw-rw-r--   1 emoenke         1087 Jul 26 17:05 Self-4.0.README
  -rw-rw-r--   1 emoenke        71809 Jul 26 17:05
  -rw-rw-r--   1 emoenke     12320062 Jul 26 14:16 Self-4.0.solaris.tar.gz

Also, the tar file is gzipped instead of compressed.  Not having patched
the install script, it won't work anymore (unless you linked zcat to
gzcat), but what Install actually did was just a single line anyway:

gzip -cd Self-4.0.solaris.tar.gz | tar -xfpB -

Greetings, Rainer

The FTP is still there, but sadly the Self directory isn’t.


Jecel Mattos de Assumpcao Jr is my new personal hero.

Not only that still works and didn’t lose any of its contents, also his messages on various topics in the conference were really great and it was pleasure to read it.

Self is really complex

There is 114 821 cloc lines of C++ code (counted without comments, blank lines and so on). There is two kind of compilers (NIC, SIC), assembler and other platform-dependent stuff. Almost none of it is documented outside the code itself.

This is bad. Really bad. I did a little bit of C++ back in high school, but I can’t really imagine going through all this code and trying to make sense of it.

It is extremely hard to get an idea what Self really is, what parts is it made from. Best thing documenting how Self works is this schema from the handbook:


We need pictures like this that will document components of the VM. Schematic blueprints for what Self is and how it approximately works. Sometimes, pictures says more than a thousand words.

If you don’t think that this is serious, here is a list of reasons:

  • It is hard for beginners to even get the idea what Self is. We know, that it is a language, but it is also virtual machine, bunch of compilers, memory managers and what not. It is almost like small operating system.
  • It is hard for anyone who wants to contribute to get an idea where to do the change.
  • It is hard for anyone who wants to port the Self to another architecture / OS.
  • It leads to fragmentation. People rather create own forks, or whole new languages rather than to try to make sense in so much C++ code.


An example of the complexity of Self was its porting to Linux. First message about porting to Linux was probably this:

From Tue, 18 Aug 92 11:04:58 PDT
From: (Dirk Steinberg)
Date: Tue, 18 Aug 92 11:04:58 PDT
Message-ID: <>
MIME-Version: 1.0
Content-Type: text/plain


I have recently read about Self and ftp'd some papers from,
I even got the sun4 version of Self 2.0 and played around with it for a few
minutes. Otherwise, I have no experience with Self whatsoever, but from what
I read I am kand of enthusiastic.

My question: Is anyone porting Self to some other platform, maybe even to the
386? I have Linux running on a 486/33 w/ 16 Meg RAM and 500 Meg HD, which should
be a workable system for Self; I have gcc-2.2.2 and libg++-2.2, so it should be 
possible to compile the virtual machine (judging from the README's).
BUT: I have the feeling that the compiler really generates native SPARC code and
so one would have to write a completely new backend and assembler for the 386.
I guess that would be a *major* project!?? Is the compiler/assembler written in Self
or C++? If Self is tied to the SPARC achitecure and inherently non=portable, then
that would nagatively influence the impact that this exciting software could have.

How about using the gcc backend?

Thanks for any info,


Dirk Steinberg

This is from 1992. First (not fully ported) Self for Linux came in 1999, by Gordon Cichon, but that wasn’t really much usable, from what I’ve read. Proper support with GUI and everything working nicely took several more years.

The bus factor is low

As the wikipedia says:

.. the bus factor is a measurement of the concentration of information in individual team members. It .. connotes the number of team members that can be unexpectedly lost from a project (“hit by a bus”, as it were) before the project collapses due to lack of knowledgeable or competent personnel.

The bus factor of Self is incredibly low. From my own estimate based on reading the archive, I would say it is 5, maybe 7 if you want to be optimistic, probably 3 if you want to be pessimistic.

This is not just bad, because it threatens existence of Self alone, but mostly because it also means that there is extremely low number of people, who really understand Self, and almost no documentation, which can train new experts.

Wikipedia offers following solution to increase the bus factor:

Several ways to increase the bus factor (thus making the project more resilient) have been proposed:

  • Reduce complexity
  • Document all processes and keep that documentation up-to-date
  • Encourage cross-training.

I don’t think, that there is much space for reducing the complexity, but second and third point may be solvable by community Wiki.

YWAM KnowledgeBase also mentions two more interesting points:

  • maintaining documentation about how the corresponding website is working
  • forum for learning from each other

Again, both points may be solved by community Wiki. Especially the second point is really important.

Collected resources

I’ve collected following links, which are not yet dead, or were archived by webarchive. I didn’t yet have time to go over them, so I am sharing them as I added them to my todolist:

  17. This file, when read into the initial Self system (empty world) creates just the objects needed to run a simple program that prints a table of factorials up to 49! and then stops.
  56. tinyRick tinySelf

Next blog will contain some improvement proposals.

Self Blogs - Experimental stream framework for Self

I have long maintained that Self is the finest Yak shaving system in existence. Everything is possible and nothing is finished:)

So I was playing with building a website front end for the mailing list archives, which led me to improving the Self web server, which led me to making a new experimental stream framework for Self. This also led me to some interesting ideas on automatically checking for methods which should be present in an object but aren’t, but I’ll write about that later!

Self already has a readStream and writeStream prototypes, which are very basic entities modelled largely on Smalltalk-80. They’re mainly used in the context reading and writing to files and sockets.

What I’ve put together is a quick stream framework for putting together pipelines of filters etc and streaming objects through them. The general aim is to avoid the technical and conceptual overhead of copying collections multiple times as you handle them.

This isn’t particularly groundbreaking, lots of other languages do this sort of thing. I’d like to hear suggestions on how to make what I’ve done more elegant and Self-ish.

The code is at

Basically, streams are entities which understand either readIfFail: or write:IfFail:. Streams can only be read or write.

Flow streams are composable, which means you can link them in a chain with pipeable connectors.

The relevant parts are in the global object ‘flow’.

This isn’t optimised at all – ideally streams should cheat by copying larger chunks behind the scenes where appropriate for performance. Also file streams probably need to be more aware of reading and writing chunks with internal buffers, and string writing should be optimised to reduce copying!

Possible improvements include adding spitting and merging pipes, specific buffering pipes etc.

Using flow streams is a two or three step process:

1 Build structure.

| myPipeline |

      'This is a bit of text for us to play with' reading 
   |= (flow pipeable map copyOn: [|:c| c capitalize])
   |= (flow pipeable filter copyOn: [|:c| c isVowel])
   |= (flow pipeable gather copyOn: [|:c| (c & c) asList])
   |= flow writable string copy. 

2 Put pipeline into action

myPipeline flush.

3 (Optionally) convert your stream into something else

[myPipeline contents = 'IIIIAAIIOOEEOOUUOOAAII'] assert.

And that’s about it. I’ll play with this some more, any suggestions?

Smalltalk Jobs - Smalltalk Job at Cincom – 6/14/16

Cincom is still looking to fill an open position in North America on the Smalltalk team. Please see the previous blog post for more details, and you can also contact Suzanne Fortman directly.

Filed under: Employment