push
을 매크로로 구현하는 방법을 이해할 수 있습니까? 순진 버전은 아래 두 장소 양식을 평가하고, 요소 양식을 평가하기 전에 그렇게 :푸시 매크로를 구현하려면 어떻게해야합니까?
(defmacro my-push (element place)
`(setf ,place (cons ,element ,place)))
을하지만 다음 다음과 같이이 문제를 해결하려고하면 나는 setf
가 잘못된 장소 -ing 해요 :
(defmacro my-push (element place)
(let ((el-sym (gensym))
(place-sym (gensym)))
`(let ((,el-sym ,element)
(,place-sym ,place))
(setf ,place-sym (cons ,el-sym ,place-sym)))))
CL-USER> (defparameter *list* '(0 1 2 3))
*LIST*
CL-USER> (my-push 'hi *list*)
(HI 0 1 2 3)
CL-USER> *list*
(0 1 2 3)
을
setf
을 두 번 평가하지 않고 어떻게 올바른 위치에 저장할 수 있습니까?
SBCL 소스를 살펴보면 rplaca를 처리하기 위해 한 번만 사용하는 매크로를 사용합니다. 자세한 내용은이 링크를 참조하십시오. http://stackoverflow.com/questions/9808928/understanding-how-to-implement-once -only-lisp-macro). 나는 더 많은 이해를 위해 rplaca를 조사 할 것이다. –
@PaulNathan보고있는 SBCL 버전과 소스 위치를 제공해 주시겠습니까? 'once-only'를 사용하지 않는'src/code/early-setf.lisp' (SBCL 1.0.58)에서'(defmacro-mundanely push (obj place & environment env) ... '를 보았 기 때문에) –