Ok, esta es una pregunta bastante básica: estoy siguiendo los videos del SICP, y estoy un poco confundido acerca de las diferencias entre define
, let
y set!
.¡Diferencia entre define, let y set!
1) De acuerdo con Sussman en el video, define
puede adjuntar un valor a avariable una sola vez (excepto cuando está en REPL), en particular, dos definiciones en línea no están permitidas. Sin embargo, Guile felizmente ejecuta este código
(define a 1)
(define a 2)
(write a)
y salidas 2, como se esperaba. Las cosas son un poco más complicado porque si trato de hacer esto (EDIT: después de las definiciones anteriores)
(define a (1+ a))
consigo un error, mientras que
(set! a (1+ a))
está permitido. Aún así, no creo que esta sea la única diferencia entre set!
y define
: ¿qué es lo que me falta?
2) La diferencia entre define
y let
me desconcierta aún más. Sé que en teoría let
se utiliza para vincular variables en el ámbito local. Aún así, me parece que esto funciona de la misma con define
, por ejemplo, puedo reemplazar
(define (f x)
(let ((a 1))
(+ a x)))
con
(define (g x)
(define a 1)
(+ a x))
y f
y g
funcionan de la misma: en particular, la variable a
no está consolidado fuera g
también.
La única forma en que puedo ver esto útil es que let
puede tener un alcance más corto que la definición de toda la función. Aún así, me parece que siempre se puede agregar una función anónima para crear el alcance necesario e invocarlo de inmediato, al igual que hace uno en JavaScript. Entonces, ¿cuál es la verdadera ventaja de let
?
Usted debe adecuadamente guión '(+ a x)' 'en la definición de F', ya que es en el ámbito de' let'. –
Tiene usted razón, gracias – Andrea
Depende del sistema de esquema que utilice. – knivil