[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

binding and assignment

It occurred to me that there is an inconsistency in the scheme/lisp
treatment of assignment when it comes to symbols -- in all other
cases assignment means changing the contents of a cell of some kind,
while assignment to a symbol is treated as a renaming operation.  I
figured this had resulted from the functional programming perspective
-- a binding is simply the name for a value in a particular context...

It seems non-intuitive that assigning to "a" is actually removing 
the name "a" from some value and naming a different value "a".

I thought that a slightly different model might be useful --

Let binding be an irrevocable operation.  Create a new data type
called a "variable" that has the following property -- When a variable
is returned from eval, it is dereferenced so that its contents are
returned, except when it is the first argument to a set! special form
or the result of a 'var' special form.  My intent is that 'variable'
is the only mutable data type -- I'll give a few examples before
explaining the benefits of this model:

(define fact
      (lambda (n)
	(if (< n 2)
	  (* n (fact (1- n))))))
defines fact as you would imagine and works the same way you would
think -- however, following this with:

(set! fact 5)

would return an error -- fact is not bound to a variable

After evaluating:

(define fact2
      (var (lambda (n)
	     (if (< n 2)
	       (* n (fact2 (1- n)))))))

(fact2 x) would give the same result as (fact x), but

(set! fact2 5) would succeed.

Note: typing "fact2" at this point would return 5, but
the expression: (var? fact2) -> t while (var? fact) -> nil

This produces several benefits: 

1) the 'setf' form of CL is obtained for free in a much less
kludgey way -- e.g. after: 

(define w (list (var 3) (var 4))) =>   w = (3 4)


(set! (cadr w) 5) 

would cause w to appear as: (3 5)

2) built-in functions can be defined at the top level without using the
'var' form so that they cannot be redefined...

3) the need for things like "named-lambda" is lessened -- If a recursive
function is defined without using 'var', the value will never change
and you get the effect of a named-lambda for free

4) assignment becomes completely consistent and only one assignment
special form is needed instead of one for each type of mutable data --
It is no longer necessary to have vector-set!, set-car!,...

5) quoted constants are now actually guaranteed to be constant --
no more accidental program modification 

6) inlining (or direct linking -- not through a symbol) of built-ins
is now allowable without constraints

Any comments?

|   Jerry Jackson                       UUCP:  seismo!esosun!jackson          |
|   Geophysics Division, MS/22          ARPA:  esosun!jackson@seismo.css.gov  |
|   SAIC                                SOUND: (619)458-4924                  |
|   10210 Campus Point Drive                                                  |
|   San Diego, CA  92121                                                      |