C
sds answer , , , C,
, C LISP. C, , , (.. ).
, , , Lisp, :
#include<stdio.h>
int a = 3;
int mutate( int a ) {
return a = 5;
}
int main() {
mutate( a );
printf( "%d\n", a );
return 0;
}
, a in mutate - , mutate. , a, , . , mutate variable a, mutate. " [] , [a]. , , , . C:
#include<stdio.h>
int a = 3;
int mutate( int *a ) {
return (*a = 5);
}
int main() {
mutate( &a );
printf( "%d\n", a );
return 0;
}
Common Lisp , , . , a a cons, car 3, cons car:
CL-USER> (defparameter *a* (cons 3 nil))
*A*
CL-USER> (defun mutate (cons)
(setf (car cons) 5))
MUTATE
CL-USER> (mutate *a*)
5
CL-USER> (car *a*)
5
- Lisp, C, "" - , . Common Lisp, cons-, - , .
C-, Common Lisp , .
- , , , . - , . setf. Common Lisp, , .
Common Lisp setf. , sds , , , setf, symbol-value. (defparameter *a* 3) *a*, (symbol-value '*a*) , *a*. place value, , :
(defmacro mutate (place value)
`(setf ,place ,value))
C
, , . , , C.
(defmacro make-pointer (place)
`(lambda (op &optional value)
(ecase op
((read) ,place)
((write) (setf ,place value)))))
(let* ((x 3)
(xp (make-pointer x)))
(funcall xp 'write 5) ; write a new value to x
(list (funcall xp 'read) ; read the value from x through xp
x)) ; read the value from x directly
;=> (5 5)
make-pointer , . read write, , write, . read, . write, .
. , , , (print 2) 2:
(make-pointer (aref some-array (print 2)))
2 , , , , . , , .
( , ?), , Lisp ( Lisp Machine Lisp, Common Lisp)) , C-, , Lisp, . , , , 13. Lisp reïmplementations Common Lisp, Alan Crowe's, , () :
( ), :
Crowe , get-setf-expansion , , (print 2) . , , !