В чем разница между '(a b c) и (список' a 'b' c)? - PullRequest
7 голосов
/ 13 сентября 2009

Я читаю "On lisp" и столкнулся с этим кодом (я немного его упростил).

CL-USER> (defun foo ()                                                          
           '(a b c))
FOO                                                                             
CL-USER> (foo)
(A B C)                                                                         
CL-USER> (nconc * '(D E))
(A B C D E)                                                                     
CL-USER> (foo)
(A B C D E) 
CL-USER> (defun foo ()                                                          
          (list 'a 'b 'c))
STYLE-WARNING: redefining FOO in DEFUN                                          
FOO                                                                             
CL-USER> (foo)
(A B C)                                                                         
CL-USER> (nconc * '(D E))
(A B C D E)                                                                     
CL-USER> (foo)
(A B C)
  • Что именно означает *? Это предыдущий вызов функции? Это подходит для использования в реальном мире кода?

  • Почему (nconc * '(D E)) меняет возвращаемое значение первой foo функции?

  • Я всегда думал, (list 'a 'b 'c) и '(a b c) одинаковы? В чем разница?

Ответы [ 2 ]

14 голосов
/ 13 сентября 2009

Вызов LIST создает новый список каждый раз, когда он оценивается. Литерал списка может быть помещен в сегмент памяти только для чтения после компиляции. Деструктивное обновление списков с помощью NCONC становится проблематичным, возможно, с неопределенными последствиями (ошибка сегментации, изменение литерала для будущих ссылок или вообще ничего).

8 голосов
/ 13 сентября 2009

Переменные *, ** и *** определяются языком standard и весьма полезны при тестировании. Они являются функцией REPL и поэтому не должны и не должны быть полезны в «коде реального мира».

...