为什么'let'引入的绑定范围有限?

Amu*_*umu 1 lisp variables scope let

在Lisp中(我仍在使用SBCL学习Lisp),声明了局部变量let,范围仅在该表达式中.这是为什么?与其他命令式语言(如C/C++/Java ...)不同,我们可以在其功能范围内的任何位置自由使用局部变量.

小智 6

只是另一个小小的洞察力是什么让.它基本上是一个"向后拼写"的匿名函数的应用程序.

我将使用JavaScript作为插图,因为它更像C语言,它很好地说明了这个概念.

(function(variableA, variableB){
  console.log("variableA = " + variableA);
  console.log("variableA * variableB = " + variableA * variableB);})(6, 7);
Run Code Online (Sandbox Code Playgroud)

现在,让我们命名部分:from functionto ;}是函数定义.(definition)(arguments)是申请.让表达式基本上做同样的事情,即它调用带有参数的匿名函数,你在函数内部使用它作为变量.所以,如果你考虑前面的例子,用let形式重写它会产生如下:

(let(variableA = 6, variableB = 7){
  console.log("variableA = " + variableA);
  console.log("variableA * variableB = " + variableA * variableB);});
Run Code Online (Sandbox Code Playgroud)

(JavaScript不支持let,但是,所以上面不是一个有效的代码示例,但它应该是一个例子)

还应注意,这不是正是如此简单.因为在更复杂的情况下,您可能希望在构造另一个时引用其中一个参数 - 然后您将使用(let* ...),或者您希望将函数用作此表达式的参数,然后您将使用(flet ...)(labels ...).但总的想法是一样的.