18 мая 2011

Common Lisp. Export struct.

Понадобился функционал структуры, на тебе пожалуйста: defstruct macro.

А вот теперь написали вы стуктуру:

(defstruct (point-primitive (:type (vector ieee754-double))
               (:constructor make-point-primitive (x y)))
    "2d point data - struct contains x y coordinates."
    (x 0.0d0 :type ieee754-double)
    (y 0.0d0 :type ieee754-double))

Данный макрос развернулся в конструктор, копирующую функцию, и методы доступа к членам структуры. Надо эти функции экспортировать. Вот простейший макрос для создания структуры, и экспорта ее из пакета.

(defmacro defstruct-and-export (structure &rest members)
  "Define a structure STRUCT with members MEMBERS and export the
   standard functions created. SPECIALS is a list of extra parameters eg
   ((:print-function pf)). Note double parentheses."
  (append
   `(progn
        ,(if (not (null members))
            (if (stringp (car members))
                `(defstruct ,structure ,(car members) ,@(cdr members))
                `(defstruct ,structure ,@members))
             `(defstruct ,structure))
        ,`(export ,`(quote ,(intern (concatenate 'string "MAKE-" (symbol-name (car structure))))))
        ,`(export ,`(quote ,(intern (concatenate 'string "COPY-" (symbol-name (car structure)))))))
      (if (not (null members))
          (if (stringp (car members))
              (mapcar  #'(lambda (member)
                             `(export ,`(quote ,(intern (concatenate 'string (symbol-name (car structure)) "-" (symbol-name (car member))))))) (cdr members))
              (mapcar  #'(lambda (member)
                             `(export ,`(quote ,(intern (concatenate 'string (symbol-name (car structure)) "-" (symbol-name (car member))))))) members)))
      (if (find :named structure)
          `((export ,`(quote ,(intern (concatenate 'string (symbol-name (car structure)) "-P" ))))
               (deftype ,(intern (symbol-name (car structure))) () '(satisfies ,(intern (concatenate 'string (symbol-name (car structure)) "-P" ))))))))

На вышеприведенном примере структуры макрос разворачивается так:

(PROGN
 (DEFSTRUCT
     (POINT-PRIMITIVE (:TYPE (VECTOR IEEE754-DOUBLE))
      (:CONSTRUCTOR MAKE-POINT-PRIMITIVE (X Y)))
   "2d point data - struct contains x y coordinates."
   (X 0.0d0 :TYPE IEEE754-DOUBLE)
   (Y 0.0d0 :TYPE IEEE754-DOUBLE))
 (EXPORT 'MAKE-POINT-PRIMITIVE)
 (EXPORT 'COPY-POINT-PRIMITIVE)
 (EXPORT 'POINT-PRIMITIVE-X)
 (EXPORT 'POINT-PRIMITIVE-Y))

Комментариев нет:

Отправить комментарий