2015-01-05 2 views
0

로컬 함수에서 변수를 증가시키고 변경 사항을 지속하려면 어떻게합니까?로컬 함수에서 증가하는 변수 lisp

(defun inc(x) (+ x 1)) 

(setq a 1) 

나는이 (INC가) 나는이 문제를 검색 2

에 값을 변경하려면, 그리고 난 setf의 뭔가를 발견하지만 난 문제를 해결할 수 있습니다.

답변

1

정확한 문제에 따라 발생할 수있는 어휘 범위의 특정 문제를 설명하는 Variable references in lisp에서 대답 할 수 있습니다. 변수의 값을 증가시키는 동일한 예제를 사용하기 때문에 특히 적절합니다.

그러나, 당신은 단지 값을 증가하는 방법을 찾고 있다면, 당신은 (1 + x)를(+ X 1)에 해당되는 표준 기능 1+, 관심이, 그리고 수 장소의 값을 증가시키는 매크로 incf . 당신 (그리고 중복 가능성이 더 적합)에 대한

(let ((a 1))  (let ((a 1)) 
    (1+ a))   (incf a) 
        a) 
;=> 2    ;=> 2 

그러나, 당신이해야 할 노력하고 정확하게에 따라이 작동하지 않을 수 있습니다. 변수의 값이 인 함수를 호출하려고하고 함수의 본문이 변수의 바인딩에서 변경된 후에는이를 수행 할 수 없습니다. 즉,이 작업을 할 수있는 함수 없다된다

(let ((a 1)) 
    (foo a) 
    a) 
;=> 2 

1foo에 변수 호출 될 함수; 변수에 액세스 할 수 없으므로 변수을 새 값으로 바인딩 할 수 없습니다. 그러나 매크로평가되지 않은 양식과 함께 호출 할 수 있으므로 원하는 부작용을 가질 수 있습니다. 예를 들면 : 위에서 설명한대로

(let ((a 1)) 
    (incf a) 
    a) 
;=> 2 

그러나, 당신은 할 수 없습니다

(defun my-incf (x) 
    (incf x))   ; modifies the binding of x 

(let ((a 1)) 
    (my-incf a) 
    a) 
;=> 2 

incf 에 대한 호출이 변수 인 X 바인딩을 변경하기 때문에 그 이 주변 지역은 my-incf입니다.

관련 문제