0.8.16.25:
[sbcl.git] / contrib / sb-posix / designator.lisp
1 (in-package :sb-posix-internal)
2 (defvar *designator-types* (make-hash-table :test #'equal))
3
4 (defmacro define-designator (name result &body conversions)
5   (let ((type `(quote (or ,@(mapcar #'car conversions))))
6         (typename (intern (format nil "~A-~A"
7                                   (symbol-name name)
8                                   (symbol-name :designator))
9                           #.*package*)))
10     `(progn
11       (eval-when (:compile-toplevel :load-toplevel :execute)
12         (deftype ,typename () ,type)
13         (setf (gethash ',name *designator-types*) ',result))
14       (defun ,(intern (symbol-name name) :sb-posix) (,name)
15         (declare (type ,typename ,name))
16         (etypecase ,name
17           ,@conversions)))))
18