如何`让'在Scheme中工作?

Cha*_*han 6 scheme

let用来创建一个临时变量,然后在下一个语句中使用这个临时变量.然而,DrScheme抱怨说,

let: bad syntax (not an identifier and expression for a binding) in: temp
Run Code Online (Sandbox Code Playgroud)

这是我的代码片段:

(define (case-one-helper str)
  (let (temp (substring str (+ 3 (string-contains str "my"))))
    (substring temp (string-contains temp " "))))
Run Code Online (Sandbox Code Playgroud)

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

编辑 我刚想通了,遗失了().

谢谢,

Jas*_*son 12

虽然不是你正在经历的问题,但是基于你对评估参数的顺序的问题而言,let也是一个lambda的"语法糖",后面是它的参数,首先被评估然后传递给lambda,这是然后评估.

例如:

(let ((a (list 1 2 3))
      (b (list 4 5 6)))
     (cons a b))
Run Code Online (Sandbox Code Playgroud)

是相同的:

((lambda (list-a list-b) (cons list-a list-b)) (list 1 2 3) (list 4 5 6))
Run Code Online (Sandbox Code Playgroud)

所以,如果你想知道评估序列,那么在评估主体之前会完全评估参数(并且一个参数不能引用它之前的参数...... let*用于需要类似绑定的东西).


Rac*_*lit 5

您需要在let声明周围放置另一组括号:

(define (case-one-helper str)
  (let ((temp (substring str (+ 3 (string-contains str "my")))))
    (substring temp (string-contains temp " "))))
Run Code Online (Sandbox Code Playgroud)