【问题标题】:How does `let` work in Scheme?`let` 在 Scheme 中如何工作?
【发布时间】:2011-04-23 20:43:55
【问题描述】:

我使用let创建一个临时变量,然后在下一条语句中使用这个临时变量。然而,DrScheme 抱怨道,

let: bad syntax (not an identifier and expression for a binding) in: temp

这是我的代码 sn-p:

(define (case-one-helper str)
  (let (temp (substring str (+ 3 (string-contains str "my"))))
    (substring temp (string-contains temp " "))))

我想知道let 创建的变量的值是否必须在编译时知道?

编辑 我刚刚发现,缺少()

谢谢,

【问题讨论】:

    标签: scheme


    【解决方案1】:

    虽然不完全是您遇到的问题,但基于您对评估参数顺序的质疑,let 也是 lambda 的“语法糖”,然后是首先评估然后再评估的参数传递给 lambda,然后对其进行评估。

    例如:

    (let ((a (list 1 2 3))
          (b (list 4 5 6)))
         (cons a b))
    

    等同于:

    ((lambda (list-a list-b) (cons list-a list-b)) (list 1 2 3) (list 4 5 6))
    

    因此,如果您想知道评估顺序,则在评估主体之前对参数进行完全评估(并且一个参数不能引用它之前的参数......对于需要类似绑定的东西,请使用 let* )。

    【讨论】:

    • 参见people.eecs.berkeley.edu/~bh/ssch9/lambda.html中的“关于让的真相”部分
    • 有趣的阅读...在这里查看我的答案,我会说是,也不是,因为let 可以通过调用该 lambda 实现为 lambda,但它更多比起那个来说。如果您像在 SICP 中那样从头开始编写方案解释器,您会看到 let 在命名表达式结果时有很多与之相关的簿记。
    【解决方案2】:

    您需要在 let 声明周围加上另一组括号:

    (define (case-one-helper str)
      (let ((temp (substring str (+ 3 (string-contains str "my")))))
        (substring temp (string-contains temp " "))))
    

    【讨论】:

      猜你喜欢
      • 2011-06-30
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2018-09-13
      • 2013-09-22
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多