2011-04-23 80 views
5

我用let来创建一个临时变量,然后在下一个语句中使用这个临时变量。然而,DrScheme抱怨,`让`在Scheme中工作?

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创造的价值有在编译时间知道?

编辑 我刚刚想通了,错过了()

感谢,

回答

9

虽然不完全是您所遇问题,而是一边根据您有关序列的质疑在评估参数时,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*表示需要绑定的东西)。

+0

请参阅https://people.eecs.berkeley.edu/~bh/ssch9/lambda.html – nicoabie 2017-11-22 02:05:11

+0

中的“让真相”一节有趣的阅读...在这里查看我的答案,我会说是,并且不,从某种意义上说,'let'可以作为一个lambda表达式来实现,并且调用lambda表达式,但不止于此。如果您像SICP一样从头开始编写计划解释器,您会看到'let'有很多关于它的记录,因为您正在命名表达式的结果。 – Jason 2017-11-25 16:52:22

4

你需要把另一组括号周围的let声明:

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