我有以下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?
答案 0 :(得分:4)
在您进入计划生涯的几年之前,您不应该使用eval
。我的意思是,许多初学者错误地认为eval
是必需的,但通常不是。
对于您的示例,eval
采用可选的第二个参数environment
。如果您未提供第二个参数,则默认值为(interaction-environment)
。因此,您的myFunc
定义了一个局部变量a
(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