다음: 과적재와 자동 적재, 이전: 전용 함수, 상위 문서: 함수 기록철   [차례][찾아보기]


11.9.4 안긴 함수

안긴 함수는 주함수만 기록철 밖에서 보인다는 점에서 매인 함수와 비슷합니다. 그러나 안긴 함수는 부모 함수의 울안 변수에 접근할 수 있는 자식 함수이기도 합니다.  부모 함수의 울안 변수에 접근하는 방식은 전역 변수로 정보를 공유하는 방식과 비슷하지만, 전역 변수는 옥타브의 나머지 부분에서 보이지 않습니다. 풀그림 짜기 전략으로, 안긴 함수의 방식으로 자료를 공유하면, 유지 보수하기 어려운 부호를 만듭니다. 가능하면 안긴 함수 대신에 매인 함수를 사용하는 것이 좋습니다.

간단한 예시로, 안긴 자식 함수 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은 함께 쓰지 않는 것이 최선입니다.

매인 함수와 마찬가지로 기록철의 첫 번째 매인 함수만 기록철 바깥에서 불러올 수 있습니다. 함수 안에서는 규칙이 더 복잡해 집니다. 일반적으로 안긴 함수는 다음과 같이 호출합니다.

  1. 전역에서 보이는 함수
  2. 안긴 함수의 부모 함수를 호출할 수 있는 모든 함수
  3. 형제 함수(같은 부모 함수를 둔 자식 함수)
  4. 직손

복잡한 예시로 ex_aex_b라는 자식 함수 두 개를 둔 부모 함수 ex_top가 있다고 합시다. 더욱이, ex_aex_aaex_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

다음: 과적재와 자동 적재, 이전: 전용 함수, 상위 문서: 함수 기록철   [차례][찾아보기]