From d14bb752ea51331ce2fb459c6ffacd8b11f80bb0 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 8 Nov 2012 08:34:06 -0500 Subject: [PATCH] * lisp/emacs-lisp/gv.el (gv-ref, gv-deref): New function and macro. --- lisp/ChangeLog | 4 ++++ lisp/emacs-lisp/gv.el | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) 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) -- 2.39.5