2011-04-23 27 views
5

Yo uso let para crear una variable temporal, y luego uso esta variable temporal en la siguiente declaración. Sin embargo, se quejó DrScheme,¿Cómo funciona `let` en Scheme?

let: bad syntax (not an identifier and expression for a binding) in: temp 

Ésta es mi fragmento de código:

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

Me pregunto si el valor de la variable creado por let tiene que ser conocido en el momento compilado?

Editar Acabo de descubrir, falta ().

Gracias,

Respuesta

9

Aunque no es exactamente el problema que está experimentando, pero un aparte basan en el cuestionamiento acerca de la secuencia de evaluar los argumentos, let es también "azúcar sintáctico" para un lambda seguido de sus argumentos que primero se evalúan y luego se pasan al lambda que luego se evalúa.

Por ejemplo:

(let ((a (list 1 2 3)) 
     (b (list 4 5 6))) 
    (cons a b)) 

es lo mismo que:

((lambda (list-a list-b) (cons list-a list-b)) (list 1 2 3) (list 4 5 6)) 

Por lo tanto, si alguna vez se pregunta sobre la secuencia de evaluación, los argumentos son evaluados antes de evaluar plenamente el cuerpo (y un argumento no puede referirse a un argumento que lo precede ... use let* para algo que requiera enlaces como ese).

+0

Vea la sección "La verdad sobre dejar" en https://people.eecs.berkeley.edu/~bh/ssch9/lambda.html – nicoabie

+0

Lectura interesante ... mirando mi respuesta aquí, diría que sí, y no, en el sentido de que 'let' puede implementarse como lambda con una invocación de esa lambda, pero es más que eso. Si escribe un intérprete de esquema desde cero, como en SICP, verá que 'let' tiene una gran cantidad de contabilidad asociada a él, ya que está nombrando el resultado de la expresión. – Jason

4

Es necesario poner otro conjunto de paréntesis alrededor de sus declaraciones let:

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