Changeset 4159


Ignore:
Timestamp:
10/01/03 14:29:36 (19 years ago)
Author:
piso
Message:

Work in progress.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/lisp/setf.lisp

    r4157 r4159  
    22;;;
    33;;; Copyright (C) 2003 Peter Graves
    4 ;;; $Id: setf.lisp,v 1.28 2003-10-01 14:01:21 piso Exp $
     4;;; $Id: setf.lisp,v 1.29 2003-10-01 14:29:36 piso Exp $
    55;;;
    66;;; This program is free software; you can redistribute it and/or
     
    2020(in-package "SYSTEM")
    2121
     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
    2236(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))))
    4173
    4274;;; ROTATEF (from GCL)
Note: See TracChangeset for help on using the changeset viewer.