다음: 과적재와 자동 적재, 이전: 전용 함수, 상위 문서: 함수 기록철 [차례][찾아보기]
안긴 함수는 주함수만 기록철 밖에서 보인다는 점에서 매인 함수와 비슷합니다. 그러나 안긴 함수는 부모 함수의 울안 변수에 접근할 수 있는 자식 함수이기도 합니다. 부모 함수의 울안 변수에 접근하는 방식은 전역 변수로 정보를 공유하는 방식과 비슷하지만, 전역 변수는 옥타브의 나머지 부분에서 보이지 않습니다. 풀그림 짜기 전략으로, 안긴 함수의 방식으로 자료를 공유하면, 유지 보수하기 어려운 부호를 만듭니다. 가능하면 안긴 함수 대신에 매인 함수를 사용하는 것이 좋습니다.
간단한 예시로, 안긴 자식 함수 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
다음: 과적재와 자동 적재, 이전: 전용 함수, 상위 문서: 함수 기록철 [차례][찾아보기]