함수
HNU CE 프로그래밍언어론 (2021년 1학기)
클로저(closure)
함수 코드만으로 ...
간단해서 구현하긴 편하겠는데 ...
이래도 정말 괜찮은건가???
let z = 1
in
let f = \x.x+z
in
let y1 = f 10
in
let z = 2
in
let y2 = f 10
in
let z = 3
in
let y3 = f 10
in
print(y1,y2,y3)
11,11,11
11,12,13
int n = 100; // 전역변수 n
void print_global_n() { printf("%d\n", n); }
void f() {
int n = 200; // 함수 f의 지역변수 n
print_global_n();
}
void g() {
int n = 300; // 함수 g의 지역변수 n
print_global_n();
}
int main() {
print_global_n(); // 100 출력
f(); // static scope면 100, dynamic scope면 200 출력
g(); // static scope면 100, dynamic scope면 300 출력
return 0;
}
int n = 100; // 전역변수 n
void print_number(int n) { printf("%d\n", n); }
void f() {
int n = 200; // 함수 f의 지역변수 n
print_number(n);
}
void g() {
int n = 300; // 함수 g의 지역변수 n
print_number(n);
}
int main() {
print_number(n); // 100 출력
f(); // 200 출력
g(); // 300 출력
return 0;
}
Z = (\f.(\x.f(\v.x x v)) (\x.f(\v.x x v)))
g = (\f.\x.if x>0 then x + f (x-1) else 0)
Z g 3
= (\x.g(\v.x x v)) (\x.g(\v.x x v)) 3
= g (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) 3
= (\x.if x>0 then x + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) (x-1) else 0) 3
= if 3>0 then 3 + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) (3-1) else 0
= 3 + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) 2
= 3 + (\x.g(\v.x x v)) (\x.g(\v.x x v)) 2
= 3 + g (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) 2
= 3 + (\x.if x>0 then x + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) (x-1) else 0) 2
= 3 + if 2>0 then 2 + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) (2-1) else 0
= 3 + 2 + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) 1
= 3 + 2 + (\x.g(\v.x x v)) (\x.g(\v.x x v)) 1
= 3 + 2 + g (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) 1
= 3 + 2 + (\x.if x>0 then x + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) (x-1) else 0) 1
= 3 + 2 + if 1>0 then 1 + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) (1-1) else 0
= 3 + 2 + 1 + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) 0
= 3 + 2 + 1 + (\x.g(\v.x x v)) (\x.g(\v.x x v)) 0
= 3 + 2 + 1 + g (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) 0
= 3 + 2 + 1 + (\x.if x>0 then x + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) (x-1) else 0) 0
= 3 + 2 + 1 + if 0>0 then 0 + (\v.(\x.g(\v.x x v)) (\x.g(\v.x x v)) v) (0-1) else 0
= 3 + 2 + 1 + 0
= 6