如何`让'在Scheme中工作?

问题描述 投票:6回答:2

我使用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创建的变量的值是否必须在编译时知道?

编辑我刚想通了,缺少()

谢谢,

scheme
2个回答
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*来获取需要类似绑定的东西)。


4
投票

你需要在let声明周围添加另一组括号:

(define (case-one-helper str)
  (let ((temp (substring str (+ 3 (string-contains str "my")))))
    (substring temp (string-contains temp " "))))
© www.soinside.com 2019 - 2024. All rights reserved.