Changeset 4159
- Timestamp:
- 10/01/03 14:29:36 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/j/src/org/armedbear/lisp/setf.lisp
r4157 r4159 2 2 ;;; 3 3 ;;; Copyright (C) 2003 Peter Graves 4 ;;; $Id: setf.lisp,v 1.2 8 2003-10-01 14:01:21piso Exp $4 ;;; $Id: setf.lisp,v 1.29 2003-10-01 14:29:36 piso Exp $ 5 5 ;;; 6 6 ;;; This program is free software; you can redistribute it and/or … … 20 20 (in-package "SYSTEM") 21 21 22 (defun get-setf-method-inverse (form inverse setf-function) 23 (let ((new-var (gensym)) 24 (vars nil) 25 (vals nil)) 26 (dolist (x (cdr form)) 27 (push (gensym) vars) 28 (push x vals)) 29 (setq vals (nreverse vals)) 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)))) 35 22 36 (defun get-setf-expansion (form &optional environment) 23 (cond ((symbolp form) 24 (let ((new-var (gensym))) 25 (values nil nil (list new-var) 26 `(setq ,form ,new-var) form))) 27 ((get (car form) 'setf-inverse) 28 (let ((vars (mapcar #'(lambda (x) (gensym)) (cdr form))) 29 (store (gensym))) 30 (values vars 31 (cdr form) 32 (list store) 33 `(,(get (car form) 'setf-inverse) 34 ,@vars ,store) 35 (cons (car form) vars)))) 36 ((get (car form) 'setf-expander) 37 (funcall (get (car form) 'setf-expander) form environment)) 38 (t 39 (error "no SETF expansion for ~S" form)))) 40 37 (let (temp) 38 (cond ((symbolp form) 39 (let ((new-var (gensym))) 40 (values nil nil (list new-var) 41 `(setq ,form ,new-var) form))) 42 ((setq temp (get (car form) 'setf-inverse)) 43 (get-setf-method-inverse form `(,temp) nil)) 44 ((setq temp (get (car form) 'setf-expander)) 45 (funcall temp form environment)) 46 (t 47 (expand-or-get-setf-inverse form environment))))) 48 49 ;;; If a macro, expand one level and try again. If not, go for the 50 ;;; SETF function. 51 (defun expand-or-get-setf-inverse (form environment) 52 (multiple-value-bind 53 (expansion expanded) 54 (macroexpand-1 form environment) 55 (if expanded 56 (get-setf-expansion expansion environment) 57 (get-setf-method-inverse form `(funcall #'(setf ,(car form))) 58 t)))) 59 60 (defun get-setf-method-inverse (form inverse setf-function) 61 (let ((new-var (gensym)) 62 (vars nil) 63 (vals nil)) 64 (dolist (x (cdr form)) 65 (push (gensym) vars) 66 (push x vals)) 67 (setq vals (nreverse vals)) 68 (values vars vals (list new-var) 69 (if setf-function 70 `(,@inverse ,new-var ,@vars) 71 `(,@inverse ,@vars ,new-var)) 72 `(,(car form) ,@vars)))) 41 73 42 74 ;;; ROTATEF (from GCL)
Note: See TracChangeset
for help on using the changeset viewer.