2009-09-13 6 views
7

"On lisp"를 읽고이 코드를 발견했습니다 (조금 단순화했습니다).'(a b c)와 ('a 'b'c ')의 차이점은 무엇입니까?

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)이 같다고 생각하니? 그 차이점은 무엇입니까?

답변

14

LIST를 호출하면 평가 될 때마다 새 목록이 만들어집니다. 목록 리터럴은 컴파일 후 읽기 전용 메모리 세그먼트에 배치 될 수 있습니다. NCONC를 사용하는 목록에 대한 파괴적인 업데이트는 문제가 될 수 있으며, 아마도 정의되지 않은 결과 (세분화 오류, 향후 참조를위한 리터럴 변경 또는 전혀 없음)가있을 수 있습니다.

+0

그 생각을하지 못했습니다;) –

8

변수 *, *****은 언어 으로 지정되며 테스트 할 때 매우 유용합니다. 그것들은 REPL의 기능이며, "실제 코드"에서 유용하지 않을 수도 있고, 그렇게해서는 안됩니다.

+0

+1 HyperSpec 참조 – sigjuice

관련 문제