]> git.eshelyaron.com Git - emacs.git/commitdiff
Reset symbol home packages
authorGerd Möllmann <gerd@gnu.org>
Tue, 25 Oct 2022 06:50:11 +0000 (08:50 +0200)
committerGerd Möllmann <gerd@gnu.org>
Tue, 25 Oct 2022 07:02:52 +0000 (09:02 +0200)
* lisp/emacs-lisp/pkg.el (delete-package): Set the package of
symbols whose home package is the deleted package to nil.
* test/src/pkg-tests.el (pkg-tests-delete-package):
(pkg-tests-use-package): Modify because we don't have export yet.

lisp/emacs-lisp/pkg.el
test/src/pkg-tests.el

index 38b412a8eb1bc88306abe2f72228740a7e8c3f1c..fd5eecd0445ba225c8cb7539914119a67d738fe5 100644 (file)
@@ -179,11 +179,85 @@ Otherwise assume that "
 
 \f
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;                        Basic stuff
+;;                                  Macros
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 ;;;###autoload
+(cl-defmacro do-symbols ((var &optional (package '*package*) result-form)
+                        &body body)
+  "Loop over symbols in a package.
+
+Evaluate BODY with VAR bound to each symbol accessible in the given
+PACKAGE, or the current package if PACKAGE is not specified.
+
+Return what RESULT-FORM evaluates to, if specified, and the loop ends
+normally, or else if an explcit return occurs the value it transfers."
+  (declare (indent 1))
+  (let ((flet-name (gensym "do-symbols-")))
+    `(cl-block nil
+       (cl-flet ((,flet-name (,var)
+                  (cl-tagbody ,@body)))
+        (let* ((package (pkg--package-or-lose ,package))
+               (shadows (package-%shadowing-symbols package)))
+          (maphash (lambda (k v) (,flet-name k))
+                   (package-%symbols package))
+          (dolist (p (package-%use-list package))
+            (maphash (lambda (k v)
+                       (when (eq v :external)
+                         (,flet-name k)))
+                     (package-%symbols p))
+       (let ((,var nil))
+        ,result-form)))))))
+
+;;;###autoload
+(cl-defmacro do-external-symbols ((var &optional (package '*package*) result-form)
+                                 &body body)
+  "Loop over external symbols in a package.
+
+Evaluate BODY with VAR bound to each symbol accessible in the given
+PACKAGE, or the current package if PACKAGE is not specified.
+
+Return what RESULT-FORM evaluates to, if specified, and the loop ends
+normally, or else if an explcit return occurs the value it transfers."
+  (let ((flet-name (gensym "do-symbols-")))
+    `(cl-block nil
+       (cl-flet ((,flet-name (,var)
+                  (cl-tagbody ,@body)))
+        (let* ((package (pkg--package-or-lose ,package))
+               (shadows (package-%shadowing-symbols package)))
+          (maphash (lambda (k v)
+                     (when (eq v :external)
+                       (,flet-name k)))
+                   (package-%symbols package))))
+       (let ((,var nil))
+        ,result-form))))
+
+;;;###autoload
+(cl-defmacro do-all-symbols ((var &optional result-form) &body body)
+  "Loop over all symbols in all registered packages.
+
+Evaluate BODY with VAR bound to each symbol accessible in the given
+PACKAGE, or the current package if PACKAGE is not specified.
+
+Return what RESULT-FORM evaluates to, if specified, and the loop ends
+normally, or else if an explcit return occurs the value it transfers."
+  (let ((flet-name (gensym "do-symbols-")))
+    `(cl-block nil
+       (cl-flet ((,flet-name (,var)
+                  (cl-tagbody ,@body)))
+         (dolist (package (list-all-packages))
+          (maphash (lambda (k _v)
+                     (,flet-name k))
+                   (package-%symbols package))))
+       (let ((,var nil))
+        ,result-form))))
+
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;                        Basic stuff
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+;;;###autoload
 (cl-defun make-package (name &key nicknames use (size 10))
   "Create and return a new package with name NAME.
 
@@ -285,6 +359,10 @@ If PACKAGE is a package that is not already deleted, or PACKAGE
 is a package name that is registered, delete that package by
 removing it from the package registry, and return t.
 
+After this operation completes, the home package of any symbol
+whose home package had previously been package is set to nil.
+That is, these symbols are now considered uninterned symbols.
+
 An attempt to delete one of the standard packages results in an
 error."
   (if (and (packagep package)
@@ -296,6 +374,9 @@ error."
         (error "Cannot delete a standard package"))
       (pkg--remove-from-registry package)
       (setf (package-%name package) nil)
+      (do-symbols (sym package)
+        (when (eq (symbol-package sym) package)
+          (package-%set-symbol-package sym nil)))
       t)))
 
 ;;;###autoload
@@ -323,9 +404,6 @@ Value is the renamed package object."
     (pkg--add-to-registry package)
     package))
 
-
-;;; Here...
-
 ;;;###autoload
 (defun export (symbols &optional package)
   "tbd"
@@ -439,76 +517,6 @@ Value is the renamed package object."
                            unuse))
     t))
 
-;;;###autoload
-(cl-defmacro do-symbols ((var &optional (package '*package*) result-form)
-                        &body body)
-  "Loop over symbols in a package.
-
-Evaluate BODY with VAR bound to each symbol accessible in the given
-PACKAGE, or the current package if PACKAGE is not specified.
-
-Return what RESULT-FORM evaluates to, if specified, and the loop ends
-normally, or else if an explcit return occurs the value it transfers."
-  (declare (indent 1))
-  (let ((flet-name (gensym "do-symbols-")))
-    `(cl-block nil
-       (cl-flet ((,flet-name (,var)
-                  (cl-tagbody ,@body)))
-        (let* ((package (pkg--package-or-lose ,package))
-               (shadows (package-%shadowing-symbols package)))
-          (maphash (lambda (k v) (,flet-name k))
-                   (package-%symbols package))
-          (dolist (p (package-%use-list package))
-            (maphash (lambda (k v)
-                       (when (eq v :external)
-                         (,flet-name k)))
-                     (package-%symbols p))
-       (let ((,var nil))
-        ,result-form)))))))
-
-;;;###autoload
-(cl-defmacro do-external-symbols ((var &optional (package '*package*) result-form)
-                                 &body body)
-  "Loop over external symbols in a package.
-
-Evaluate BODY with VAR bound to each symbol accessible in the given
-PACKAGE, or the current package if PACKAGE is not specified.
-
-Return what RESULT-FORM evaluates to, if specified, and the loop ends
-normally, or else if an explcit return occurs the value it transfers."
-  (let ((flet-name (gensym "do-symbols-")))
-    `(cl-block nil
-       (cl-flet ((,flet-name (,var)
-                  (cl-tagbody ,@body)))
-        (let* ((package (pkg--package-or-lose ,package))
-               (shadows (package-%shadowing-symbols package)))
-          (maphash (lambda (k v)
-                     (when (eq v :external)
-                       (,flet-name k)))
-                   (package-%symbols package))))
-       (let ((,var nil))
-        ,result-form))))
-
-;;;###autoload
-(cl-defmacro do-all-symbols ((var &optional result-form) &body body)
-  "Loop over all symbols in all registered packages.
-
-Evaluate BODY with VAR bound to each symbol accessible in the given
-PACKAGE, or the current package if PACKAGE is not specified.
-
-Return what RESULT-FORM evaluates to, if specified, and the loop ends
-normally, or else if an explcit return occurs the value it transfers."
-  (let ((flet-name (gensym "do-symbols-")))
-    `(cl-block nil
-       (cl-flet ((,flet-name (,var)
-                  (cl-tagbody ,@body)))
-         (dolist (package (list-all-packages))
-          (maphash (lambda (k _v)
-                     (,flet-name k))
-                   (package-%symbols package))))
-       (let ((,var nil))
-        ,result-form))))
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;                            defpackage
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
index b24e71427a18766eeaedab5a24f4f3bcc25cbe6c..c9127f16d91dfb17ddb6b5fe4f6988bd42d332b9 100644 (file)
     (should (delete-package x))
     (should (null (delete-package x)))
     (should (null (package-name x)))
-    (should (not (find-package 'x)))))
+    (should (not (find-package 'x))))
+  ;; Symbols whose home package is a package that is deleted, become
+  ;; uninterned.
+  (with-packages (x)
+    (let ((sym (intern "a" x)))
+      (delete-package x)
+      (should (null (symbol-package sym))))))
 
 (ert-deftest pkg-tests-rename-package ()
   (with-packages (x y)
 
 (ert-deftest pkg-tests-use-package ()
   (with-packages (x y)
-    (let ((_a (intern "a" x)))
-      (use-package x y))))
+    (let ((sym-a (intern "a" x)))
+      (should (eq (symbol-package sym-a) x))
+      (use-package x y)
+      (cl-multiple-value-bind (sym status)
+          (find-symbol "a" y)
+        (should (null sym))
+        (when nil
+          (export sym-a x)
+          (cl-multiple-value-bind (sym status)
+              (find-symbol "a" y)
+            (should (eq sym sym-a))
+            (should (eq status :inherited))))))))
 
 ;; (ert-deftest pkg-tests-find-symbol ()
 ;;   (should nil))