`eval`执行什么环境? (方案)

时间:2014-02-06 23:01:11

标签: scheme

我有以下myFunc函数,其主体只是一个eval语句。 谁能告诉我为什么eval没有看到a

或者更广泛的问题是,哪里来评估eval的参数?

(define myFunc
  (lambda (a)
    (eval 'a)))

(myFunc 1)       ; <<<< this causes undefined var error, WHY? 

; define a var named a in the global
(define a 2)

(myFunc 2)      ; <<<<< this returns 2, WHY?

1 个答案:

答案 0 :(得分:4)

在您进入计划生涯的几年之前,您不应该使用eval。我的意思是,许多初学者错误地认为eval是必需的,但通常不是。

对于您的示例,eval采用可选的第二个参数environment。如果您未提供第二个参数,则默认值为(interaction-environment)。因此,您的myFunc定义了一个局部变量alambda的参数),并在交互环境中返回a的值。

第一次调用(myFunc 1)时,交互环境中没有a。然后添加a,绑定到2,以便下次调用(myFunc <anynumber>)时,您会在交互环境中获得a,即2

您对myFunc的定义不是惯用的。如果您真的想要一个返回已定义变量值的函数,请使用:

(define myFunc
  (lambda (ignore)
    a))

> (define a 2)
> (myFunc 1234567)
2
> (set! a 10)
> (myFunc -9876)
10