Practice/Lisp, Scala

Lisp에서 lexical과 dynamic 변수 타입

Lisp에는 lexical과 dynamic이라는 두가지 변수(variables) 형태가 존재한다.


lexical 변수는 소스 코드를 읽는 단계에서 바인딩(binding)이 결정된다.
C나 Java 같은 언어에서 말하는 지역(local) 변수를 생각하면 된다.
함수의 매개변수(parameters)나 LET 구문의 변수가 이런 타입니다.


함수의 매개변수

(defun foo (x y) (+ x y))

함수를 호출하면, 이 함수에 전달하는 인자(arguments)와 연결(binding)하는 매개변수를 생성한다.
이 변수는 함수 내로 범위가 한정된다.


LET 구문의 변수

(let ((x 10) (y 20)) (+ x y))

LET 구문 역시 함수 호출과 동일한 효과를 가진다.
LAMBDA로 표현하면 함수의 매개변수와 동일한 형태라는 것을 알 수 있다.

((lambda (x y) (+ x y)) 10 20)


dynamic 변수는 실행 시간에 바인딩이 결정된다.
즉, 해당 함수를 호출한 환경이 값을 좌우한다.


dynamic 변수는 DEFVAR, DEFPARAMETER 구문으로 생성한다.

(defvar *x* 10)
(defparameter *y* 20)


dynamic 변수가 환경에 따라서 어떻게 다르게 동작하는지 PLUS-*Y*로 실험해보자.

(defparameter *y* 10)
(defun plus-*y* (x) (+ *y* x))


CL-USER> (plus-*y* 5)
15

예상한대로 '10 + 5'의 결과인 '15'를 반환했다.

다음은 이 함수를 호출하는 환경을 바꿔서, PLUS-*Y*를 호출해보자.

CL-USER> (let ((*y* 20)) (plus-*y* 5))
25

함수가 속한 환경(*y* = 10)이 아니라 호출하는 환경(*y* = 20)의 영향을 받아서 '25'를 돌려주었다.


dynamic과 closure를 혼동하는 경우가 많다.
closure에 대해서는 Lisp에서 클로저(closures)를 참고하라.


2013/01/17 - [Practice/Lisp] - DEFPARAMETER와 DEFVAR의 차이

2016/02/18 - [Practice/Lisp] - Lisp에서 클로저(closures)


알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

Today : 115
Yesterday : 134
Total : 205,384