1 ;;;; various DEFSETFs, pulled into one file for convenience in doing
2 ;;;; them as early in the build process as possible so as to avoid
3 ;;;; hassles with invoking SETF FOO before DEFSETF FOO and thus
4 ;;;; compiling a call to some nonexistent function #'(SETF FOO)
6 ;;;; This software is part of the SBCL system. See the README file for
9 ;;;; This software is derived from the CMU CL system, which was
10 ;;;; written at Carnegie Mellon University and released into the
11 ;;;; public domain. The software is in the public domain and is
12 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
13 ;;;; files for more information.
15 (sb!int
:/show0
"entering defsetfs.lisp")
17 ;;; from alieneval.lisp
18 (in-package "SB!ALIEN")
19 (defsetf slot %set-slot
)
20 (defsetf deref
(alien &rest indices
) (value)
21 `(%set-deref
,alien
,value
,@indices
))
22 (defsetf %heap-alien %set-heap-alien
)
25 (in-package "SB!BIGNUM")
26 (defsetf %bignum-ref %bignum-set
)
28 ;;; from bit-bash.lisp
30 (defsetf word-sap-ref %set-word-sap-ref
)
32 ;;; from debug-int.lisp
34 (defsetf stack-ref %set-stack-ref
)
35 (defsetf debug-var-value %set-debug-var-value
)
36 (defsetf debug-var-value %set-debug-var-value
)
37 (defsetf breakpoint-info %set-breakpoint-info
)
39 ;;; from defstruct.lisp
40 (in-package "SB!KERNEL")
41 (defsetf %instance-ref %instance-set
)
43 (defsetf %raw-instance-ref
/word %raw-instance-set
/word
)
44 (defsetf %raw-instance-ref
/single %raw-instance-set
/single
)
45 (defsetf %raw-instance-ref
/double %raw-instance-set
/double
)
46 (defsetf %raw-instance-ref
/complex-single %raw-instance-set
/complex-single
)
47 (defsetf %raw-instance-ref
/complex-double %raw-instance-set
/complex-double
)
49 (defsetf %instance-layout %set-instance-layout
)
50 (defsetf %funcallable-instance-info %set-funcallable-instance-info
)
51 (defsetf %funcallable-instance-layout %set-funcallable-instance-layout
)
53 ;;; from early-setf.lisp
54 (in-package "SB!IMPL")
56 ;;; (setf aref/bit/sbit) are implemented using setf-functions,
57 ;;; because they have to work with (setf (apply #'aref array subscripts))
58 ;;; All other setfs can be done using setf-functions too, but I
59 ;;; haven't found technical advantages or disadvantages for either
61 #-sb-xc-host
(defsetf car %rplaca
)
62 #-sb-xc-host
(defsetf first %rplaca
)
63 #-sb-xc-host
(defsetf cdr %rplacd
)
64 #-sb-xc-host
(defsetf rest %rplacd
)
66 (eval-when (#-sb-xc
:compile-toplevel
:load-toplevel
:execute
)
67 (defun %cxr-setf-expander
(sub-accessor setter
)
68 (flet ((expand (place-reader original-form
)
69 (let ((temp (sb!xc
:gensym
"LIST"))
70 (newval (sb!xc
:gensym
"NEW")))
72 `((,@place-reader
,@(cdr original-form
)))
74 `(,setter
,temp
,newval
)
75 `(,(if (eq setter
'%rplacd
) 'cdr
'car
) ,temp
)))))
76 (if (eq sub-accessor
'nthcdr
) ; random N
77 (lambda (access-form env
)
78 (declare (ignore env
))
79 (destructuring-bind (n list
) (cdr access-form
) ; for effect
80 (declare (ignore n list
)))
81 (expand '(nthcdr) access-form
))
82 ;; NTHCDR of fixed N, or CxxxxR composition
83 (lambda (access-form env
)
84 (declare (ignore env
))
85 (destructuring-bind (list) (cdr access-form
) ; for effect
86 (declare (ignore list
)))
87 (expand sub-accessor access-form
))))))
90 (macrolet ((def (name &optional alias
&aux
(string (string name
)))
91 `(eval-when (:compile-toplevel
:load-toplevel
:execute
)
94 '(,(symbolicate "C" (subseq string
2)))
95 ',(symbolicate "%RPLAC" (subseq string
1 2)))))
96 (!quietly-defsetf
',name closure
'(list) nil nil
)
98 `((!quietly-defsetf
',alias closure
'(list) nil nil
)))))))
99 ;; Rather than expand into a DEFINE-SETF-EXPANDER, install a single closure
100 ;; as the expander and capture just enough to distinguish the variations.
130 ;; FIFTH through TENTH
132 (macrolet ((def (name subform
)
133 `(eval-when (:compile-toplevel
:load-toplevel
:execute
)
134 (!quietly-defsetf
',name
(%cxr-setf-expander
',subform
'%rplaca
)
136 (def fifth
(nthcdr 4)) ; or CDDDDR
137 (def sixth
(nthcdr 5))
138 (def seventh
(nthcdr 6))
139 (def eighth
(nthcdr 7))
140 (def ninth
(nthcdr 8))
141 (def tenth
(nthcdr 9)))
143 ;; CLHS says under the entry for NTH:
144 ;; "nth may be used to specify a place to setf. Specifically,
145 ;; (setf (nth n list) new-object) == (setf (car (nthcdr n list)) new-object)"
146 ;; which means that it's wrong to use %SETNTH because in the second form,
147 ;; (NTHCDR ...) is a subform of the CAR expression, and so must be
148 ;; bound to a temporary variable.
150 (eval-when (:compile-toplevel
:load-toplevel
:execute
)
151 (!quietly-defsetf
'nth
(%cxr-setf-expander
'nthcdr
'%rplaca
) '(n list
)
154 #-sb-xc-host
(defsetf elt %setelt
)
155 #-sb-xc-host
(defsetf row-major-aref %set-row-major-aref
)
156 #-sb-xc-host
(defsetf svref %svset
)
157 #-sb-xc-host
(defsetf char %charset
)
158 #-sb-xc-host
(defsetf schar %scharset
)
159 (defsetf %array-dimension %set-array-dimension
)
160 (defsetf %vector-raw-bits %set-vector-raw-bits
)
161 #-sb-xc-host
(defsetf symbol-value set
)
162 #-sb-xc-host
(defsetf symbol-global-value set-symbol-global-value
)
163 #-sb-xc-host
(defsetf symbol-plist %set-symbol-plist
)
164 #-sb-xc-host
(defsetf fill-pointer %set-fill-pointer
)
165 (defsetf sap-ref-8 %set-sap-ref-8
)
166 (defsetf signed-sap-ref-8 %set-signed-sap-ref-8
)
167 (defsetf sap-ref-16 %set-sap-ref-16
)
168 (defsetf signed-sap-ref-16 %set-signed-sap-ref-16
)
169 (defsetf sap-ref-32 %set-sap-ref-32
)
170 (defsetf signed-sap-ref-32 %set-signed-sap-ref-32
)
171 (defsetf sap-ref-64 %set-sap-ref-64
)
172 (defsetf signed-sap-ref-64 %set-signed-sap-ref-64
)
173 (defsetf sap-ref-word %set-sap-ref-word
)
174 (defsetf signed-sap-ref-word %set-signed-sap-ref-word
)
175 (defsetf sap-ref-sap %set-sap-ref-sap
)
176 (defsetf sap-ref-lispobj %set-sap-ref-lispobj
)
177 (defsetf sap-ref-single %set-sap-ref-single
)
178 (defsetf sap-ref-double %set-sap-ref-double
)
179 #!+long-float
(defsetf sap-ref-long %set-sap-ref-long
)
180 #-sb-xc-host
(defsetf subseq
(sequence start
&optional
(end nil
)) (v)
181 `(progn (replace ,sequence
,v
:start1
,start
:end1
,end
)
184 ;;; from fdefinition.lisp
185 (in-package "SB!IMPL")
186 #-sb-xc-host
(defsetf fdefinition %set-fdefinition
)
189 (in-package "SB!KERNEL")
190 (defsetf code-header-ref code-header-set
)
194 (defsetf context-register %set-context-register
)
195 (defsetf context-float-register %set-context-float-register
)
198 (sb!int
:/show0
"leaving defsetfs.lisp")