我使用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
也是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
声明周围添加另一组括号:
(define (case-one-helper str)
(let ((temp (substring str (+ 3 (string-contains str "my")))))
(substring temp (string-contains temp " "))))