From: Stefan Monnier Date: Thu, 8 Nov 2012 13:34:06 +0000 (-0500) Subject: * lisp/emacs-lisp/gv.el (gv-ref, gv-deref): New function and macro. X-Git-Tag: emacs-24.3.90~173^2~18^2~174 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d14bb752ea51331ce2fb459c6ffacd8b11f80bb0;p=emacs.git * lisp/emacs-lisp/gv.el (gv-ref, gv-deref): New function and macro. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 7c51b139ec3..e0ff05aa7dc 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2012-11-08 Stefan Monnier + + * emacs-lisp/gv.el (gv-ref, gv-deref): New function and macro. + 2012-11-07 Michael Albinus * notifications.el (notifications-get-server-information-method): diff --git a/lisp/emacs-lisp/gv.el b/lisp/emacs-lisp/gv.el index d6c91539a90..34e29ba1cbd 100644 --- a/lisp/emacs-lisp/gv.el +++ b/lisp/emacs-lisp/gv.el @@ -433,6 +433,24 @@ The return value is the last VAL in the list. `(logior (logand ,v ,mask) (logand ,getter (lognot ,mask)))))))))) +;;; References + +;;;###autoload +(defmacro gv-ref (place) + "Return a reference to PLACE. +This is like the `&' operator of the C language." + (gv-letplace (getter setter) place + `(cons (lambda () ,getter) + (lambda (gv--val) ,(funcall setter 'gv--val))))) + +;;;###autoload +(defsubst gv-deref (ref) + "Dereference REF, returning the referenced value. +This is like the `*' operator of the C language. +REF must have been previously obtained with `gv-ref'." + (declare (gv-setter (lambda (v) `(funcall (cdr ,ref) ,v)))) + (funcall (car ref))) + ;;; Vaguely related definitions that should be moved elsewhere. ;; (defun alist-get (key alist)