我使用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
创建的变量的值是否必须在编译时知道?
修改
我刚想通了,遗漏了()
。
谢谢,
答案 0 :(得分:11)
虽然不是你正在经历的问题,但是根据你对评估参数的顺序的问题,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*
来表示需要绑定的东西那样的。)
答案 1 :(得分:4)
您需要在let
声明周围添加另一组括号:
(define (case-one-helper str)
(let ((temp (substring str (+ 3 (string-contains str "my")))))
(substring temp (string-contains temp " "))))