anchor.diff:      #'(lambda (gslist)
   	(unwind-protect
   	     (map-glist 'list #'identity gslist element-type)
  -	  (gslist-free gslist)))))
  -
  -(defmethod cleanup-form (list (type (eql 'gslist)) &rest args)
  -  (declare (ignore type args))
  -  `(gslist-free ,list))
  +	  (destroy-gslist gslist element-type)))))
  +
  +(defmethod copy-from-alien-form (gslist (type (eql 'gslist)) &rest args)
  +  (declare (ignore type))
  +  (destructuring-bind (element-type) args
  +    `(map-glist 'list #'identity ,gslist ',element-type)))
  +
  +(defmethod from-alien-function ((type (eql 'gslist)) &rest args)
  +  (declare (ignore type))
  +  (destructuring-bind (element-type) args
  +    #'(lambda (gslist)
  +	(map-glist 'list #'identity gslist element-type))))
  +
  +(defmethod cleanup-form (gslist (type (eql 'gslist)) &rest args)
  +  (declare (ignore type args))
  +  (destructuring-bind (element-type) args
  +    `(destroy-gslist ,gslist ',element-type)))
   
   (defmethod cleanup-function ((type (eql 'gslist)) &rest args)
     (declare (ignore type args))
  -  #'gslist-free)
  +  (destructuring-bind (element-type) args
  +    #'(lambda (gslist)
  +	(destroy-gslist gslist element-type))))
   
   
   
  
positive.code:     `(let ((glist ,glist))
        (unwind-protect
  	   (map-glist 'list #'identity glist ',element-type)
  	(glist-free glist)))))
  
  (defmethod from-alien-function ((type (eql 'glist)) &rest args)
    (declare (ignore type))
  
negative.code: (defbinding (glist-free "g_list_free") () nil
    (glist pointer))
  
  (defun destroy-glist (glist element-type)
    (loop
     with destroy = (destroy-function element-type)
     as tmp = glist then (glist-next tmp)
     until (null-pointer-p tmp)
     do (funcall destroy tmp 0))
    (glist-free glist))
  
  (defmethod alien-type ((type (eql 'glist)) &rest args)
    (declare (ignore type args))
  