我最近开始学习 Lisp,想写一个使用 gtk 接口的程序。我已经安装了 lambda-gtk 绑定(在 CMUCL 上)。我想在 pixbuf 上有 putpixel/getpixel 的能力。但我发现我无法直接访问内存。(或者只是不知道如何)
函数 (gdk:pixbuf-get-pixels pixbuf) 返回我一个数字 - 我猜是内存地址。在 C++ 中,我可以轻松获得所需的像素。有什么方法可以在 Lisp 中编写我自己的 putpixel 吗?
我最近开始学习 Lisp,想写一个使用 gtk 接口的程序。我已经安装了 lambda-gtk 绑定(在 CMUCL 上)。我想在 pixbuf 上有 putpixel/getpixel 的能力。但我发现我无法直接访问内存。(或者只是不知道如何)
函数 (gdk:pixbuf-get-pixels pixbuf) 返回我一个数字 - 我猜是内存地址。在 C++ 中,我可以轻松获得所需的像素。有什么方法可以在 Lisp 中编写我自己的 putpixel 吗?
在 Lisp 中,访问 C 库和进行直接内存访问的现代且可移植的方式是CFFI。
你可以像这样使用它:
>(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)