2009-11-16 4 views
7

J'ai commencé récemment à apprendre Lisp et je voulais écrire un programme qui utilise l'interface gtk. J'ai installé les liaisons lambda-gtk (sur CMUCL). Je veux avoir la capacité putpixel/getpixel sur un pixbuf. Mais j'ai trouvé que je suis incapable de diriger la mémoire d'accès. (ou ne sais pas comment)Pointeurs en Lisp?

Fonction (gdk: pixbuf-get-pixels pixbuf) me renvoie un numéro de mémoire, je suppose. En C++, je peux facilement accéder au pixel dont j'ai besoin. Y at-il un moyen d'écrire mon propre putpixel en Lisp?

Répondre

7

En mode Lisp, un moyen moderne et portable d'accéder aux bibliothèques C et d'accéder directement à la mémoire est CFFI.

Vous pouvez l'utiliser comme ceci:

>(defparameter *p* (cffi:foreign-alloc :unsigned-char :count 10)) 
;; allocate 10 bytes 
*P* 
> (setf (cffi:mem-aref *p* :unsigned-char 0) 10) 
;; access *p* as an array of bytes and set its 0th element to 10 
10 
> (cffi:mem-aref *p* :unsigned-char 0) 
;; access *p* as an array of bytes and take its 0th element 
10 
> (cffi:make-pointer 123) 
;; make a pointer that points to given address 
#.(SB-SYS:INT-SAP #X0000007B)