es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ambigüedad con `quote` en el libro “The Little Schemer”. ¿Cuándo se debe utilizar una expresión precedida de una comilla y cuándo no?

El Pequeño Sabelotodo 4a edición de Friedman y Felleisen comienza definiendo atom?:


(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))

Luego en el primer capítulo hay preguntas que preguntan si tal o cual es un átomo o no. Por ejemplo (la nota al pie se reformula para mayor claridad):

¿Es cierto que esto es un átomo?

atom*

*en Scheme: (quote atom) o 'atom

Se dice que turkey, 1492, u y *abc$ también son átomos.

Todo esto excepto 1492 debe ir precedido por un ' – de lo contrario, obtenemos un Error: execute: unbound symbol:

Tanto 1492 como '1492 funcionan. De ahora en adelante, ¿cómo sé cuándo algo debe o no debe ir precedido por una comilla (')??? Es confuso. Ojalá los autores hubieran sido explícitos con las comillas — ¿realmente agrega tanto ruido visual tener una sola comilla (') antes de las expresiones??? ¿Debería simplemente asumir que todo va precedido por una comilla (')?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Según la definición de atom?, un átomo es algo que no es un par y no es nulo. En Scheme, cualquier cosa que no sea un procedimiento o una forma especial se considera un átomo.

    En el caso de los ejemplos dados en “The Little Schemer”, turkey, u y *abc$ se consideran átomos porque cumplen con la definición de atom?. Sin embargo, atom en sí mismo es una forma especial en Scheme y no es un átomo.

    En cuanto a cuándo usar una comilla (') antes de una expresión, depende de lo que quieras hacer con la expresión. Si quieres usar la expresión como datos, debes entrecomillarla. Si quieres usar la expresión como una llamada a un procedimiento, no debes entrecomillarla.

    Por ejemplo, si quieres definir una variable para almacenar el valor foo, debes entrecomillarla:

    (define x 'foo)
    

    Si quieres llamar a un procedimiento llamado foo, no debes entrecomillarlo:

    (foo arg1 arg2 ...)
    

    En general, no debes asumir que todo debe ir precedido por una comilla. Debes entrecomillar las expresiones cuando quieras usarlas como datos.

Comments are closed.