; It is usually said that Newlisp functions evaluate to themselves.
; Is it really the truth? Let us test this claim.
(println "===================")
(set 'f (lambda(x)x))
(println f)
(println (eval f))
; Both of these are (lambda(x)x). OK, let us ask interpreter if
; they are equal directly:
(println "===================")
(println (= f (eval f))) ; true
; Hm ... one can be still suspicious. Let us try this one:
(println "===================")
(set 'f (lambda(x)x))
(push '(println "Hello!") f 1)
(println f) ;(lambda (x) (println "Hello!") x)
(println (eval f)) ;(lambda (x) (println "Hello!") x)
; So far so good. And what if we push something in (eval f)?
(println "===================")
(set 'f (lambda(x)x))
(push '(println "Hello!") (eval f) 1)
(println f) ;(lambda(x)x)
(println (eval f)) ;(lambda(x)x)
; Huh? The outputs are still equal, but how it is that our pushing
; of a friendly expression is not accepted neither in f nor in
; (eval f)? What is the explanation?
; Strictly speaking, functions do not evaluate EXACTLY to themselves,
; instead, they evaluate to the freshly generated copies of themselves.
; In last example, (eval f) was such a new copy, and (println "Hello")
; es pushed in the copy of the function f, not in the function itself.
; When (eval f) is called second time, in (println (eval f))
; another, completely new copy of f is returned - and it does not
; know that we already tried to teach previous copy new tricks.
Does the Function Really Evaluate to Itself?
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment