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: Fri, 19 Aug 2005 05:47:07 +0200 Organization: Informatimago Message-ID: <87y86y7flw.fsf@thalassa.informatimago.com> References: <1124368267.221312.44210@g44g2000cwa.googlegroups.com> <871x4r9vbx.fsf@thalassa.informatimago.com> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1124423586 28608 80.91.229.2 (19 Aug 2005 03:53:06 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Fri, 19 Aug 2005 03:53:06 +0000 (UTC) Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Fri Aug 19 05:52:57 2005 Return-path: Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1E5xvx-000157-Qv for geh-help-gnu-emacs@m.gmane.org; Fri, 19 Aug 2005 05:52:48 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1E5xzJ-0001nl-A6 for geh-help-gnu-emacs@m.gmane.org; Thu, 18 Aug 2005 23:56:13 -0400 Original-Path: shelby.stanford.edu!newsfeed.stanford.edu!syros.belnet.be!news.belnet.be!feed.news.tiscali.de!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:geXKsMxEsGdeOclbAZu0PD3ksAQ= Original-Lines: 61 Original-NNTP-Posting-Host: 62.93.174.79 Original-X-Trace: DXC=b5UHR[d2S^[0^a84Yi3E9Ri_giQ7bjRVZbBd4DjF1d]Q Original-Xref: shelby.stanford.edu gnu.emacs.help:133317 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:28844 X-Report-Spam: http://spam.gmane.org/gmane.emacs.help:28844 Barry Margolin writes: > In article <871x4r9vbx.fsf@thalassa.informatimago.com>, > Pascal Bourguignon wrote: >> Write a defsetf-er for funcall! >[...] >> (define-setf-method funcall (fun &rest args) >> "setf-method for (funcall fun args...)" >> (let* ((vfun (eval fun)) > > This won't work if the code is compiled. SETF is expanded at compile > time, but you need to EVAL the variable at run time (and need to do it > each time through the loop). Indeed. One problem to implement a run-time setf funcall, is that setf-ers are defined from the name of the function: (defun example (cons) (car cons)) (defun set-example (cons value) (format *trace-output* "set-example") (setf (car cons) value)) (setf (symbol-function 'test) (symbol-function 'example)) (setf (symbol-function test) (symbol-function example)) (defun set-test (cons value) (format *trace-output* "set-test") (setf (car cons) value)) (defsetf test set-test) (setf x (cons 0 0)) [44]> (setf (example x) 1) set-example 1 [45]> (setf (test x) 2) set-test 2 But: (setf fun (function test)) (setf (funcall fun x) 1) could not know whether to use set-example or set-test, for (and (eq fun (function example)) (eq fun (function test))) To make (setf (funcall ...) ...) work, we'd have to associate the setters to the function objects instead of the function names (the symbols). -- __Pascal Bourguignon__ http://www.informatimago.com/ -----BEGIN GEEK CODE BLOCK----- Version: 3.12 GCS d? s++:++ a+ C+++ UL++++ P--- L+++ E+++ W++ N+++ o-- K- w--- O- M++ V PS PE++ Y++ PGP t+ 5+ X++ R !tv b+++ DI++++ D++ G e+++ h+ r-- z? ------END GEEK CODE BLOCK------