X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=contrib%2Fsb-posix%2Fdesignator.lisp;h=ef33e4005bbace0874fcdfc381c6a666df72e772;hb=3db292921fabecad0ba8107097d763ba2a044136;hp=b7cd3c3950776d7e921687d0f6a46e7e8e4bee1a;hpb=1f7401c39a46466c307938c8f6cf7db224741981;p=sbcl.git diff --git a/contrib/sb-posix/designator.lisp b/contrib/sb-posix/designator.lisp index b7cd3c3..ef33e40 100644 --- a/contrib/sb-posix/designator.lisp +++ b/contrib/sb-posix/designator.lisp @@ -1,18 +1,26 @@ -(in-package :sb-posix-internal) +(in-package :sb-posix) (defvar *designator-types* (make-hash-table :test #'equal)) -(defmacro define-designator (name result &body conversions) - (let ((type `(quote (or ,@(mapcar #'car conversions)))) - (typename (intern (format nil "~A-~A" - (symbol-name name) - (symbol-name :designator)) - #.*package*))) +(defmacro define-designator (name (lisp-type alien-type) doc + &body conversions) + (let ((designator-type `(or ,@(mapcar #'car conversions))) + (designator-name (intern (format nil "~A-~A" + (symbol-name name) + (symbol-name :designator)) + #.*package*)) + (name (intern (symbol-name name) :sb-posix))) `(progn + (deftype ,name () + ,@(when doc (list (first doc))) + ',lisp-type) + (deftype ,designator-name () + ,@(when doc (list (second doc))) + ',designator-type) (eval-when (:compile-toplevel :load-toplevel :execute) - (deftype ,typename () ,type) - (setf (gethash ',name *designator-types*) ',result)) - (defun ,(intern (symbol-name name) :sb-posix) (,name) - (declare (type ,typename ,name)) - (etypecase ,name - ,@conversions))))) + (setf (gethash ',name *designator-types*) ',alien-type)) + (declaim (ftype (function (t) (values ,lisp-type &optional)) ,name)) + (defun ,name (,name) + ,@(when doc (list (third doc))) + (etypecase ,name + ,@conversions)))))