은 노르 빅의 PAIP에서 CLHS에서 장소과 위치로 setf
수 같은 것 SETFable?위치 (노르 빅) 대 (CLHS) 장소 대
나는 HyperSpec과의 설명
장소 N을 정확히 장소는 커먼 리스프에 무엇인지 알아 내려고하지만 나에게있어. 1. 일반화 된 참조로서 사용하기에 적합한 형식. 2. 그러한 장소 [1]에 의해 참조되는 개념적 위치.
은 제한된 도움이됩니다.
은 노르 빅의 PAIP에서 CLHS에서 장소과 위치로 setf
수 같은 것 SETFable?위치 (노르 빅) 대 (CLHS) 장소 대
나는 HyperSpec과의 설명
장소 N을 정확히 장소는 커먼 리스프에 무엇인지 알아 내려고하지만 나에게있어. 1. 일반화 된 참조로서 사용하기에 적합한 형식. 2. 그러한 장소 [1]에 의해 참조되는 개념적 위치.
은 제한된 도움이됩니다.
원래 가변 데이터 구조가있다 (나는 정말 SO에 맞는 질문의 종류 아니지만 누군가가 setfable/장소/위치를 설명하는 좋은 기사를 알고 있다면 내가 링크/참조 고맙겠 알고) 게터와 세터. car
/rplaca
cdr
및/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)
게터 반대 세포위한 car
cdr
하고있다. 세터는 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)
당신이 rplaca
및 rplacd
의 사용을 보듯
setf
로 대체되었습니다.
따라서 장소는 기본적으로 등록 양식이며 설정자가 있습니다. defsetf 및 define-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)
CLHS [5.1 일반 참조] (http://www.lispworks.com/documentation/HyperSpec/Body/05_a.htm)를 읽었습니까? – jkiiski