2009-11-23 3 views

ответ

22

Апостроф - это цитата, которая говорит интерпретатору не анализировать следующее выражение (имя символа). Таким образом, 'add-to-list получает символ, который содержит значение списка, предназначенное для оценки.

Чтобы узнать больше о символах, ознакомьтесь с документацией Symbol (в частности, Symbol Components символы имеют имена, значения, определения функций и списки свойств).

Не прочитывая документацию, я объясняю это: Emacs lisp's evaluation strategy должен пройти по значению (в отличие от имени или ссылки или чего-то еще). Если цитаты там не было, flymake-allowed-file-name-masks будет оцениваться до значения, а add-to-list придется работать непосредственно в списке. Это будет работать со следующими исключениями. Если список был пустым, не было бы способа изменить то, на что указала исходная переменная. По этой же причине вы не сможете добавлять элементы в начало списка.

Чтобы эти два случая работали, вам действительно нужно имя переменной, чтобы вы могли изменить то, что это указывает на.

Возможно, было бы полезно прочитать следующее: Introduction to Evaluation, Modifying List Variables и Modifying Existing List Structures.

Если вы знакомы с box diagrams, возможно, это поможет.

Представьте, что some-var указывает на список:

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

И вы хотите, чтобы положить что-то на передней части этого списка.

Если все, что вы должны работать с этим значением указателя в somevar, то лучшее, что вы можете сделать, это поместить новый элемент на передней части списка, но вы не можете реально изменить то, что somevar указует на (потому что у вас нет somevar, у вас есть значение). Как так:

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

Так, чтобы написать свою собственную 'add-to-list функцию, вам нужно имя переменного.

Конечно, если вы написали 'add-to-list как macro, у вас не было бы этого ограничения.

+1

У меня есть прекрасная концепция сейчас! Его можно сравнить с вызовом по значению и позвонить по ссылке на других языках! Благодаря! – kjshim

Смежные вопросы