Sometimes called "AssociativeArray", "Map", or "HashTable" (the latter is strictly an implementation of a dictionary). Almost all script languages, including PerlLanguage, RubyLanguage, PythonLanguage, LispLanguage, support some kind of dictionary built-in facility.
In a dictionary, you store a value with an associated key and then you may retrieve this value later using the key. There are a lot of examples. For example, in PerlLanguage you might use the built-in hash capability:
my %english2latin = ( sailor => 'nauta', man => 'vir', woman => 'femina', ); $english2latin{'dog'} = 'canis'; foreach $key (sort keys %english2latin) { my $value = $english2latin{$key}; print "The Latin word for $key is $value.\n"; } outputs: The Latin word for dog is canis. The Latin word for man is vir. The Latin word for sailor is nauta. The Latin word for woman is femina.
In Smalltalk I could do it like this
| dict | dict := (IdentityDictionary? new) add: 'man' -> 'vir'; add: 'woman' -> 'femina'; add: 'sailor' -> 'nauta'; yourself. dict add: 'dog' -> 'canis'. dict keys asSortedCollection do: [:key | Transcript cr; show: 'The Latin word for '; show: key; show: ' is '; show: (dict at: key)]Plenty of more to write, but nevertheless
In RDBMS (RelationalDatabase) terms, a dictionary has 2 columns, one of which is a primary (unique) key.
In Smalltalk, IdentityDictionary? is a subclass of Dictionary. When should I use one, and when the other?
I just read the answer to my own question. It is was posted a few years ago at http://wiki.squeak.org/squeak/1845 very tersely: "uses == (identity) for accessing. " In the Squeak sources, it is used for things that must exist only once: the classes SystemDictionary? and DynamicBindings?.
Actually the above example can also works fine with a Dictionary, and does not need an IdentityDictionary?.
dict2 := (Dictionary new) add: 'man' -> 'vir'; add: 'woman' -> 'femina'; add: 'sailor' -> 'nauta'; yourself. dict2 add: 'dog' -> 'canis'. 'dog'->'canis' dict2 keys asSortedCollection do: [:key | Transcript cr; show: 'The Latin word for '; show: key; show: ' is '; show: (dict2 at: key)]One difference I spotted from browsing the Squeak sources, is that in the Dictionary, the entries are identified by the Collection>>hash Smalltalk method. However, in the IdentityDictionary?, that is replaced with ProtoObject?>>identityHash, which is a virtual machine primitive.
PythonLanguage is based heavily on its dictionaries: every object has an underlying dictionary mapping to its attributes, which may be accessed through the __dict__ attribute.
class ExampleObject?: spam = "example" obj = ExampleObject?() print obj.spam # prints "example" print obj.__dict__["spam"] # also prints "example"
Not to be confused with DataDictionary.