|
From: | Paul F. Dietz |
Subject: | [Gcl-devel] Re: setf |
Date: | Fri, 03 Oct 2003 19:49:47 -0500 |
User-agent: | Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20030225 |
Camm Maguire wrote:
Greetings! Paul, my investigations into the defgeneric and methods issues is leading me back to the issue of the proper treatment of '(setf foo) in 'function, 'flet, 'fboundp, etc. Could you please briefly summarize for me what is supposed to happen, or what sections of the spec govern this? It should be easy to get '(setf foo) recognized as a function name, but I don't know how it should react with defsetf -- my feeling is that in the absence of any (defun (setf foo) ...), (function '(setf foo)) -> (lambda (x) (setf foo x)), and to hope that the macroexpansion if any handles the rest. How far off is this?
I don't believe defsetf causes a (setf ...) function to be defined at all. Instead, it causes a setf *expander* to be defined. Macros like SETF would call GET-SETF-EXPANSION to get this expansion. Example from SBCL: * (defun foo (x) (car x)) FOO * (defsetf foo rplaca) FOO * #'(setf foo) debugger invoked on condition of type UNDEFINED-FUNCTION: The function (SETF FOO) is undefined. Within the debugger, you can type HELP for help. At any command prompt (within the debugger or not) you can type (SB-EXT:QUIT) to terminate the SBCL executable. The condition which caused the debugger to be entered is bound to *DEBUG-CONDITION*. You can suppress this message by clearing *DEBUG-BEGINNER-HELP-P*. restarts (invokable by number or by possibly-abbreviated name): 0: [ABORT ] Reduce debugger level (leaving debugger, returning to toplevel). 1: [TOPLEVEL] Restart at toplevel READ/EVAL/PRINT loop. (FDEFINITION 1 (SETF FOO))[:EXTERNAL] 0] 0 * (macroexpand '(setf (foo x) y)) (RPLACA X Y) T * Paul
[Prev in Thread] | Current Thread | [Next in Thread] |