|
|
|
|
|
by sedachv
5051 days ago
|
|
> What I can't wrap my head around is how one would implement pointer-arithmetic with these closures? (defstruct memptr
mem
(ptr 0))
(defun allocate-memory (size) ;; shared by malloc and static allocation
(make-memptr :mem (make-array size :adjustable t :initial-element 0)))
(defstruct place-ptr
closure)
(defmacro vacietis.c:mkptr& (place) ;; need to deal w/function pointers
(let ((new-value (gensym)))
`(make-place-ptr :closure (lambda (&optional ,new-value)
(if ,new-value
(setf ,place ,new-value)
,place)))))
(defun vacietis.c:deref* (ptr)
(etypecase ptr
(memptr (aref (memptr-mem ptr) (memptr-ptr ptr)))
(place-ptr (funcall (place-ptr-closure ptr)))))
(defun (setf vacietis.c:deref*) (new-value ptr)
(etypecase ptr
(memptr (setf (aref (memptr-mem ptr) (memptr-ptr ptr)) new-value))
(plate-ptr (funcall (place-ptr-closure ptr) new-value))))
(defmethod vacietis.c:+ ((x number) (y number))
(+ x y))
(defmethod vacietis.c:+ ((ptr memptr) (x integer))
(make-memptr :mem (memptr-mem ptr) :ptr (+ x (memptr-ptr ptr))))
(defmethod vacietis.c:- ((ptr1 memptr) (ptr2 memptr))
(assert (eq (memptr-mem ptr1) (memptr-mem ptr2)) ()
"Trying to subtract pointers from two different memory segments")
(make-memptr :mem (memptr-mem ptr1) :ptr (- (memptr-ptr ptr1) (memptr-ptr ptr2))))
As you can see I don't do anything with type declarations, so arithmetic performance is going to be terrible. Multiple levels of pointer indirection work correctly with pointer arithmetic, since all pointers which can be legally added/subtracted are first-class objects. |
|