Raymond Toy pushed to branch master at cmucl / cmucl

Commits:

7 changed files:

Changes:

  • bin/run-unit-tests.sh
    ... ... @@ -76,3 +76,24 @@ else
    76 76
         $LISP -nositeinit -noinit -load "$TESTDIR"/run-tests.lisp -eval "(progn (cmucl-test-runner:load-test-files) (cmucl-test-runner:run-test $result))"
    
    77 77
     fi
    
    78 78
     
    
    79
    +## Now run tests for trivial-package-local-nicknames
    
    80
    +REPO=trivial-package-local-nicknames-mirror
    
    81
    +BRANCH=cmucl-updates
    
    82
    +
    
    83
    +set -x
    
    84
    +if [ -d ../$REPO ]; then
    
    85
    +    (cd ../$REPO || exit 1; git stash; git checkout $BRANCH; git pull --rebase)
    
    86
    +else
    
    87
    +    (cd ..; git clone https://gitlab.common-lisp.net/cmucl/trivial-package-local-nicknames-mirror.git)
    
    88
    +fi
    
    89
    +
    
    90
    +LISP=$PWD/$LISP
    
    91
    +cd ../$REPO || exit 1
    
    92
    +git checkout $BRANCH
    
    93
    +
    
    94
    +# Run the tests.  Exits with a non-zero code if there's a failure.
    
    95
    +$LISP -noinit -nositeinit -batch <<'EOF'
    
    96
    +(require :asdf)
    
    97
    +(push (default-directory) asdf:*central-registry*)
    
    98
    +(asdf:test-system :trivial-package-local-nicknames)
    
    99
    +EOF

  • src/bootfiles/21e/boot-2024-08.lisp
    ... ... @@ -8,3 +8,125 @@
    8 8
     	      (declare (ignore c))
    
    9 9
     	      (invoke-restart 'continue))))
    
    10 10
       (defconstant +ef-max+ 14))
    
    11
    +
    
    12
    +;;; Bootstrap for adding %local-nicknames to package structure.
    
    13
    +(in-package :lisp)
    
    14
    +
    
    15
    +(intern "PACKAGE-LOCAL-NICKNAMES" "LISP")
    
    16
    +(intern	"ADD-PACKAGE-LOCAL-NICKNAME" "LISP")
    
    17
    +(intern	"REMOVE-PACKAGE-LOCAL-NICKNAME" "LISP")
    
    18
    +(intern	"PACKAGE-LOCALLY-NICKNAMED-BY-LIST" "LISP")
    
    19
    +
    
    20
    +;; Make sure we don't accidentally load fasls from somewhere.
    
    21
    +(setf (ext:search-list "target:")
    
    22
    +      '("src/"))
    
    23
    +
    
    24
    +;; Ensure all packages have been set up, since package definition is broken
    
    25
    +;; once this file has been loaded:
    
    26
    +(load "target:code/exports-errno" :if-does-not-exist nil)
    
    27
    +(load "target:code/exports")
    
    28
    +
    
    29
    +(setf *enable-package-locked-errors* nil)
    
    30
    +
    
    31
    +;;;
    
    32
    +;;; Like DEFSTRUCT, but silently clobber old definitions.
    
    33
    +;;;
    
    34
    +(defmacro defstruct! (name &rest stuff)
    
    35
    +  `(handler-bind ((error (lambda (c)
    
    36
    +                           (declare (ignore c))
    
    37
    +                           (invoke-restart 'kernel::clobber-it))))
    
    38
    +     (defstruct ,name ,@stuff)))
    
    39
    +
    
    40
    +
    
    41
    +(defstruct! (package
    
    42
    +	     (:constructor internal-make-package)
    
    43
    +	     (:predicate packagep)
    
    44
    +	     (:print-function %print-package)
    
    45
    +	     (:make-load-form-fun
    
    46
    +	      (lambda (package)
    
    47
    +		(values `(package-or-lose ',(package-name package))
    
    48
    +			nil))))
    
    49
    +  (tables (list nil))	; A list of all the hashtables for inherited symbols.
    
    50
    +  (%name nil :type (or simple-string null))
    
    51
    +  (%nicknames () :type list)
    
    52
    +  (%use-list () :type list)
    
    53
    +  (%used-by-list () :type list)
    
    54
    +  (internal-symbols (required-argument) :type package-hashtable)
    
    55
    +  (external-symbols (required-argument) :type package-hashtable)
    
    56
    +  (%shadowing-symbols () :type list)
    
    57
    +  (lock nil :type boolean)
    
    58
    +  (definition-lock nil :type boolean)
    
    59
    +  (%local-nicknames () :type list)
    
    60
    +  (doc-string nil :type (or simple-string null)))
    
    61
    +
    
    62
    +;; Need to define this with the extra arg because compiling pcl uses
    
    63
    +;; defpackage and we need this defined.  This isn't the actual
    
    64
    +;; implementation; we just added the extra arg.
    
    65
    +(defun %defpackage (name nicknames size shadows shadowing-imports
    
    66
    +			 use imports interns exports doc-string &optional local-nicknames)
    
    67
    +  (declare (type simple-base-string name)
    
    68
    +	   (type list nicknames local-nicknames shadows shadowing-imports
    
    69
    +		 imports interns exports)
    
    70
    +	   (type (or list (member :default)) use)
    
    71
    +	   (type (or simple-base-string null) doc-string))
    
    72
    +  (let ((package (or (find-package name)
    
    73
    +		     (progn
    
    74
    +		       (when (eq use :default)
    
    75
    +			 (setf use *default-package-use-list*))
    
    76
    +		       (make-package name
    
    77
    +				     :use nil
    
    78
    +				     :internal-symbols (or size 10)
    
    79
    +				     :external-symbols (length exports))))))
    
    80
    +    (unless (string= (the string (package-name package)) name)
    
    81
    +      (error 'simple-package-error
    
    82
    +	     :package name
    
    83
    +	     :format-control (intl:gettext "~A is a nick-name for the package ~A")
    
    84
    +	     :format-arguments (list name (package-name name))))
    
    85
    +    (enter-new-nicknames package nicknames)
    
    86
    +    ;; Shadows and Shadowing-imports.
    
    87
    +    (let ((old-shadows (package-%shadowing-symbols package)))
    
    88
    +      (shadow shadows package)
    
    89
    +      (dolist (sym-name shadows)
    
    90
    +	(setf old-shadows (remove (find-symbol sym-name package) old-shadows)))
    
    91
    +      (dolist (simports-from shadowing-imports)
    
    92
    +	(let ((other-package (package-or-lose (car simports-from))))
    
    93
    +	  (dolist (sym-name (cdr simports-from))
    
    94
    +	    (let ((sym (find-or-make-symbol sym-name other-package)))
    
    95
    +	      (shadowing-import sym package)
    
    96
    +	      (setf old-shadows (remove sym old-shadows))))))
    
    97
    +      (when old-shadows
    
    98
    +	(warn (intl:gettext "~A also shadows the following symbols:~%  ~S")
    
    99
    +	      name old-shadows)))
    
    100
    +    ;; Use
    
    101
    +    (unless (eq use :default)
    
    102
    +      (let ((old-use-list (package-use-list package))
    
    103
    +	    (new-use-list (mapcar #'package-or-lose use)))
    
    104
    +	(use-package (set-difference new-use-list old-use-list) package)
    
    105
    +	(let ((laterize (set-difference old-use-list new-use-list)))
    
    106
    +	  (when laterize
    
    107
    +	    (unuse-package laterize package)
    
    108
    +	    (warn (intl:gettext "~A previously used the following packages:~%  ~S")
    
    109
    +		  name
    
    110
    +		  laterize)))))
    
    111
    +    ;; Import and Intern.
    
    112
    +    (dolist (sym-name interns)
    
    113
    +      (intern sym-name package))
    
    114
    +    (dolist (imports-from imports)
    
    115
    +      (let ((other-package (package-or-lose (car imports-from))))
    
    116
    +	(dolist (sym-name (cdr imports-from))
    
    117
    +	  (import (list (find-or-make-symbol sym-name other-package))
    
    118
    +		  package))))
    
    119
    +    ;; Exports.
    
    120
    +    (let ((old-exports nil)
    
    121
    +	  (exports (mapcar #'(lambda (sym-name) (intern sym-name package))
    
    122
    +			   exports)))
    
    123
    +      (do-external-symbols (sym package)
    
    124
    +	(push sym old-exports))
    
    125
    +      (export exports package)
    
    126
    +      (let ((diff (set-difference old-exports exports)))
    
    127
    +	(when diff
    
    128
    +	  (warn (intl:gettext "~A also exports the following symbols:~%  ~S")
    
    129
    +		name diff))))
    
    130
    +    ;; Documentation
    
    131
    +    (setf (package-doc-string package) doc-string)
    
    132
    +    package))

  • src/code/exports.lisp
    ... ... @@ -1857,6 +1857,11 @@
    1857 1857
       (:import-from "KERNEL" "*ANSI-DEFSTRUCT-OPTIONS-P*")
    
    1858 1858
       (:import-from "SYSTEM" "MAKE-INDENTING-STREAM" "INDENTING-STREAM-P"
    
    1859 1859
     		"BINARY-TEXT-STREAM")
    
    1860
    +  (:import-from "LISP"
    
    1861
    +		"PACKAGE-LOCAL-NICKNAMES"
    
    1862
    +		"ADD-PACKAGE-LOCAL-NICKNAME"
    
    1863
    +		"REMOVE-PACKAGE-LOCAL-NICKNAME"
    
    1864
    +		"PACKAGE-LOCALLY-NICKNAMED-BY-LIST")
    
    1860 1865
       #+double-double
    
    1861 1866
       (:import-from "KERNEL" "DOUBLE-DOUBLE-FLOAT" "DD-PI")
    
    1862 1867
       (:export   "*AFTER-GC-HOOKS*" "*AFTER-SAVE-INITIALIZATIONS*"
    
    ... ... @@ -2109,7 +2114,12 @@
    2109 2114
     	   "DESCRIBE-EXTERNAL-FORMAT"
    
    2110 2115
     	   "LIST-ALL-EXTERNAL-FORMATS"
    
    2111 2116
     	   "STRING-ENCODE" "STRING-DECODE"
    
    2112
    -	   "SET-SYSTEM-EXTERNAL-FORMAT"))
    
    2117
    +	   "SET-SYSTEM-EXTERNAL-FORMAT")
    
    2118
    +  ;; Package-local-nicknames
    
    2119
    +  (:export "PACKAGE-LOCAL-NICKNAMES"
    
    2120
    +	   "ADD-PACKAGE-LOCAL-NICKNAME"
    
    2121
    +	   "REMOVE-PACKAGE-LOCAL-NICKNAME"
    
    2122
    +	   "PACKAGE-LOCALLY-NICKNAMED-BY-LIST"))
    
    2113 2123
     
    
    2114 2124
     (defpackage "STREAM"
    
    2115 2125
       (:import-from "SYSTEM" "LISP-STREAM")
    

  • src/code/package.lisp
    ... ... @@ -41,6 +41,8 @@
    41 41
     #+relative-package-names
    
    42 42
     (sys:register-lisp-feature :relative-package-names)
    
    43 43
     
    
    44
    +(sys:register-lisp-feature :package-local-nicknames)
    
    45
    +
    
    44 46
     (defvar *default-package-use-list* '("COMMON-LISP")
    
    45 47
       "The list of packages to use by default of no :USE argument is supplied
    
    46 48
        to MAKE-PACKAGE or other package creation forms.")
    
    ... ... @@ -91,6 +93,9 @@
    91 93
       (lock nil :type boolean)
    
    92 94
       (definition-lock nil :type boolean)
    
    93 95
     
    
    96
    +  ;; Package local nicknames
    
    97
    +  (%local-nicknames () :type list)
    
    98
    +
    
    94 99
       ;; Documentation string for this package
    
    95 100
       (doc-string nil :type (or simple-string null)))
    
    96 101
     
    
    ... ... @@ -397,6 +402,12 @@
    397 402
                        (setq package tmp))
    
    398 403
                      (relative-to package name))))))))
    
    399 404
     
    
    405
    +(defun local-nickname-to-package (name)
    
    406
    +  ;; Skip all of this if we're doing package-init!
    
    407
    +  (unless *in-package-init*
    
    408
    +    (cdr (assoc name (package-%local-nicknames *package*)
    
    409
    +		:test #'string=))))
    
    410
    +
    
    400 411
     ;;; find-package  --  Public
    
    401 412
     ;;;
    
    402 413
     ;;;
    
    ... ... @@ -405,7 +416,8 @@
    405 416
       (if (packagep name)
    
    406 417
           name
    
    407 418
           (let ((name (package-namify name)))
    
    408
    -	(or (package-name-to-package name)
    
    419
    +	(or (local-nickname-to-package name)
    
    420
    +	    (package-name-to-package name)
    
    409 421
     	    #+relative-package-names
    
    410 422
     	    (relative-package-name-to-package name)))))
    
    411 423
     
    
    ... ... @@ -420,7 +432,8 @@
    420 432
     	 thing)
    
    421 433
     	(t
    
    422 434
     	 (let ((thing (package-namify thing)))
    
    423
    -	   (cond ((package-name-to-package thing))
    
    435
    +	   (cond ((local-nickname-to-package thing))
    
    436
    +		 ((package-name-to-package thing))
    
    424 437
     		 (t
    
    425 438
     		  ;; ANSI spec's type-error where this is called. But,
    
    426 439
     		  ;; but the resulting message is somewhat unclear.
    
    ... ... @@ -923,8 +936,10 @@
    923 936
          (:EXPORT {symbol-name}*)
    
    924 937
          (:INTERN {symbol-name}*)
    
    925 938
          (:SIZE <integer>)
    
    939
    +     (:LOCAL-NICKNAMES {({nickname package}*)})
    
    926 940
        All options except :SIZE and :DOCUMENTATION can be used multiple times."
    
    927 941
       (let ((nicknames nil)
    
    942
    +	(local-nicknames nil)
    
    928 943
     	(size nil)
    
    929 944
     	(shadows nil)
    
    930 945
     	(shadowing-imports nil)
    
    ... ... @@ -940,6 +955,11 @@
    940 955
           (case (car option)
    
    941 956
     	(:nicknames
    
    942 957
     	 (setf nicknames (stringify-names (cdr option) "package")))
    
    958
    +	(:local-nicknames
    
    959
    +	 (setf local-nicknames
    
    960
    +	       (mapcar #'(lambda (o)
    
    961
    +			   (stringify-names o "package"))
    
    962
    +		       (cdr option))))
    
    943 963
     	(:size
    
    944 964
     	 (cond (size
    
    945 965
     		(simple-program-error (intl:gettext "Can't specify :SIZE twice.")))
    
    ... ... @@ -994,9 +1014,9 @@
    994 1014
     		    `(:shadowing-import-from
    
    995 1015
     		      ,@(apply #'append (mapcar #'rest shadowing-imports))))
    
    996 1016
         `(eval-when (compile load eval)
    
    997
    -       (%defpackage ,(stringify-name package "package") ',nicknames ',size
    
    998
    -		    ',shadows ',shadowing-imports ',(if use-p use :default)
    
    999
    -		    ',imports ',interns ',exports ',doc))))
    
    1017
    +       (%defpackage ,(stringify-name package "package") ',nicknames 
    
    1018
    +		    ',size ',shadows ',shadowing-imports ',(if use-p use :default)
    
    1019
    +		    ',imports ',interns ',exports ',doc ',local-nicknames))))
    
    1000 1020
     
    
    1001 1021
     (defun check-disjoint (&rest args)
    
    1002 1022
       ;; Check whether all given arguments specify disjoint sets of symbols.
    
    ... ... @@ -1014,9 +1034,9 @@
    1014 1034
     				    key1 key2 common))))
    
    1015 1035
     
    
    1016 1036
     (defun %defpackage (name nicknames size shadows shadowing-imports
    
    1017
    -			 use imports interns exports doc-string)
    
    1037
    +			 use imports interns exports doc-string &optional local-nicknames)
    
    1018 1038
       (declare (type simple-base-string name)
    
    1019
    -	   (type list nicknames shadows shadowing-imports
    
    1039
    +	   (type list nicknames local-nicknames shadows shadowing-imports
    
    1020 1040
     		 imports interns exports)
    
    1021 1041
     	   (type (or list (member :default)) use)
    
    1022 1042
     	   (type (or simple-base-string null) doc-string))
    
    ... ... @@ -1034,6 +1054,7 @@
    1034 1054
     	     :format-control (intl:gettext "~A is a nick-name for the package ~A")
    
    1035 1055
     	     :format-arguments (list name (package-name name))))
    
    1036 1056
         (enter-new-nicknames package nicknames)
    
    1057
    +    (enter-new-local-nicknames package local-nicknames)
    
    1037 1058
         ;; Shadows and Shadowing-imports.
    
    1038 1059
         (let ((old-shadows (package-%shadowing-symbols package)))
    
    1039 1060
           (shadow shadows package)
    
    ... ... @@ -1128,6 +1149,12 @@
    1128 1149
     	     (setf (gethash n *package-names*) package)
    
    1129 1150
     	     (push n (package-%nicknames package)))))))
    
    1130 1151
     
    
    1152
    +(defun enter-new-local-nicknames (package local-nicknames)
    
    1153
    +  (dolist (entry local-nicknames)
    
    1154
    +    (destructuring-bind (nick actual)
    
    1155
    +	entry
    
    1156
    +      (add-package-local-nickname nick actual package))))
    
    1157
    +
    
    1131 1158
     
    
    1132 1159
     ;;; Make-Package  --  Public
    
    1133 1160
     ;;;
    
    ... ... @@ -1225,6 +1252,14 @@
    1225 1252
         (enter-new-nicknames package new-nicknames)
    
    1226 1253
         package))
    
    1227 1254
     
    
    1255
    +;; Given a package designator, convert it to the corresponding package
    
    1256
    +;; object.
    
    1257
    +(declaim (inline designator-package))
    
    1258
    +(defun designator-package (designator)
    
    1259
    +  (if (packagep designator)
    
    1260
    +      designator
    
    1261
    +      (package-name-to-package (package-namify designator))))
    
    1262
    +
    
    1228 1263
     ;;; Delete-Package -- Public
    
    1229 1264
     ;;;
    
    1230 1265
     (defun delete-package (package-or-name)
    
    ... ... @@ -1254,6 +1289,13 @@
    1254 1289
     			      (mapcar #'package-name use-list))))
    
    1255 1290
     	       (dolist (p use-list)
    
    1256 1291
     		 (unuse-package package p))))
    
    1292
    +	   ;; Find all the packages that have a local nickname to this
    
    1293
    +	   ;; package and remove the local nickname entry.
    
    1294
    +	   (dolist (pkg (package-locally-nicknamed-by-list package))
    
    1295
    +	     (setf (package-%local-nicknames pkg)
    
    1296
    +		   (delete package
    
    1297
    +			   (package-%local-nicknames pkg)
    
    1298
    +			   :key #'cdr)))
    
    1257 1299
     	   (dolist (used (package-use-list package))
    
    1258 1300
     	     (unuse-package used package))
    
    1259 1301
     	   (do-symbols (sym package)
    
    ... ... @@ -1928,7 +1970,128 @@
    1928 1970
     		     (result symbol))
    
    1929 1971
     		 string package)
    
    1930 1972
         (result)))
    
    1931
    -
    
    1973
    +
    
    1974
    +;;;; Support for package local nicknames
    
    1975
    +
    
    1976
    +;;; PACKAGE-LOCAL-NICKNAMES  -- public.
    
    1977
    +;;;
    
    1978
    +(defun package-local-nicknames (package)
    
    1979
    +  "Returns an alist of (local-nickname . actual-package) describing the
    
    1980
    +  nicknames local to Package."
    
    1981
    +  ;; Should we return a new list?
    
    1982
    +  (copy-list (package-%local-nicknames (designator-package package))))
    
    1983
    +
    
    1984
    +;;; ADD-PACKAGE-LOCAL-NICKNAME -- public.
    
    1985
    +;;;
    
    1986
    +(defun add-package-local-nickname (local-nickname actual-package &optional (package *package*))
    
    1987
    +  "For the designated package Package (defaulting to *PACKAGE*), add
    
    1988
    +  Local-Nickname as a package local nickname to the package
    
    1989
    +  Actual-Package. Actual-Package and Package must be an package
    
    1990
    +  designator. Local-Nickname should be a string designator.
    
    1991
    +
    
    1992
    +  Returns the designated package.
    
    1993
    +
    
    1994
    +  Signals a continuable error if any of the following are true:
    
    1995
    +    - Local-Nickname is already a local nickname for a different package
    
    1996
    +    - Local-Nickname is one of \"CL\", \"COMMON-LISP\", or \"KEYWORD\"
    
    1997
    +    - Local-Nickname is a global name or nickname for designated package"
    
    1998
    +
    
    1999
    +  (let* ((pkg (designator-package package))
    
    2000
    +	 (actual-pkg (designator-package actual-package))
    
    2001
    +	 (nicks (package-%local-nicknames pkg))
    
    2002
    +	 (local-nickname (package-namify local-nickname)))
    
    2003
    +  (when (member local-nickname '("CL" "COMMON-LISP" "KEYWORD")
    
    2004
    +		:test #'string=)
    
    2005
    +    (cerror "Add nickname anyway"
    
    2006
    +	    'simple-package-error
    
    2007
    +	    :package pkg
    
    2008
    +	    :format-control (intl:gettext "Local nickname cannot be \"CL\", \"COMMON-LISP\" or \"KEYWORD\"")
    
    2009
    +	    :format-arguments (list local-nickname)))
    
    2010
    +    (let ((found-it (find-if #'(lambda (nick)
    
    2011
    +				 (string= nick local-nickname))
    
    2012
    +			     nicks :key #'car)))
    
    2013
    +      (when found-it
    
    2014
    +	;; If the local nickname alread exists and it's the same
    
    2015
    +	;; package, there's nothing to do.
    
    2016
    +	(when (eq (cdr found-it) actual-pkg)
    
    2017
    +	  (return-from add-package-local-nickname pkg))
    
    2018
    +	;; Otherwise, signal an error that the packages don't match.
    
    2019
    +	(restart-case 
    
    2020
    +	    (error 'simple-package-error
    
    2021
    +		   :package pkg
    
    2022
    +		   :format-control (intl:gettext "~A is already a local nickname for the package ~A in ~A")
    
    2023
    +		   :format-arguments (list local-nickname actual-pkg pkg))
    
    2024
    +	  (keep-old-nickname ()
    
    2025
    +	    :report (lambda (stream)
    
    2026
    +		      (format stream "Keep ~A as a local nickname for ~A~%"
    
    2027
    +			      local-nickname (cdr found-it)))
    
    2028
    +	    (return-from add-package-local-nickname (cdr found-it)))
    
    2029
    +	  (use-new-nickname ()
    
    2030
    +	    :report (lambda (stream)
    
    2031
    +		      (format stream "Use ~A as a local nickname for ~A instead~%"
    
    2032
    +			      local-nickname actual-pkg))
    
    2033
    +	    (setf (cdr found-it) actual-pkg)
    
    2034
    +	    (return-from add-package-local-nickname actual-pkg)))))
    
    2035
    +
    
    2036
    +    ;; The new LOCAL-NICKNAME can't be the same as PACKAGE.
    
    2037
    +    (when (string= local-nickname (package-name pkg))
    
    2038
    +      (cerror "Add nickname anyway"
    
    2039
    +	      'simple-package-error
    
    2040
    +	      :package pkg
    
    2041
    +	      :format-control (intl:gettext "~A cannot be a package local nickname for the global package~_ ~A with the same name")
    
    2042
    +	      :format-arguments (list local-nickname pkg)))
    
    2043
    +
    
    2044
    +    ;; Can't be a local nickname for any of the nicknames
    
    2045
    +    (let ((found-it (find local-nickname
    
    2046
    +			  (package-nicknames pkg)
    
    2047
    +			  :test #'string=)))
    
    2048
    +      (when found-it
    
    2049
    +	(cerror "Use it as a local nickname anyway"
    
    2050
    +		'simple-package-error
    
    2051
    +		:format-control (intl:gettext "~A cannot be a package local nickname for the global package~_ ~A with nickname ~A")
    
    2052
    +		:format-arguments (list local-nickname pkg found-it))))
    
    2053
    +    
    
    2054
    +    (setf (package-%local-nicknames pkg)
    
    2055
    +	  (push (cons local-nickname
    
    2056
    +		      (designator-package actual-package))
    
    2057
    +		nicks))
    
    2058
    +    pkg))
    
    2059
    +
    
    2060
    +;;; REMOVE-PACKAGE-LOCAL-NICKNAME -- public.
    
    2061
    +;;;
    
    2062
    +(defun remove-package-local-nickname (old-nickname &optional (package *package*))
    
    2063
    +  "If Package has Old-Nickname as a local nickname, it is removed.
    
    2064
    +  Returns true if the nickname existed and was removed.  Otherwise
    
    2065
    + returns NIL."
    
    2066
    +  (let* ((old-nick (if (packagep old-nickname)
    
    2067
    +		       (package-namestring old-nickname)
    
    2068
    +		       (package-namify old-nickname)))
    
    2069
    +	 (pkg (designator-package package))
    
    2070
    +	 (nicks (package-%local-nicknames pkg))
    
    2071
    +	 deletedp)
    
    2072
    +    (setf (package-%local-nicknames pkg)
    
    2073
    +	  (delete-if #'(lambda (local-nick)
    
    2074
    +			 (when (string= local-nick old-nick)
    
    2075
    +			   (setf deletedp t)))
    
    2076
    +		     nicks :key #'car))
    
    2077
    +    deletedp))
    
    2078
    +
    
    2079
    +;;; PACKAGE-LOCALLY-NICKNAMED-BY-LIST -- public
    
    2080
    +;;;
    
    2081
    +;;; FIXME: This is pretty inefficient because we have list all the
    
    2082
    +;;; packages and look throught the %local-nicknames to find the
    
    2083
    +;;; packages.  We could probably make it faster if we added a new slot
    
    2084
    +;;; to the package structure similar to how we have %use-list and
    
    2085
    +;;; %used-by-list.
    
    2086
    +(defun package-locally-nicknamed-by-list (package)
    
    2087
    +  "Returns a list of packages which have a local nickname for Package."
    
    2088
    +  (let ((pkg (designator-package package)))
    
    2089
    +    (loop for p in (list-all-packages)
    
    2090
    +	  when (find pkg
    
    2091
    +		     (package-%local-nicknames p)
    
    2092
    +		     :key #'cdr
    
    2093
    +		     :test #'eq)
    
    2094
    +	    collect p)))
    
    1932 2095
     
    
    1933 2096
     
    
    1934 2097
     ;;; Initialization.
    

  • src/code/print.lisp
    ... ... @@ -696,7 +696,15 @@
    696 696
     	    ;; qualified.  This can happen if the symbol has been inherited
    
    697 697
     	    ;; from a package other than its home package.
    
    698 698
     	    (unless (and accessible (eq symbol object))
    
    699
    -	      (output-symbol-name (package-name package) stream)
    
    699
    +	      ;; If the actual symbol package has a local nickname in
    
    700
    +	      ;; *package*, use that as the package name instead of the
    
    701
    +	      ;; actual symbol package name.
    
    702
    +	      (let ((local-nicks (package-%local-nicknames *package*))
    
    703
    +		    (pkg-name (package-name package)))
    
    704
    +		(when local-nicks
    
    705
    +		  (setf pkg-name (or (car (rassoc package local-nicks))
    
    706
    +				     pkg-name)))
    
    707
    +		(output-symbol-name pkg-name stream))
    
    700 708
     	      (multiple-value-bind (symbol externalp)
    
    701 709
     				   (find-external-symbol name package)
    
    702 710
     		(declare (ignore symbol))
    

  • src/contrib/asdf/asdf.lisp
    ... ... @@ -138,7 +138,7 @@
    138 138
        #+(or clasp abcl ecl cmu) #:ext
    
    139 139
        #+ccl #:ccl
    
    140 140
        #+lispworks #:hcl
    
    141
    -   #-(or allegro sbcl clasp abcl ccl lispworks ecl)
    
    141
    +   #-(or allegro sbcl clasp abcl ccl lispworks ecl cmu)
    
    142 142
        (error "Don't know from which package this lisp supplies the local-package-nicknames API.")
    
    143 143
        #:remove-package-local-nickname #:package-local-nicknames #:add-package-local-nickname)
    
    144 144
       (:export
    

  • src/i18n/locale/cmucl.pot
    ... ... @@ -8208,6 +8208,7 @@ msgid ""
    8208 8208
     "     (:EXPORT {symbol-name}*)\n"
    
    8209 8209
     "     (:INTERN {symbol-name}*)\n"
    
    8210 8210
     "     (:SIZE <integer>)\n"
    
    8211
    +"     (:LOCAL-NICKNAMES {({nickname package}*)})\n"
    
    8211 8212
     "   All options except :SIZE and :DOCUMENTATION can be used multiple times."
    
    8212 8213
     msgstr ""
    
    8213 8214
     
    
    ... ... @@ -8551,6 +8552,58 @@ msgid ""
    8551 8552
     "  found instead of describing them."
    
    8552 8553
     msgstr ""
    
    8553 8554
     
    
    8555
    +#: src/code/package.lisp
    
    8556
    +msgid ""
    
    8557
    +"Returns an alist of (local-nickname . actual-package) describing the\n"
    
    8558
    +"  nicknames local to Package."
    
    8559
    +msgstr ""
    
    8560
    +
    
    8561
    +#: src/code/package.lisp
    
    8562
    +msgid ""
    
    8563
    +"For the designated package Package (defaulting to *PACKAGE*), add\n"
    
    8564
    +"  Local-Nickname as a package local nickname to the package\n"
    
    8565
    +"  Actual-Package. Actual-Package and Package must be an package\n"
    
    8566
    +"  designator. Local-Nickname should be a string designator.\n"
    
    8567
    +"\n"
    
    8568
    +"  Returns the designated package.\n"
    
    8569
    +"\n"
    
    8570
    +"  Signals a continuable error if any of the following are true:\n"
    
    8571
    +"    - Local-Nickname is already a local nickname for a different package\n"
    
    8572
    +"    - Local-Nickname is one of \"CL\", \"COMMON-LISP\", or \"KEYWORD\"\n"
    
    8573
    +"    - Local-Nickname is a global name or nickname for designated package"
    
    8574
    +msgstr ""
    
    8575
    +
    
    8576
    +#: src/code/package.lisp
    
    8577
    +msgid "Local nickname cannot be \"CL\", \"COMMON-LISP\" or \"KEYWORD\""
    
    8578
    +msgstr ""
    
    8579
    +
    
    8580
    +#: src/code/package.lisp
    
    8581
    +msgid "~A is already a local nickname for the package ~A in ~A"
    
    8582
    +msgstr ""
    
    8583
    +
    
    8584
    +#: src/code/package.lisp
    
    8585
    +msgid ""
    
    8586
    +"~A cannot be a package local nickname for the global package~_ ~A with the "
    
    8587
    +"same name"
    
    8588
    +msgstr ""
    
    8589
    +
    
    8590
    +#: src/code/package.lisp
    
    8591
    +msgid ""
    
    8592
    +"~A cannot be a package local nickname for the global package~_ ~A with "
    
    8593
    +"nickname ~A"
    
    8594
    +msgstr ""
    
    8595
    +
    
    8596
    +#: src/code/package.lisp
    
    8597
    +msgid ""
    
    8598
    +"If Package has Old-Nickname as a local nickname, it is removed.\n"
    
    8599
    +"  Returns true if the nickname existed and was removed.  Otherwise\n"
    
    8600
    +" returns NIL."
    
    8601
    +msgstr ""
    
    8602
    +
    
    8603
    +#: src/code/package.lisp
    
    8604
    +msgid "Returns a list of packages which have a local nickname for Package."
    
    8605
    +msgstr ""
    
    8606
    +
    
    8554 8607
     #: src/code/reader.lisp
    
    8555 8608
     msgid "Float format for 1.0E1"
    
    8556 8609
     msgstr ""