From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Pascal Bourguignon Newsgroups: gmane.emacs.help Subject: Re: No setf-method known for funcall Date: Thu, 18 Aug 2005 16:24:34 +0200 Organization: Informatimago Message-ID: <871x4r9vbx.fsf@thalassa.informatimago.com> References: <1124368267.221312.44210@g44g2000cwa.googlegroups.com> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1124375224 24725 80.91.229.2 (18 Aug 2005 14:27:04 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Thu, 18 Aug 2005 14:27:04 +0000 (UTC) Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Thu Aug 18 16:27:03 2005 Return-path: Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1E5lLx-00047O-Fx for geh-help-gnu-emacs@m.gmane.org; Thu, 18 Aug 2005 16:26:45 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1E5lPT-0004d2-IB for geh-help-gnu-emacs@m.gmane.org; Thu, 18 Aug 2005 10:30:23 -0400 Original-Path: shelby.stanford.edu!newsfeed.stanford.edu!news.tele.dk!news.tele.dk!small.news.tele.dk!fr.ip.ndsoftware.net!newsfeed.freenet.de!feeder2.ecngs.de!ecngs!feeder.ecngs.de!195.40.4.120.MISMATCH!easynet-quince!easynet.net!easynet-post2!not-for-mail Original-Newsgroups: gnu.emacs.help Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) Cancel-Lock: sha1:8dtiKxLo0y5wBQySsGt+P0X/OpY= Original-Lines: 51 Original-NNTP-Posting-Host: 62.93.174.79 Original-X-Trace: DXC=K;>73Lg3TkKmD?Mn1DnB[NiZdW>mQFP3FbBd4DjF1d]A Original-Xref: shelby.stanford.edu gnu.emacs.help:133295 Original-To: help-gnu-emacs@gnu.org X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:28822 X-Report-Spam: http://spam.gmane.org/gmane.emacs.help:28822 kcin@mytrashmail.com writes: > I'd like to setf a "place" which is retrieved indirectly with a funcall > call: > > > (defstruct my > a b) > > (setq myinstance (make-my)) > > (setf (my-a myinstance) 33) ; this works > > (setq my-get-func 'my-a) > (setf (funcall my-get-func myinstance) 33) > ; this doesn't work > ; "No setf-method known for funcall" Write a defsetf-er for funcall! (require 'cl) (defmacro with-gensyms (syms &rest body) `(let ,(mapcar (lambda (s) `(,s ',(gensym (symbol-name s)))) syms) ,@body)) (define-setf-method funcall (fun &rest args) "setf-method for (funcall fun args...)" (let* ((vfun (eval fun)) (vexp (get-setf-method `(,vfun ,@args)))) (message "\n%S\n" vexp) (when (null vexp) (error "There is no defsetf for %s in %S" vfun (cons fun args))) vexp)) (progn (setf x (cons :a :b)) (setf f (function cdr)) (setf (funcall f x) 1) (insert (format "--> %S\n" x)) (dolist (f (list (function car) (function cdr))) (setf (funcall f x) 2)) (insert (format "--> %S\n" x))) --> (:a . 1) --> (2 . 2) -- "By filing this bug report you have challenged the honor of my family. Prepare to die!"