Changeset 4440
- Timestamp:
- 10/17/03 19:10:19 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/j/src/org/armedbear/lisp/setf.lisp
r4209 r4440 2 2 ;;; 3 3 ;;; Copyright (C) 2003 Peter Graves 4 ;;; $Id: setf.lisp,v 1.3 4 2003-10-06 00:26:24piso Exp $4 ;;; $Id: setf.lisp,v 1.35 2003-10-17 19:10:19 piso Exp $ 5 5 ;;; 6 6 ;;; This program is free software; you can redistribute it and/or … … 22 22 (defun get-setf-method-inverse (form inverse setf-function) 23 23 (let ((new-var (gensym)) 24 25 24 (vars nil) 25 (vals nil)) 26 26 (dolist (x (cdr form)) 27 27 (push (gensym) vars) … … 29 29 (setq vals (nreverse vals)) 30 30 (values vars vals (list new-var) 31 (if setf-function 32 `(,@inverse ,new-var ,@vars) 33 `(,@inverse ,@vars ,new-var)) 34 `(,(car form) ,@vars)))) 31 (if setf-function 32 `(,@inverse ,new-var ,@vars) 33 (if (functionp (car inverse)) 34 `(funcall ,@inverse ,@vars ,new-var) 35 `(,@inverse ,@vars ,new-var))) 36 `(,(car form) ,@vars)))) 35 37 36 38 ;;; If a macro, expand one level and try again. If not, go for the … … 41 43 (macroexpand-1 form environment) 42 44 (if expanded 43 44 45 45 (get-setf-expansion expansion environment) 46 (get-setf-method-inverse form `(funcall #'(setf ,(car form))) 47 t)))) 46 48 47 49 (defun get-setf-expansion (form &optional environment) … … 51 53 (values nil nil (list new-var) 52 54 `(setq ,form ,new-var) form))) 53 54 55 ((setq temp (get (car form) 'setf-inverse)) 56 (get-setf-method-inverse form `(,temp) nil)) 55 57 ((setq temp (get (car form) 'setf-expander)) 56 58 (funcall temp form environment)) 57 58 59 (t 60 (expand-or-get-setf-inverse form environment))))) 59 61 60 62 ;;; ROTATEF (from GCL) … … 70 72 (setq access-forms (nreverse access-forms)) 71 73 `(let* ,(nconc pairs 72 73 74 (mapcar #'list stores (cdr access-forms)) 75 (list (list (car (last stores)) (car access-forms)))) 74 76 ,@store-forms 75 77 nil)) … … 97 99 `(funcall ,inverse ,@(cdr place) ,value-form) 98 100 `(,inverse ,@(cdr place) ,value-form)) 99 100 101 101 `(let* (,@(mapcar #'list dummies vals)) 102 (multiple-value-bind ,newval ,value-form 103 ,setter)))))))) 102 104 ((oddp count) 103 105 (error "odd number of args to SETF")) … … 105 107 (do ((a args (cddr a)) (l nil)) 106 108 ((null a) `(progn ,@(nreverse l))) 107 109 (setq l (cons (list 'setf (car a) (cadr a)) l))))))) 108 110 109 111 ;;; Redefined in define-modify-macro.lisp.
Note: See TracChangeset
for help on using the changeset viewer.