lambda - 嵌套let和lambda在Scheme中的排序

标签 lambda scheme

Scheme 中的两个函数有什么区别,其中一个定义如下 -

(define doSomething
    (lambda (x)
          (let (f (100))
               (f x))))

另一个是这样的?-

(define doSomething
          (let (f (100))
            (lambda (x) 
               (f x)))) 

换句话说,lambda 是在 let 之前还是之后有什么关系?

最佳答案

您的代码将无法运行。 :-)

我假设您指的是这些:

(lambda (x)
  (let ((f 100))
    (+ f x)))

(let ((f 100))
  (lambda (x)
    (+ f x)))

在这两种情况下,您都会返回传入的参数加上 100。

但是,主要区别(忽略有关 let 如何只是 lambda 的语法糖的技术细节)是在第二个版本中,f是一个自由变量。假设我们这样做:

(let ((f 100))
  (list (lambda (x)
          (+ f x))
        (lambda (x)
          (set! f x))))

这会返回一个包含两个 lambda 的列表:第一个与之前的相同,第二个允许您更改 f 的值。两个 lambda 访问相同的 f,因此运行 setter影响稍后对第一个 lambda 的调用。

关于lambda - 嵌套let和lambda在Scheme中的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5523048/

相关文章:

C# 循环遍历一个列表并比较对象

c# - 使用 lambda 表达式的测试方法的静态分析 CA1811 错误

java - lambda 表达式的序列化有哪些安全风险?

lisp - 尾递归Collat​​z猜想为什么会导致Scheme中的栈溢出?

syntax - 请帮我理解方案: No Arguments?

java - 除非调用相应的方法,否则 Lambda 主体不会执行

java - 当再次处理相同的数据和任务时,Java 8 流是否会重用自身?

scheme - miniKanren:如何定义#s和#u?

scheme - 实现方案 if 子句仅使用避孕套

scheme - 如何使用 Script-Fu 解析出基本文件名