(set! var expr)Example:
(define x 10) (write x) (set! x (+ x 1)) (write x)
You can only use set! on a variable after it's been defined.
There are also functions set-car! and set-cdr! to assign into the car or cdr of a cons cell. Finally, there is a special form do for iteration.
Caution!! In the latest version of Dr Scheme (4.1.1), set-car! and set-cdr! are available in R5RS but not in the Pretty Big dialect. In Pretty Big, they are called set-mcar! and set-mcdr!, and only work on mutable cons cells (created with mcons), and more generally on mutable lists; but not on ordinary cons cells and lists.
Example (in R5RS) -- change to make a mutable list for latest Pretty Big:
(define x '(1 2 3 4)) (write x) ; prints (1 2 3 4) (set-car! x 100) (write x) ; prints (100 2 3 4) (set-cdr! x ()) (write x) ; prints (100)Making a circular list:
(define circ '(a b)) (set-cdr! (cdr circ) circ)When you pass a list to a function in Scheme, a reference to the list is passed, rather than a copy. Thus, if you use set-car! or set-cdr! to do list surgery inside the function, the actual parameter will be affected.
(define (change-it x) (set-car! x 'frog)) (define animals '(rabbit horse squirrel monkey)) (change-it animals)However, consider:
(define (test x) (write x) (set! x 100) (write x)) (define y '(1 2 3)) (test y) ; prints (1 2 3) then 100 (write y) ; prints (1 2 3) ... y is unaltered
(define-struct point (x y)) ;; we now have accessors, tests, and setters defined: (define p (make-point 10 10)) ;; try these: ;; (point? p) ;; (point-x p) ;; (point-y p) ;; (point-y p) ;; (set-point-x! p 100) ;; (set-point-y! p 200) (define (dist p1 p2) (let ((dx (- (point-x p1) (point-x p2))) (dy (- (point-y p1) (point-y p2)))) (sqrt (+ (* dx dx) (* dy dy))))) (define a (make-point 0 0)) (define b (make-point 3 4)) ;; (dist p1 p2)A struct is not any existing type in Scheme -- it's a new beast!
(define (what-is-it v) (cond ((number? v) 1) ((procedure? v) 2) ((cons? v) 3) ((string? v) 4) ((symbol? v) 5) ((null? v) 6) (else 7)))