Le 23/01/2023 à 17:51, Andrea Monaco a écrit :

ANSI CL allows implementations to copy characters at any time.  Does
that also applies to strings?  I think it should, because strings are
made of characters...

In particular, I ask if my implementation can evaluate

   (eq (symbol-name 'aaa) (symbol-name 'aaa)) => nil

because it generates the name string at each call to SYMBOL-NAME.

The example is different from the question.

To answer the question, about the fact that characters (and numbers) may be copied at any time by the implementation, so that EQ may distinguish them,

   (let ((s "abc")) (eq (aref s 0) (aref s 0)))

may return true or NIL.

And notably:

  (let* ((c #\a) (s (string c))) (eq c (aref s 0)))

may return true or NIL too.


Concerning the example you give, it comes from another specification element, which is that SYMBOL-NAME may return a fresh string (or not). It is independent from the first question.

Note that the usual implementations all return T, ie. the same string, from SYMBOL-NAME. But it is conceivable that an implementation does not store the symbol name, (for example, it could store the symbol in a tree-like data structure to spare the storage needed by the symbol names (which is for the CL package alone about 1/6 of a 64K byte memory). Then each time you call symbol-name a new string could be built from the tree data structure (the path to the symbol, from the root). In that case, your expression would indeed return NIL.

(let ((c 0))
  (do-external-symbols (s "CL")
  (incf c (length (symbol-name s))))
  c) ; --> 11271


In general, don't use EQ, instead use EQL, and don't use EQL on strings, but STRING=, STRING-EQUAL, or EQUAL or EQUALP.

--
__Pascal Bourguignon__


Reply via email to