我有以下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)
在您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)