Skip to content
defalias.lisp 2.7 KiB
Newer Older
;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*-
;;;
;;; --- Creating aliases in CL namespaces
;;;

(in-package :iolib.base)

(defvar *namespaces* nil)

(defmacro defalias (alias original)
  (destructuring-bind (namespace new-name)
Stelian Ionescu's avatar
Stelian Ionescu committed
      alias
    (assert (member namespace *namespaces*) (namespace)
            "Namespace ~A does not exist" namespace)
    `(progn
       ,@(make-alias namespace original new-name)
       ',new-name)))

(defmacro defnamespace (namespace &optional docstring)
  (check-type namespace symbol)
  (check-type docstring (or null string))
  `(progn
     (pushnew ',namespace *namespaces*)
     ,@(when docstring
         `((handler-bind ((warning #'muffle-warning))
             (setf (documentation ',namespace 'namespace) ,docstring))))
     ',namespace))
(defgeneric make-alias (namespace original alias))

(defnamespace function
  "The namespace of ordinary and generic functions.")

Stelian Ionescu's avatar
Stelian Ionescu committed
(defmethod make-alias ((namespace (eql 'function))
  `((setf (fdefinition ',alias)
          (fdefinition ',original))
    (setf (documentation ',alias 'function)
          (documentation ',original 'function))
    (defalias (compiler-macro ,alias) ,original)))

(defnamespace macro
  "The namespace of macros.")

Stelian Ionescu's avatar
Stelian Ionescu committed
(defmethod make-alias ((namespace (eql 'macro))
  `((setf (macro-function ',alias)
          (macro-function ',original))
    (setf (documentation ',alias 'function)
          (documentation ',original 'function))))
Stelian Ionescu's avatar
Stelian Ionescu committed

(defnamespace compiler-macro
  "The namespace of compiler macros.")

(defmethod make-alias ((namespace (eql 'compiler-macro))
                       original alias)
  `((setf (compiler-macro-function ',alias)
          (compiler-macro-function ',original))
    (setf (documentation ',alias 'compiler-macro)
          (documentation ',original 'compiler-macro))))
Stelian Ionescu's avatar
Stelian Ionescu committed
(defnamespace special
  "The namespace of special variables.")

Stelian Ionescu's avatar
Stelian Ionescu committed
(defmethod make-alias ((namespace (eql 'special))
  `((define-symbol-macro ,alias ,original)
    (setf (documentation ',alias 'variable)
          (documentation ',original 'variable))))
Stelian Ionescu's avatar
Stelian Ionescu committed

(defnamespace constant
Stelian Ionescu's avatar
Stelian Ionescu committed
  "The namespace of constant variables.")
Stelian Ionescu's avatar
Stelian Ionescu committed

Stelian Ionescu's avatar
Stelian Ionescu committed
(defmethod make-alias ((namespace (eql 'constant))
  `((define-symbol-macro ,alias ,original)
    (setf (documentation ',alias 'variable)
          (documentation ',original 'variable))))
Stelian Ionescu's avatar
Stelian Ionescu committed

(defnamespace class
  "The namespace of classes.")

(defmethod make-alias ((namespace (eql 'class))
                       original alias)
  `((setf (find-class ,alias)
          (find-class ,original))
    (setf (documentation ',alias 'type)
          (documentation ',original 'type))))