如何`让'在Scheme中工作?

时间:2011-04-23 20:43:55

标签: 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 (string-contains temp " "))))

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

修改 我刚想通了,遗漏了()

谢谢,

2 个答案:

答案 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 " "))))