Python syntax in Lisp and Scheme

Pascal Bourguignon spam at thalassa.informatimago.com
Mon Oct 6 07:05:10 EDT 2003


gregm at cs.uwa.edu.au writes:
> What does it mean to take a variable-name as an argument? How is that
> different to taking a pointer? What does it mean to take "code" as an
> argument? Is that different to taking a function as an argument?

The  difference is  that  you can  declare  (compilation-time) it  and
associated variables or functions.

For example,  I recently  defined this macro,  to declare at  the same
time a  class and a  structure, and to  define a couple of  methods to
copy the objects to and from structures.

That's so useful that even cpp  provide us with a ## operator to build
new symbols.

(DEFMACRO DEFCLASS-AND-STRUCT (NAME SUPER-CLASSES ATTRIBUTES OPTIONS)
  (LET ((STRUCT-NAME (INTERN (FORMAT NIL "~A-STRUCT" NAME))))
    `(PROG1
         (DEFCLASS ,NAME ,SUPER-CLASSES ,ATTRIBUTES ,OPTIONS)
       (DEFSTRUCT ,STRUCT-NAME
         ,@(MAPCAR (LAMBDA (ATTRIBUTE)
                     (CONS
                      (CAR ATTRIBUTE)
                      (CONS (GETF (CDR ATTRIBUTE) :INITFORM NIL)
                            (IF (GETF (CDR ATTRIBUTE) :TYPE NIL)
                              NIL
                              (LIST :TYPE (GETF (CDR ATTRIBUTE) :TYPE))))))
                   ATTRIBUTES))
       (DEFMETHOD COPY-TO-STRUCT ((SELF ,NAME))
         (MAKE-STRUCT
          ',NAME
          ,@(MAPCAN (LAMBDA (ATTRIBUTE)
                      `(,(INTERN (STRING (CAR ATTRIBUTE)) "KEYWORD")
                        (COPY-TO-STRUCT (SLOT-VALUE SELF ',(CAR ATTRIBUTE)))))
                    ATTRIBUTES)))
       (DEFMETHOD COPY-FROM-STRUCT ((SELF ,NAME) (STRUCT ,STRUCT-NAME))
         ,@(MAPCAR
            (LAMBDA (ATTRIBUTE)
              `(SETF (SLOT-VALUE SELF ',(CAR ATTRIBUTE))
                     (,(INTERN (FORMAT NIL "~A-~A"
                                       STRUCT-NAME (CAR ATTRIBUTE))) STRUCT)))
            ATTRIBUTES)
         SELF)
       ))
  );;DEFCLASS-AND-STRUCT


-- 
__Pascal_Bourguignon__
http://www.informatimago.com/
Do not adjust your mind, there is a fault in reality.




More information about the Python-list mailing list