2017-04-16 2 views
2

은 노르 빅의 PAIP에서 CLHS에서 장소위치setf 수 같은 것 SETFable?위치 (노르 빅) 대 (CLHS) 장소 대

나는 HyperSpec과의 설명

장소 N을 정확히 장소는 커먼 리스프에 무엇인지 알아 내려고하지만 나에게있어. 1. 일반화 된 참조로서 사용하기에 적합한 형식. 2. 그러한 장소 [1]에 의해 참조되는 개념적 위치.

은 제한된 도움이됩니다.

+2

CLHS [5.1 일반 참조] (http://www.lispworks.com/documentation/HyperSpec/Body/05_a.htm)를 읽었습니까? – jkiiski

답변

6

원래 가변 데이터 구조가있다 (나는 정말 SO에 맞는 질문의 종류 아니지만 누군가가 setfable/장소/위치를 설명하는 좋은 기사를 알고 있다면 내가 링크/참조 고맙겠 알고) 게터와 세터. car/rplacacdr 및/rplacd 예이 예에서

CL-USER 68 > (let ((a (cons 1 2))) 
       (print (list (car a) (cdr a))) 
       (rplaca a 'foo) 
       (rplacd a 'bar) 
       (print (list (car a) (cdr a))) 
       (values)) 

(1 2) 
(FOO BAR) 

게터 반대 세포위한 carcdr하고있다. 세터는 rplaca (자동차 교체) 및 rplacd (cdr 교체)입니다.

모든 변경 가능한 데이터 구조에는 해당 데이터 구조가 있으며 일반적으로 setter 이름을 추측 할 수있는 체계적인 방법이 없습니다.

따라서 아이디어는 getter와 setter의 레지스트리를 갖는 것이 었습니다. getter에 대한 setter를 등록하면 사용자는 getter를 알 수 있습니다. setf 매크로 (그리고 incf, decf 및 사용자 정의 매크로와 같은 다른 매크로)는 사용 된 getter에 대한 setter의 조회를 수행합니다.

이 같은 setf 매크로 외모와 위의 예 :

CL-USER 69 > (let ((a (cons 1 2))) 
       (print (list (car a) (cdr a))) 
       (setf (car a) 'foo) 
       (setf (cdr a) 'bar) 
       (print (list (car a) (cdr a))) 
       (values)) 

(1 2) 
(FOO BAR) 

당신이 rplacarplacd의 사용을 보듯

이 매크로 setf로 대체되었습니다.

따라서 장소는 기본적으로 등록 양식이며 설정자가 있습니다. defsetfdefine-setf-expander이 이에 사용됩니다.

define-modify-macro은 장소를 수정할 수있는 매크로를 정의하는 데 사용됩니다.

예를 들어 incf (장소 증가) 및 decf (장소 감소)과 비슷한 장소 값을 곱하는 방법을 정의 할 수 있습니다.

이 기능은 필드 대신 장소의 사용 된 원래 단어입니다. 따라서 매크로는 자리 끝을 f (필드)으로 끝낼 수 있습니다.

CL-USER 71 > (define-modify-macro multf (&rest args) 
       * "multiply") 
MULTF 

CL-USER 72 > (let ((a (cons 1 2))) 
       (print (list (car a) (cdr a))) 
       (multf (car a) 2) 
       (multf (cdr a) 4) 
       (print (list (car a) (cdr a))) 
       (values)) 

(1 2) 
(2 8)