INTERN returns multiple values
[jscl.git] / ecmalisp.lisp
index ac6f02b..20c6812 100644 (file)
 
   (defun find-symbol (name &optional (package *package*))
     (let* ((package (find-package-or-fail package))
+           (externals (%package-external-symbols package))
            (symbols (%package-symbols package)))
-      (if (in name symbols)
-          (values (oget symbols name) t)
-          (dolist (used (package-use-list package) (values nil nil))
-            (let ((exports (%package-external-symbols used)))
-              (when (in name exports)
-                (return (values (oget exports name) t))))))))
+      (cond
+        ((in name externals)
+         (values (oget externals name) :external))
+        ((in name symbols)
+         (values (oget symbols name) :internal))
+        (t
+         (dolist (used (package-use-list package) (values nil nil))
+           (let ((exports (%package-external-symbols used)))
+             (when (in name exports)
+               (return (values (oget exports name) :inherit)))))))))
 
   (defun intern (name &optional (package *package*))
     (let ((package (find-package-or-fail package)))
       (multiple-value-bind (symbol foundp)
           (find-symbol name package)
         (if foundp
-            symbol
+            (values symbol foundp)
             (let ((symbols (%package-symbols package)))
               (oget symbols name)
               (let ((symbol (make-symbol name)))
                 (when (eq package *keyword-package*)
                   (oset symbol "value" symbol)
                   (export (list symbol) package))
-                (oset symbols name symbol)))))))
+                (oset symbols name symbol)
+                (values symbol nil)))))))
 
   (defun symbol-package (symbol)
     (unless (symbolp symbol)