2009-11-23 9 views

Respuesta

22

El apóstrofo es una cita, que le indica al intérprete que no analice la siguiente expresión (el nombre del símbolo). Por lo tanto, 'add-to-list obtiene el símbolo que contiene el valor de la lista que se pretende evaluar.

Para obtener más información sobre los símbolos, lea la documentación de Symbol (específicamente, los símbolos Symbol Components tienen nombres, valores, definiciones de funciones y listas de propiedades).

Sin leer la documentación, así es como lo explico: Emacs lisp evaluation strategy es pasar por valor (en lugar de por nombre o referencia u otra cosa). Si la cita no estuviera allí, flymake-allowed-file-name-masks se evaluaría a un valor, y add-to-list tendría que trabajar directamente en la lista. Esto funcionaría, con las siguientes excepciones. Si la lista estuviera vacía, no habría forma de cambiar a qué apuntaba la variable original. Por la misma razón, no podría agregar elementos al principio de la lista.

Para hacer que esos dos casos funcionen, realmente necesita el nombre de la variable para que pueda modificar puntos.

Probablemente sea útil leer lo siguiente: Introduction to Evaluation, Modifying List Variables y Modifying Existing List Structures.

Si está familiarizado con box diagrams, quizás esto ayude.

imaginar que some-var puntos a una lista:

somevar 
    | 
    | 
    v 
--- ---  --- ---  --- ---   
| | |--> | | |--> | | |--> nil 
--- ---  --- ---  --- ---   
    |   |   |    
    |   |   |    
    --> rose  --> violet --> buttercup 

y que quería poner algo en el frente de esa lista.

Si todo lo que tiene que trabajar con es el valor del puntero en somevar, entonces lo mejor que puede hacer es poner un nuevo elemento en el frente de la lista, pero que en realidad no puede modificar lo somevar puntos a (porque no tiene somevar, tiene valor). De este modo:

   somevar 
       | 
       | 
       v 
--- ---  --- ---  --- ---  --- ---   
| | |--> | | |--> | | |--> | | |--> nil 
--- ---  --- ---  --- ---  --- ---   
    |   |   |   |    
    |   |   |   |    
    --> tulip  --> rose  --> violet --> buttercup 

lo tanto, para escribir su propia función 'add-to-list, se necesita el nombre de la variable.

Por supuesto, si escribió 'add-to-list como macro, no tendría esa restricción.

+1

¡Obtuve la concepción perfecta ahora! ¡Se puede comparar con una llamada por valor y llamar por referencia en otros idiomas! ¡Gracias! – kjshim

Cuestiones relacionadas