“让”在Scheme中如何工作?

“让”在Scheme中如何工作?,scheme,Scheme,我使用let创建一个临时变量,然后在下一个语句中使用这个临时变量。但是,DrScheme抱怨说, let: bad syntax (not an identifier and expression for a binding) in: temp 这是我的代码片段: (define (case-one-helper str) (let (temp (substring str (+ 3 (string-contains str "my")))) (substring temp (st

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

let: bad syntax (not an identifier and expression for a binding) in: temp
这是我的代码片段:

(define (case-one-helper str)
  (let (temp (substring str (+ 3 (string-contains str "my"))))
    (substring temp (string-contains temp " "))))
我想知道由
let
创建的变量的值是否必须在编译时已知

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


谢谢,

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

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

虽然不完全是您遇到的问题,但基于您对参数求值顺序的质疑,
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*

请参阅有趣阅读中的“关于let的真相”一节。。。在这里查看我的答案,我会说是,也会说不是,从某种意义上说,
let
可以通过调用lambda实现为lambda,但不仅仅如此。如果您像在SICP中那样从头开始编写scheme解释器,您将看到在命名表达式的结果时,
let
有很多与之相关的簿记。