Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';“的好处是什么?”;将程序与lambda表达式和符号区分开来;_Lambda_Scheme_Evaluation_Lexical_R6rs - Fatal编程技术网

什么';“的好处是什么?”;将程序与lambda表达式和符号区分开来;

什么';“的好处是什么?”;将程序与lambda表达式和符号区分开来;,lambda,scheme,evaluation,lexical,r6rs,Lambda,Scheme,Evaluation,Lexical,R6rs,我正在阅读r6rs(关于算法语言方案的修订报告),在“引言”部分有一个摘要: Scheme是Lisp的第一种主要方言,它将过程与lambda表达式和符号区分开来,对所有变量使用单一词汇环境,并以相同的方式评估过程调用的运算符位置 作为操作数位置。” 我的问题是: “将过程与lambda表达式和符号区分开来”有什么好处 什么是单一词汇环境? 我的理解是,由于词法范围,Scheme中的所有内容都是“词法的”,没有运行时范围,源代码中的位置/位置意味着更多关于环境的信息 如何理解“以与操作数位置相同的

我正在阅读r6rs(关于算法语言方案的修订报告),在“引言”部分有一个摘要:

Scheme是Lisp的第一种主要方言,它将过程与lambda表达式和符号区分开来,对所有变量使用单一词汇环境,并以相同的方式评估过程调用的运算符位置 作为操作数位置。”

我的问题是:

“将过程与lambda表达式和符号区分开来”有什么好处

什么是单一词汇环境? 我的理解是,由于词法范围,Scheme中的所有内容都是“词法的”,没有运行时范围,源代码中的位置/位置意味着更多关于环境的信息

如何理解“以与操作数位置相同的方式计算过程调用的运算符位置”? 我的理解是,运算符位置的符号被计算为操作数位置。例如:

(define test
    (lambda (x)
        ((if (> x 0) + -) 1 2)))
“(>x0)+-)”位于运算符位置,其求值与其他操作数位置的求值相同

什么是单一词汇环境

Scheme有一个单一的词汇环境,但旧的Lisp可以有多个词汇环境。例如,如果为函数(名称)和参数(名称)维护单独的环境,则可以编写:

> (define (foo foo) (+ foo 3))
> (foo 4)
7
“以与以下相同的方式评估过程调用的操作员位置: 操作数位置“

当一个环境用于函数,另一个环境用于参数时,过程调用使用函数参数查找运算符,使用另一个环境查找参数

另请参见此答案(由Kent Pittman作答),并点击lisp-1与lisp-2论文的链接


Scheme是第一个具有词汇环境和闭包的Lisp。它在很大程度上影响了CommonLisp的设计。词汇环境的替代方法是动态绑定。例如:

;; setup (on both)
(define v 10)

(define (adder v)
  (lambda (x) (+ x v))))

;; lexical scheme results
(define add5 (adder 5))
(add5 3) ; ==> 8
(let ((v 6))
  (add5 3)) ; ==> 8

;; dynamic scheme results
(define add5 (adder 5))
(add5 3) ; ==> 13 (since y is the global variable 10)
(let ((v 6))
  (add5 3)) ; ==> 9 (since v is bound to 6 during the call to add5)
Scheme没有动态变量,所以最后一部分不会发生。Common Lisp实际上具有全局定义变量的动态范围,因此,如果您可以在CL中实际测试这一点:

(defparameter *v* 10)
(defparameter *x* 0)

(defun adder (*v*)
  (lambda (*x*) (+ *x* *v*))))

;; lexical scheme results
(defparameter *add5* (adder 5))
(funcall *add5* 3)    ; ==> 13
(let ((*v* 6))
  (funcall *add5* 3)) ; ==> 9
有些lisp方言只有动态绑定。picoLisp和早期版本的elisp就是例子

请注意,Common Lisp使用
funcall
,因为我已经将函数绑定到变量。这是因为它们有两个名称空间。一个用于评估操作员位置的表格,另一个用于评估其他位置的表格。因此,在CL中,可以使用函数
list
和名为
list
的参数,它们是不同的值。下面的代码在Scheme中不起作用,但在CL中工作得非常好:

(let ((list '(1 2 3)))
  (list list list))

; ==> ((1 2 3) (1 2 3)) in CL
; ==> Application: (1 2 3) is not a procedure error in Scheme

如果您对其他Lisp(如Common Lisp)略知一二,这些语句就更有意义。