From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Ivan Kanis Newsgroups: gmane.emacs.devel Subject: Re: defining a setter function with gv.el Date: Thu, 30 Aug 2012 18:05:07 +0200 Message-ID: <87obls1i30.fsf@kanis.fr> References: <87ehmsyj2b.fsf@googlemail.com> <87vcg4cij6.fsf@googlemail.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1346342737 3464 80.91.229.3 (30 Aug 2012 16:05:37 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 30 Aug 2012 16:05:37 +0000 (UTC) Cc: emacs devel To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Aug 30 18:05:37 2012 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1T77FQ-0006nm-Js for ged-emacs-devel@m.gmane.org; Thu, 30 Aug 2012 18:05:36 +0200 Original-Received: from localhost ([::1]:50941 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T77FO-0005uo-0Q for ged-emacs-devel@m.gmane.org; Thu, 30 Aug 2012 12:05:34 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:56120) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T77FC-0005uL-US for emacs-devel@gnu.org; Thu, 30 Aug 2012 12:05:32 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T77F6-0000Mc-29 for emacs-devel@gnu.org; Thu, 30 Aug 2012 12:05:22 -0400 Original-Received: from mail-wg0-f49.google.com ([74.125.82.49]:62579) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T77F5-0000L7-QS for emacs-devel@gnu.org; Thu, 30 Aug 2012 12:05:15 -0400 Original-Received: by wgbdt14 with SMTP id dt14so1170042wgb.30 for ; Thu, 30 Aug 2012 09:05:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20120113; h=from:to:subject:references:face:cc:x-hashcash:date:in-reply-to :message-id:user-agent:mime-version:content-type; bh=zoZe6XILIuB37ZxHpKyCTgEov53wLooSOsXz7PEj8Ow=; b=IfJKzmc2G+tOfGzN4S2Er1X2zzApR3IYbAuo/LEyn4iwYTeuVKZD/DVTCGTnBE0fUQ nvpcPRwjBvwMP9/JRYVv7nClJ+w+dKxBBiRNnOrDrBLUtzn0r1EQvpl0PijSb6oDqEy9 KNhrBdSbNYpGbzZXkZddJzJ1e45mye5TFyHKkL54RtAJK/HMZwmra9hYwchREvVx4gIW USB8ebOpgspCrVaLjDOe+wfIuPv1chLxj2sjmYLulyvQNwEc6XbA7UCRGjfS0wed8V6q oskAvbCDmRVVLCj0SWzP0/m2JhcGf0TxyWlx+iGxv3fwgFjqnluLfTzDMLZbUUtCfBPg v89w== Original-Received: by 10.180.84.104 with SMTP id x8mr1456810wiy.20.1346342714236; Thu, 30 Aug 2012 09:05:14 -0700 (PDT) Original-Received: from tao ([89.83.137.164]) by mx.google.com with ESMTPS id k20sm1371518wiv.11.2012.08.30.09.05.10 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 30 Aug 2012 09:05:12 -0700 (PDT) Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAAXNSR0IArs4c6QAAAB5QTFRF IBkXUxMTOCwoTC4qcUY8iFxQmmper31txpaJ/v/8aKZ1oAAAAcVJREFUOMt100tu2zAQAFDCXnUZ oAcIqG68LZULVLQBbwuSiffm6AIRRyeotAySJoVu2+FPpJWWC3/4NKOZocSW/yxWfnJ2+Bdwzhj7 8gleWVy7DXC2rkMNr2V/zRbghXIwthf3VbIA9Ffc71vZCSFyCEsBggtNS8ludwvfmhYA0Vn9o4DP zMWxR7+cPWzAYFzwM0ModtdmcDbDS6i/hT7L+RZof5yCXGrYe5jn2YO6BYMjgY+51tCIAqHgBLwR pwLnGuRjAKyBJkuN4yd4U92uCY1vUr2D/c5b8DuxyQwfOHUeaLqDJhnkkuGXbB56h2C1IVBdgncc bBi6feroa9B6jUDojnQPQKupbyXyeeCE1oT7Oqrt+SnfY3mkiyGA/3AmD3H5g32CcBx6hY8pRkwJ 9PpcjRGobUfprFnhAa1vepwcgMOhwG+pdSgKHFU9HAvoAH6XUl7lDUCCq5Qb6GMbVm3Aj++qDYCt wdBc/YHgOFCmS3mjDMRcSE2qY4E3Q3PVIQRQmeodNH4QEbRUFZzW+VotzwX4yTcRTySOML1qjcE5 hTirVqDHkMAP0PjAywp3d18JZtqzvr9zDYD+GaSKtE6Zlr/DLPNFmOcvBAAAAABJRU5ErkJggg== X-Hashcash: 1:20:120830:monnier@iro.umontreal.ca::FsHwBPETows2tKp1:00000000000000000000000000000000000002o9L In-Reply-To: (Stefan Monnier's message of "Mon, 27 Aug 2012 16:28:32 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2.50 (gnu/linux) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 74.125.82.49 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:152902 Archived-At: Hi Stefan, As I was trying to make sense of it I tried the following in my *scratch* buffer: (setq lexical-binding t) (defun alist-get (key alist) "Get the value associated to KEY in ALIST." (declare (gv-expander (lambda (do) (macroexp-let2 macroexp-copyable-p k key (gv-letplace (getter setter) alist (macroexp-let2 nil p `(assoc ,k ,getter) (funcall do `(cdr ,p) (lambda (v) `(if ,p (setcdr ,p ,v) ,(funcall setter `(cons (cons ,k ,v) ,getter)))))))))))) (setq foo '((bar . foo) (baz . qux))) (alist-get 'bar foo) => "Get the value associated to KEY in ALIST." It's as if everything in declare was not evaluated. Where did I err? Stefan Monnier wrote: > and the code we want to generate for a `setf' is along the lines of: > > (let* ((k KEY) > (a ALIST) > (p (assoc k (alist-getter a))) > (v VAL)) > (if p (setcdr p v) > (alist-setter a (cons (cons k v) (alist-getter a))))) Yes this is what needs to be generated. I don't understand why there are two lambdas in alist-get. There is no map type function so I don't understand what they do. Is there any chance you would uncomment this function so that I can use it in my code? Take care, -- Ivan Kanis http://ivan.kanis.fr History is a gallery of pictures in which there are few original and many copies. -- Alexis de Tocqueville