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

One*_*ree 3 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?
Run Code Online (Sandbox Code Playgroud)

GoZ*_*ner 5

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

对于您的示例,eval采用可选的第二个参数,即environment. 如果您不提供第二个参数,则默认值为(interaction-environment). 因此,您myFunc定义了一个局部变量a(to 的参数lambda)并返回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
Run Code Online (Sandbox Code Playgroud)