다음: 과적재와 자동 적재, 이전: 전용 함수, 상위 문서: 함수 기록철 [차례][찾아보기]
안긴 함수는 주함수만 기록철 밖에서 보인다는 점에서 매인 함수와 비슷합니다. 그러나 안긴 함수는 부모 함수의 울안 변수에 접근할 수 있는 자식 함수이기도 합니다. 부모 함수의 울안 변수에 접근하는 방식은 전역 변수로 정보를 공유하는 방식과 비슷하지만, 전역 변수는 옥타브의 나머지 부분에서 보이지 않습니다. 풀그림 짜기 전략으로, 안긴 함수의 방식으로 자료를 공유하면, 유지 보수하기 어려운 부호를 만듭니다. 가능하면 안긴 함수 대신에 매인 함수를 사용하는 것이 좋습니다.
간단한 예시로, 안긴 자식 함수 bar와 이를 호출하는 부모 함수 foo가 변수 가로를
함께 쓴다고 해 봅시다.
function y = foo ()
x = 10;
bar ();
y = x;
function bar ()
x = 20;
endfunction
endfunction
foo ()
⇒ 20
가로를 함께 쓰는데에 특별한 구문이 없음을 잘 보십시오. 이는 부모 함수와 자식 함수가 변수를 돌려 쓰는 과정에서 예기치 못한 문제를 만들 수 있습니다. 일반적으로 변수는 상속받는데 반하여, 자식 함수의 매개변수와 반환값은 자식 함수의 울안 값입니다.
변수 가로와
세로를 사용하는 함수 foobar가 있다고 합시다. foobar는
가로를 매개변수로 취하고 세로를 반환하는 안긴 함수 foo를 호출합니다. foo는
일정 연산을 하는 bat을 호출합니다.
function z = foobar ()
x = 0;
y = 0;
z = foo (5);
z += x + y;
function y = foo (x)
y = x + bat ();
function z = bat ()
z = x;
endfunction
endfunction
endfunction
foobar ()
⇒ 10
foobar의 가로와 세로 가 foo에서
반환값과 매개변수로 각각 쓰였는데에도 여전히 0인 점에 유의하십시오. bat의
가로는 foo의 가로를 참조합니다.
변수 상속성이 eval과 대본에서 문제를 야기합니다. 새 변수를 부모 함수에서 만들면, 안긴 자식 함수에서 어떻게
처리하여야 하는지 명확하지 않습니다. 안긴 자식 함수 bar를 가진 부모 함수
foo가 있다고 해 봅시다.
function y = foo (to_eval)
bar ();
eval (to_eval);
function bar ()
eval ("x = 100;");
eval ("y = x;");
endfunction
endfunction
foo ("x = 5;")
⇒ 오류: 변수 "x"를 정적 작업 공간에 추가할 수 없음.
foo ("y = 10;")
⇒ 10
foo ("")
⇒ 100
부모 함수 foo는 새 변수를 만들지 못하지만, 자식 함수 bar는 새 변수를 만듭니다.
더욱이, eval문에서 bar의 세로가 부모 함수 foo에
있는 세로와 같습니다. 안긴 함수와 eval은 함께 쓰지 않는 것이 최선입니다.
매인 함수와 마찬가지로 기록철의 첫 번째 매인 함수만 기록철 바깥에서 불러올 수 있습니다. 함수 안에서는 규칙이 더 복잡해 집니다. 일반적으로 안긴 함수는 다음과 같이 호출합니다.
복잡한 예시로 ex_a와 ex_b라는 자식 함수 두 개를 둔 부모 함수 ex_top가
있다고 합시다. 더욱이, ex_a는 ex_aa와 ex_ab라는 자식 함수를
두 개 더 두고 있습니다.
function ex_top ()
## 호출 가능: ex_top, ex_a, ex_b
## 호출 불가능: ex_aa, ex_ab
function ex_a ()
## 모두 호출 가능
function ex_aa ()
## 모두 호출 가능
endfunction
function ex_ab ()
## 모두 호출 가능
endfunction
endfunction
function ex_b ()
## 호출 가능: ex_top, ex_a, ex_b
## 호출 불가능: ex_aa, ex_ab
endfunction
endfunction
다음: 과적재와 자동 적재, 이전: 전용 함수, 상위 문서: 함수 기록철 [차례][찾아보기]