On 9 Jan 2011, at 03:25, Andy Wingo wrote:
Let's say you have an association list. It could be (("foo" .
"bar")) or
((foo . "bar")) or ((foo bar)), or even (("foo" . bar)). If you're
parsing this data from over the network, in textual form, which do you
use?
The answer is this:
* Use symbols when you want to match against a symbol literal in your
source code.
* Use strings otherwise.
I have found very useful the associative container with keys
implemented as a balanced tree and called std::map in C++ and Map in
Haskell. The keys then varies according to context. For example,
sparse multivariate polynomials can be implemented as a map from
monomials to coefficients. Then sparse multivariate monomials can be
implemented as a map from variables to exponents (integers); for
variables, I choose strings.
ps. I very, very rarely hold Python up as an example of language
design,
especially regarding strings, but I think that their approach to
string
mutabililty and identity is preferable to the symbol vs string
distinction that Scheme has.
Symbols and strings are semantically different with respect to the
lambda theory. Perhaps in Scheme, symbols are used in other contexts
because 'eq?' is faster, which was important on the slower computers
of the past.