From: Erik Naggum
Subject: symbols, internal or external?
Date: 
Message-ID: <3070703488008286@naggum.no>
I have been looking for a function to learn whether a symbol is internal,
external, or inherited in a given package, but find that both `find-symbol'
and `intern' only take arguments of type _string_, not _string designator_
ever since CLtL2.  right now, I can find what I'm looking for with

(defun symbol-information (symbol)
  (let* ((name (symbol-name symbol))
	 (package (symbol-package symbol))
	 (status (nth-value 1 (find-symbol name package))))
    (values status name package)))

but this seems like such a waste.

since the Lisp printer must determine whether a symbol is accessible in the
default package or internal or external in some package all the time, I'd
thought I could have access to that information, too.  suggestions?

(I'm aware of the `with-package-iterator' macro, which uses a lot of
internal functions in all the implementations I have that support it.)

#\Erik
-- 
Bastard Sex Therapist from Hell: "Read the F*cking Manual!"
From: Barry Margolin
Subject: Re: symbols, internal or external?
Date: 
Message-ID: <5jk1cd$fuo@pasilla.bbnplanet.com>
In article <················@naggum.no>, Erik Naggum  <····@naggum.no> wrote:
>I have been looking for a function to learn whether a symbol is internal,
>external, or inherited in a given package, but find that both `find-symbol'
>and `intern' only take arguments of type _string_, not _string designator_
>ever since CLtL2.  right now, I can find what I'm looking for with
>
>(defun symbol-information (symbol)
>  (let* ((name (symbol-name symbol))
>	 (package (symbol-package symbol))
>	 (status (nth-value 1 (find-symbol name package))))
>    (values status name package)))
>
>but this seems like such a waste.

Your function doesn't do what you described above.  You said you wanted to
find out the symbol's status with respect to a given package, but the above
function only returns its status w/r/t its home package.  The function you
asked for would be more like:

(defun symbol-information (symbol &optional (package (symbol-package symbol)))
  (nth-value 1 (find-symbol (symbol-name symbol) package)))

>since the Lisp printer must determine whether a symbol is accessible in the
>default package or internal or external in some package all the time, I'd
>thought I could have access to that information, too.  suggestions?

The printer also has to call SYMBOL-NAME so it will know what to print, so
it's not so much of a waste for it to pass this to FIND-SYMBOL.  I expect
the printer's code looks something like this (ignoring uninterned and
keyword symbols, for simplicity):

(defun print-symbol (symbol)
  (let ((name (symbol-name symbol)))
    (if (eq symbol (find-symbol name *package*))
        (write-with-escapes name)
        (let* ((package (symbol-package symbol))
               (status (nth-value 1 (find-symbol name package))))
          (write-with-escapes (package-name package))
          (write-char #\:)
          (unless (eq status :external)
            (write-char #\:))
          (write-with-escapes name)))))
-- 
Barry Margolin
BBN Corporation, Cambridge, MA
······@bbnplanet.com
(BBN customers, call (800) 632-7638 option 1 for support)