The History of J LocalesIn case you are wondering, here is an overview how names and name scopes evolved in the history of J, up to locales as we have them now (2015) since quite some time. It is compiled from Roger's fine status.txt summary file and later Release notes, supplanted by the Dictinaries from those times (or at least time frame -- my DoJ library is well stocked but has one or two holes).
- J Version 2.0, 1990 08 09 (APL90 Version)
We start out with local and global names, as assigned though =. and =:, where the distinction only matters within Explicit Definitions -- just as today.
Under_scor_es in identifiers are allowed but have no special meaning.
There are no locatives or locales. Everything happens in the same, one and only name space which will eventually be referred to as "base locale". At this point, J does not have any standard utility functions distributed with the interpreter, so the base locale starts out absolutely clean unless you have some larger profile made on your own.
It is noteworthy that, at this early time, J uses both modern-style script files (with J source code) and classic APL-style "workspaces", i.e. binary dumps of all or selected current global definitions. If you are organizing things carefully, you have related names/objects in a saved workspace, serving as a library when you reload it later into another session.
- Version 2.9, 1991 02 15
A suite of 2!: foreigns for workspace mgmt appears, giving more control which names are saved with / restored from a workspace.
- Version 3.0, 1991 03 17
Given namess are introduced: these are identifiers ending with a colon (foo:). They can be assigned to once only, i.e. are constants, and cannot be erased.
- Version 5.0, 1992 06 22
<!.k y gives the resulting box a specific (numeric) class code k. (>!._ somebox would return the class code. The intended purpose of this feature was neither stated in the DoJ nor were any library code or examples around using this feature. Eric Iverson told me that these classes shoud have been the foundation of what had been "packages" in Sharp APL: collections of named nouns and verbs (aka "objects", these days). However, this endeavour bore no further fruits in this form.
Given names (remember foo: introduced in Version 3?) may now be erased, with 4!:55, as any other names. (And then re-assigned with the same or a different value; I guess the point was to be able reload scripts defining constants.)
- Version 6.0, 1992 10 24
Given names get their own erasure foreign: 4!:56 instead of 4!:55.
- Version 7.0, 1993 11 14
Locatives have their debut, i.e. identifiers using the form foo_loc_. Locales are (as today) side-by-side, there is no hierarchy among locales.
Their is no search path feature present, and no special "z" locale.
The "default" locale is now termed "base locale" and can be explicitly referred to with foo__ -- but not foo_base_ as could be done today.
- Release 2.01, 1994 09 01
No more workspaces, no more given names, no more box classes. Good riddance!
The "z" locale is introduced, along with the lookup rule:for an unardorned identifier foo, look in the current locale for a definition, for a foo_loc_ look the mentioned locale for foo. If not found, look in the "z" locale. Stop here.
- Release 4.01, 1998 03 22
The entire family of 18!: foreigns is introduced: every locale has now a search path for identifier lookups starting in that locale. You can now switch your current locale, either in the interactive session or in a script.
Indirect locatives (foo__locvar) are introduced, along with "numeric" locale names for generated locales ("objects").
The base locale gets now an explit name and can henceforth also be addressed via "foo_base_" locatives. The (now superflous) notation "foo__" is just kept for compatibility's sake.
J goes OO by building on these new primitives and providing co... wrapper verbs implementing class/subclasses/objects.
- Release 6.01, 2006-07-21
Long (12 years) after the demise of Given Names (remember foo:?), their eraser 4!:56 gets erased.