고차 함수(Higher-Order)
- 다음과 같은 경우 함수는 고차로 간주된다.
- 함수를 매개변수로 받아들인다.
- 아니면 함수를 반환한다.
- 이 메커니즘은 많은 프로그래밍 언어, 특히 기능적 언어에서 지원된다.
매개변수로서의 함수
- 함수를 매개변수로 사용하는 C 코드의 예제
int x = 1;
int f(int y) {
return x+y; // x = 1
}
int g(function<int(int)> h) {
int x = 2;
return h(3)+x; // x = 2
}
int main() {
//Functions as parameters
int x = 4;
int z = g(f); // x = 4
}
- 함수 f는 g에 매개변수로 전달된다.
- 변수 x가 여러 번 정의되었다.
- 함수 g에서 x의 어떤 바인딩을 사용해야 하는가?
- 이름 x에 대해 어떤 환경을 확인해야 할까?
깊고 얕은 바인딩(Deep and Shallow Binding)
- Deep Binding : f와 h 사이의 링크가 만들어질 때 활성화된 환경을 사용한다.
- 환경(전역변수)을 바인딩.
- int z = g(f);
- Shallow Binding : f(h 사용) 호출이 발생할 때 활성화된 환경을 사용한다.
- 이전 환경(이전 함수 속 지역변수)을 바인딩
- return h(3)+x;
- 정적범위(Static Scope) + Deep/Shallow Binding
- h(3) = 4, g(f) = 6
- 동적범위(Dynamic Scope) + Deep Binding
- h(3) = 7, g(f) = 9
- 동적범위(Dynamic Scope) + Shallow Binding
- h(3) = 5, g(f) = 7
환경을 정의하는 것은 무엇인가?
- 가시성 규칙(Visibility Rules)
- 가시성 규칙의 예외 : 재정의된 이름을 고려해야 하며 선언 후에 이름을 사용해야 한다.
- 범위 규칙(Scope Rules)
- 매개변수 전달 모드(Parameter Passing Modes)
- 바인딩 정책(Binding Policy)
결과로서의 함수
- 함수는 결과로 다른 함수를 반환할 수 있다.
- 정적 범위를 사용하면 k() 호출은 실제로 s를 호출하고 s에서는 x = 1이다.
- 반환된 함수에서는 환경도 고려된다.
- 따라서 calling_s()의 결과는 실제로 클로저이다.
int x = 1;
int s() {
return x+1;
}
function<int()> calling_s() {
return s;
}
int main() {
// Fuctions as results
int x = 4;
function<int()> k = calling_s();
int y = k();
}
클로저(Closure)
- 클로저는 (표현식, 환경) 쌍이다.
- 환경에는 표현식의 모든 자유 변수가 포함된다.
- 자유 변수는 표현식에 사용되지만 현재 환경에서는 선언되지 않은 변수이다.
- Python에서는 전역 변수가 자유 변수가 아니라는 특별한 차이점이 있다.
- 그러나 일반적으로 전역 변수는 로컬 환경에서 다시 선언되지 않는 한 자유 변수이다.
'프로그래밍언어론' 카테고리의 다른 글
[프로그래밍언어론] 28. 프로그래밍 언어 패러다임(PL Paradigm) (0) | 2023.11.06 |
---|---|
[프로그래밍언어론] 27. 자료형(Data Types) (1) | 2023.10.17 |
[프로그래밍언어론] 25. 매개변수 전달(Parameter Passing) (1) | 2023.10.17 |
[프로그래밍언어론] 24. 컨트롤 추상화(Control Abstraction) (0) | 2023.10.17 |
[프로그래밍언어론] 23. 파이썬 피보나치 수열 재귀 (0) | 2023.10.12 |
고차 함수(Higher-Order)
- 다음과 같은 경우 함수는 고차로 간주된다.
- 함수를 매개변수로 받아들인다.
- 아니면 함수를 반환한다.
- 이 메커니즘은 많은 프로그래밍 언어, 특히 기능적 언어에서 지원된다.
매개변수로서의 함수
- 함수를 매개변수로 사용하는 C 코드의 예제
int x = 1;
int f(int y) {
return x+y; // x = 1
}
int g(function<int(int)> h) {
int x = 2;
return h(3)+x; // x = 2
}
int main() {
//Functions as parameters
int x = 4;
int z = g(f); // x = 4
}
- 함수 f는 g에 매개변수로 전달된다.
- 변수 x가 여러 번 정의되었다.
- 함수 g에서 x의 어떤 바인딩을 사용해야 하는가?
- 이름 x에 대해 어떤 환경을 확인해야 할까?
깊고 얕은 바인딩(Deep and Shallow Binding)
- Deep Binding : f와 h 사이의 링크가 만들어질 때 활성화된 환경을 사용한다.
- 환경(전역변수)을 바인딩.
- int z = g(f);
- Shallow Binding : f(h 사용) 호출이 발생할 때 활성화된 환경을 사용한다.
- 이전 환경(이전 함수 속 지역변수)을 바인딩
- return h(3)+x;
- 정적범위(Static Scope) + Deep/Shallow Binding
- h(3) = 4, g(f) = 6
- 동적범위(Dynamic Scope) + Deep Binding
- h(3) = 7, g(f) = 9
- 동적범위(Dynamic Scope) + Shallow Binding
- h(3) = 5, g(f) = 7
환경을 정의하는 것은 무엇인가?
- 가시성 규칙(Visibility Rules)
- 가시성 규칙의 예외 : 재정의된 이름을 고려해야 하며 선언 후에 이름을 사용해야 한다.
- 범위 규칙(Scope Rules)
- 매개변수 전달 모드(Parameter Passing Modes)
- 바인딩 정책(Binding Policy)
결과로서의 함수
- 함수는 결과로 다른 함수를 반환할 수 있다.
- 정적 범위를 사용하면 k() 호출은 실제로 s를 호출하고 s에서는 x = 1이다.
- 반환된 함수에서는 환경도 고려된다.
- 따라서 calling_s()의 결과는 실제로 클로저이다.
int x = 1;
int s() {
return x+1;
}
function<int()> calling_s() {
return s;
}
int main() {
// Fuctions as results
int x = 4;
function<int()> k = calling_s();
int y = k();
}
클로저(Closure)
- 클로저는 (표현식, 환경) 쌍이다.
- 환경에는 표현식의 모든 자유 변수가 포함된다.
- 자유 변수는 표현식에 사용되지만 현재 환경에서는 선언되지 않은 변수이다.
- Python에서는 전역 변수가 자유 변수가 아니라는 특별한 차이점이 있다.
- 그러나 일반적으로 전역 변수는 로컬 환경에서 다시 선언되지 않는 한 자유 변수이다.
'프로그래밍언어론' 카테고리의 다른 글
[프로그래밍언어론] 28. 프로그래밍 언어 패러다임(PL Paradigm) (0) | 2023.11.06 |
---|---|
[프로그래밍언어론] 27. 자료형(Data Types) (1) | 2023.10.17 |
[프로그래밍언어론] 25. 매개변수 전달(Parameter Passing) (1) | 2023.10.17 |
[프로그래밍언어론] 24. 컨트롤 추상화(Control Abstraction) (0) | 2023.10.17 |
[프로그래밍언어론] 23. 파이썬 피보나치 수열 재귀 (0) | 2023.10.12 |