Personalmente, creo que este es un pobre ejemplo de la importancia de local
y no creo que haya entendido completamente la importancia de la pregunta, entonces lo que haré es pasar por el concepto que debe notar, luego vaya a través de tu ejemplo y finalmente darte un mejor ejemplo.
CONCEPTO
En primer lugar, la idea de local aquí (entre muchos otras cosas) es aclarar el significado de fragmentos de código.
SU EJEMPLO
Vamos a considerar su ejemplo, se define una constante local llamado m
que parece ser correcta. Aunque, dado que la letra m
no tiene un significado significativo, su solución parece no estar clara. Entonces, ¿cómo podríamos solucionar tu solución?
Tenemos que dar m
un nombre que identifica claramentem
lo que representa. Por lo tanto, comenzamos por considerar directamente lo m
representa que es (maxi (rest alon))
Bueno (maxi (rest alon))
dice simplemente encontrar el número máximo de (rest alon)
lo tanto, permite cambiar el nombre de m
a find-max
Ahora su código es el siguiente:
;; maxi : non-empty-lon -> number
;; to determine the largest number on alon
(define (maxi alon)
(cond
[(empty? (rest alon)) (first alon)]
[else (local ((define find-max (maxi (rest alon))))
(cond
[(> (first alon) find-max) (first alon)]
[(> find-max (first (rest alon))) find-max]
[else (first (rest alon))]))]))
Sustitución m
con find-max
hace que el código mucho más claro! Dejándonos con una regla de , proporcione a sus constantes nombres significativos.
mi ejemplo
Para aclarar aún más, consideremos una función que consume dos puntos y produce la pendiente del segmento de línea creado mediante la conexión de los dos puntos. Nuestro primer enfoque podría ser:
;;where x1,y1 belong to point 1 and x2,y2 belong to point 2
(define (find-slope x1 y1 x2 y2)
(sqrt (+ (sqr (- x2 x1))) (sqr (- y2 y1))))
Pero podría ser más claro usando local
:
(define (find-slope x1 y1 x2 y2)
(local
[(define delta-x (- x2 x1))
(define delta-y (- y2 y1))]
(sqrt (+ (sqr delta-x)) (sqr delta-y))))
Observe cómo delta describe lo que hace la función de esa parte; encontrando el cambio en x o y. Entonces, lo que tenemos que aprender aquí es que, aunque la primera solución puede utilizar menos código, la segunda solución describe lo que estamos haciendo y puede leerse fácilmente.Esa fue toda la idea de la pregunta y puede parecer estúpida, pero es una convención que tienden a enfatizar al aprender el esquema en un entorno académico.
En cuanto a la eficacia de la primera y segunda solución, la segunda solución es definitivamente mucho más rápida por razones obvias (después de ver cómo Racket evalúa expresiones), pero ese no era el objetivo principal de la pregunta.
Esperanza esto ayuda
Bueno, aquí hay una [pregunta socrática] (http://en.wikipedia.org/wiki/Socratic_questioning) para ti: ¿Por qué crees que la versión no 'local' es" probablemente más rápida "? Voy a publicar una respuesta real a esta pregunta después de escuchar tus pensamientos. :-) –
Sifu Chris, gracias por preguntar mis suposiciones ASS. Estoy aprendiendo a apreciar tu visión más y más. Así que parece que la versión "local" es mucho más rápida que la versión recursiva "pura" cuando la lista es grande. Llegué a esta conclusión llamando a la función de tiempo en una lista con 20 números y me asombró ver una diferencia promedio de 550 veces en el rendimiento. Sin embargo, no sé cómo funciona Racket/Scheme internamente para explicar la discrepancia. Pasar por la versión "local" parece mostrar que 20 versiones de la función local "m" están produciendo un valor. – Greenhorn