변수를 값의 복사본으로 바인딩하면됩니다. 예 :
(let ((i i))
(lambda() i))
뭔가
(loop for i from 1 to 10
collecting (lambda() i))
처럼이 같은 변수를 통해 열 클로저를 반환 할 수 있기 때문, 실제로 반복 구조와 중요한 기술이다, 그래서 쓰기 할 필요가 :
(loop for i from 1 to 10
collecting (let ((i i)) (lambda() i)))
값을 반환하는 함수가 실제로 필요한 경우 constantly을 사용할 수도 있습니다 (하지만 실제 사용 사례는 더 복잡 할 것으로 예상합니다) :
(loop for i from 1 to 10
collecting (constantly i))
경우에 따라 반복 형식의 모호성이 실제로 표준에 의해 지정됩니다. 예를 들어, dotimes를 들어, dolist
이 dotimes이 반복 될 때마다 VAR의 새로운 바인딩을 설정 여부 구현에 의존하거나 여부를 초기에 한 번 var에 바인딩을 설정 한 후 후속 반복에 할당합니다.
더 원시적
do 그러나 실제로이 폼 바인딩 한 세트이며, 그들은 각각의 반복으로 업데이트되도록 (강조 추가)하도록 지정 각각의 시작 부분에서
첫 번째 반복 이외의 반복은 다음과 같이 을으로 업데이트합니다.& hellip;
이 애매한 점은 구현에 약간의 유연성을 제공합니다. 위의 두 답변 선명도 충분하지 않습니다 이런 경우에
(defmacro dolist ((var list &optional result) &body body)
`(progn (mapcar #'(lambda (,var)
,@(ex:body-declarations body)
(tagbody
,@(ex:body-tags-and-statements body)))
,list)
(let ((,var nil))
,result)))
(defmacro dolist ((var list &optional result) &body body)
(let ((l (gensym (string '#:list-))))
`(do* ((,l ,list (rest ,l))
(,var (first ,l) (first ,l)))
((endp ,l) ,result)
,@body)))
I DOLIST 예를 들어 다음 중 하나로 정의 할 수 있습니다 '잠깐 '에 대해 조금 읽으라고 제안한다. –