`

Sinopsis
` lista
Descripción

Devuelve una lista igual a su argumento pero con ciertas sustituciones. Éste es útil cuando sabes algunos de los elementos de una estructura de lista compleja por adelante—al tiempo que programas—y otros elementos se deben evaluarse al tiempo de ejecución. Si sabes todos los elementos por adelante, sería mejor que utilizaras corchetes para definir una lista literal (por ejemplo, [a b c]). Si todos los elementos se deben evaluarse al tiempo de ejecución, sería mejor que utilizaras LISTA.

También es útil la comilla invertida cuando definas macros con .MACRO porque los macros deben devolver una lista de instrucciones y la comilla invertida es bueno para construir listas de instrucciones.

También es útil la comilla invertida para la evaluación parcial.

Las reglas de sustitución de la comilla invertida son:

  • Si un miembro de la lista es la palabra , (coma) entonces el siguiente miembro debe ser una lista de instrucciones que devuelve un valor cuando se la ejecuta. Ese valor reemplaza a la coma y a la lista. Eso se llama sustitución.

  • Si un miembro de lista es la palabra ,@ (coma arroba), entonces el siguiente miembro debe ser una lista de instrucciones que devuelve una lista cuando se la ejecuta. Los miembros de esa lista reemplazan a ,@ y a la lista. Eso se llama empalmación («splicing» en inglés).

  • Se trata una palabra que comienza con , o ,@ como si el resto de la palabra fuera una lista de una sola palabra. Por ejemplo, ,:foo equivale a ,[:foo].

  • Se sustituye a una palabra que comienza con ", (comillas inglesas coma) por una palabra que comienza con " seguido por el resultado de ejecutar la sustitución sobre lo que viene después de la coma. Si lo que viene después de la coma es una lista, debe contener exactamente una sola palabra. Ésta palabra se usan en la sustitución.

  • Se sustituye a una palabra que comienza con :, (dos puntos coma) por una palabra que comienza con : seguido por el resultado de ejecutar la sustitución sobre lo que viene después de la coma. Si lo que viene después de la coma es una lista, debe contener exactamente una sola palabra. Ésta palabra se usan en la sustitución.

Esas sustituciones ocurren a cualquier profundidad en la estructura del argumento lista. Sin embargo, una comilla invertida que aparece dentro del argumento lista bloquea la sustitución parcialmente. Considerando solamente las comillas invertidas y las expresiones de sustitución y no la estructura general de la lista, las reglas de sustitución aplican solamente a una profundidad de sustitución que es igual a la profundidad de la comilla invertida más próxima. La comilla invertida anidada y las expresiones de sustituciones exteriores aparecen en la lista que devuelve la comilla invertida más exterior. La idea es que, con la comilla invertida más exterior borrada, puedes evaluar el próximo nivel de comilla invertida más tarde, a que momento un nivel más de sustitución anidada ocurriese.

Las comillas invertidas anidadas son dificilísimos a utilizar bien en Logo. Por causa de sus compartimientos poco intuitivos, aún los expertos deben evitarlas.

Para visualizar el comportamiento de las comillas invertidas anidadas, consideras el ejemplo siguiente:

MUESTRA `[ ,[1*10] `[ ,[2*10 ,[3*10]]  `[ ,[4*10 ,[5*10 ,[6*10]]] ] ] ]
[10 ` [, [2*10 30] ` [, [4*10 , [5*10 60]]]]]

,[1*10] está a la profundidad de sustitución 1 dentro de una comilla invertida con profundidad 1. Por lo tanto, se lo ejecutan y se lo reemplacen con 10.

La próxima expresión de sustitución es ,[2*10 ,[3*10]]. Ésta está dentro de una comilla invertida con profundidad 2. Como resultado, se guarden la parte exterior de la sustitución tal como está, y la sustitución anidada que está a profundidad 2 ,[3*10] se lo ejecutan y se lo reemplacen con 30.

La próxima expresión de sustitución es ,[4*10 ,[5*10 ,[6*10]]]. Ésta está dentro de una comilla invertida con profundidad 3, por lo cual solo se ejecutan la sustitución a profundidad 3 ,[6*10] y la reemplacen con 60. Se guarden los primeros dos niveles de sustitución, por lo que se incluyen , [4*10 , [5*10 60]] en la lista devuelta.

Cuando consideras el comportamiento de comillas invertidas anidadas, recuerdes que no importa nada el nivel de anidamiento de la estructura de la lista como tal. Una sola comilla invertida puede hacer sustituciones a cualquier profundidad en su argumento lista.

MUESTRA `[ [[[ ,[1*10] ]]] ]
[[[[10]]]]

También tengas en cuenta que no puedas nidar sustituciones más profundo que el nivel de anidamiento de las comillas invertidas. Éste es porque las secuencias de sustitución no son nombres de procedimientos y, por lo tanto, no son validos a ejecutar. Si lo intentas, FMSLogo lanzará un error.

MUESTRA `[ESCRIBE ,[ 1*10 ,[2*10] ] ]
10
no sé cómo realizar , en backq.unquote

Por cierto, se necesitan ESCRIBE arriba porque hay que hacer algo con lo que devuelve 1*10 antes de que FMSLogo ejecutarán la instrucción ,[2*10]. Sin el, la instrucción arriba hubiera fallado con un error distinto.

Esos ejemplos ilustran como funciona el anidamiento de comillas invertidas pero no son Logo instrucciones útiles. Para ser útiles, deberías tener una manera de ejecutar las comillas invertidas (y sus expresiones de sustitución) que quedan en la lista devuelta más tarde. Además, sería necesario que esas expresiones de sustitución se ejecutaran sin error.

Ejemplo

El primer ejemplo demuestra la diferencia entre sustitución y empalmamiento. Observes que las expresiones de sustitución son los mismos, pero se proceden una con , (sustitución) y la otra con ,@ (empalmamiento).

MUESTRA `[a b ,[MENOSPRIMERO [1 2 3]] c ,@[MENOSPRIMERO [1 2 3]] d]
[a b [2 3] c 2 3 d]

El ejemplo siguiente demuestra como crear una lista de instrucciones que restaure la posición de la tortuga a lo que estaba en el momento cuando creaste esa lista de instrucciones.

PONPOS [111 222]
HAZ "veteacasa `[ SUBELAPIZ PONPOS [ ,COORX ,COORY ] BAJALAPIZ ]

Éste guarda la posición de la tortuga dentro de la variable :veteacasa como números, como se demuestran abajo:

MUESTRA :veteacasa
[SUBELAPIZ PONPOS [111 222] BAJALAPIZ]

Más tarde puedes usar ésta lista de instrucciones para dibujar una forma espiral con ocho brazos:

REPITE 8 [ EJECUTA :veteacasa AVANZA 100 GIRADERECHA 45 AVANZA 100]

No importa cual está la posición de la tortuga, se centrarán la espiral a la posición donde estaba la tortuga cuando creaste :veteacasa.

Si no quieres usar EJECUTA, puedes usar DEFINE con una comilla invertida para definir un procedimiento en lugar de una lista de instrucciones.

DEFINE "VETEACASA `[ [] [SUBELAPIZ] [PONPOS [ ,COORX ,COORY ] ] [BAJALAPIZ] ]
REPITE 8 [ VETEACASA AVANZA 100 GIRADERECHA 45 AVANZA 100]


SourceForge.net Logo