What's the point of using the set!
assignment operator in scheme? Why not just rebind
a variable to a new value using define
?
> (define x 100) > (define (value-of-x) x) ;; value-of-x closes over "x" > x 100 > (value-of-x) 100 > (set! x (+ x 1)) > x 101 > (value-of-x) 101 > (define x (+ x 1)) > x 102 > (value-of-x) 102 >
set scheme allows you to set the graphics scheme to be used. The default setting is s2color. Option. permanently specifies that in addition to making the change right now, the scheme setting be remembered and become the default setting when you invoke Stata. Remarks and examples.
In a let expression, the initial values are computed before any of the variables become bound; in a let* expression, the bindings and evaluations are performed sequentially; while in a letrec expression, all the bindings are in effect while their initial values are being computed, thus allowing mutually recursive ...
A begin returns the value of the last expression in the sequence. For example, the begin expression above returns the value returned by the call to bar .
Though both define
and set!
will redefine a value when in the same scope, they do two different things when the scope is different. Here's an example:
(define x 3) (define (foo) (define x 4) x) (define (bar) (set! x 4) x) (foo) ; returns 4 x ; still 3 (bar) ; returns 4 x ; is now 4
As you can see, when we create a new lexical scope (such as when we define
a function), any names defined within that scope mask the names that appear in the enclosing scope. This means that when we define
d x
to 4
in foo
, we really created a new value for x
that shadowed the old value. In bar
, since foo
does not exist in that scope, set!
looks to the enclosing scope to find, and change, the value of x
.
Also, as other people have said, you're only supposed to define
a name once in a scope. Some implementations will let you get away with multiple define
s, and some won't. Also, you're only supposed to use set!
on a variable that's already been define
d. Again, how strictly this rule is enforced depends on the implementation.
It is not usually permitted to define
a variable more than once. Most REPLs allow it for convenience when you're trying things out, but if you try to do that in a Scheme program it will give you an error.
For example, in mzscheme, the program
#lang scheme (define x 1) (define x 2)
gives the error
test.ss:3:8: module: duplicate definition for identifier at: x in: (define-values (x) 2)
In addition, define
has a different meaning when used inside of other contexts. The program
#lang scheme (define x 1) x (let () (define x 2) x) x
has the output
1 2 1
This is because define
s inside of certain constructs are actually treated as letrec
s.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With