“让”在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
有很多与之相关的簿记。