다음: 함수 다루개, 익명 함수, 붙박이 정의 함수, 이전: 함수 기록철, 상위 문서: 함수와 대본   [차례][찾아보기]


11.10 대본 기록철

대본 기록철은 (대부분) 옥타브 명령 집합이 담긴 기록철입니다. 해석과 평가 부분에서 옥타브 명령 처리기에 명령을 타자하는 것과  별반 다르지 않지만, 함수 안에 논리적으로 들어가지 못하는 명령 집합을 더 쉽게 실행하는 방법입니다.

함수 기록철과는 다르게, 대본 기록철은 예약어 function으로 시작하면 절대 됩니다. function 예약어가 있으면, 옥타브가 함수 기록철로 인식하여, 정의 후 평가해야 하는 단일 함수로 정의됩니다.

또한 대본 기록철에서 선언한 변수는 울안 변수가 아니고 명령줄에서 보이는 다른 변수와 유효 범위가 같다는 점에서 함수 기록철과 다릅니다.

대본 기록철이 function 예약어로 시작하지 않더라도, 함수 기록철 한 개에서 한 개 이상의 함수를 정의하고, 한 번에 모두 적재(실행은 안함)할 수 있습니다. 이렇게 하려면, 반드시 기록철의 첫 징표(주석과 공백 문자 제외)가 function가 아닌 다른 무엇인가이어야 합니다.

# 옥타브가 이 기록철을 함수 기록철이라고
# 인식해서는 안 됩니다.

1;

# 함수 one 정의:

function one ()
  …

옥타브가 이들 함수를 읽고 내부 형식으로 번역하려면, 이 기록철이 옥타브의 적재 경로(경로로 볼 수 있는 경로)에 있어야 하며, 적재 경로에 놓기만 하면 명령을 담은 기록철의 기본 이름을 입력하기만 하면 됩니다.(함수 기록철을 찾는 것과 똑같은 규칙을 대본 기록철에도 적용합니다.)

첫 번째 징표가 function이면, 옥타브가 함수를 번역하고 실행하려고 하여, 함수 정의 뒤에 공백이 아닌 문자가 등장한다는 오류 문구가 출력됩니다.

평가하기 전까지는 어떤 식별자의 정의도 옥타브가 찾으려고도 하지 않는다는 점에 유의하십시오. 이 말인즉슨, 아래 명령문이 기록철에 있거나 명령줄에 타자되어도 옥타브는 번역합니다.

# 함수 기록철 아님:
1;
function foo ()
  do_something ();
endfunction
function do_something ()
  do_something_else ();
endfunction

함수 foo에서 함수 do_something를 참조한 뒤에야 함수 do_something이 정의됩니다. 옥타브는 함수가 실제로 평가되어 상징을 참조하기 전까지는 모든 상징을 검토하지 않기 때문에 오류가 아닙니다.

옥타브는 필요하기 전까지 정의를 찾지 않기 때문에, 옥타브 기록철에서 bar.m를 호출한 함수나 대본 기록철이 있더라도 아래 부호는 명령줄에 직접 입력을 하던지, 대본 기록철을 읽던지, 함수 몸체에 있던지 상관 없이  언제나 ‘bar = 3’를 출력합니다.

eval ("bar = 3");
bar

정의가 함수로 번역되었을 것 같은 위 부호가 함수 몸체 안에 있으면 옥타브가 속습니다. 이 부호를 일관적으로 평가할 정도로 옥타브를 똑똑하게 만들기란 사실상 불가능합니다. 구문 분석기가 eval에 있는 문자열에서의 모든 참조를 입력받을 때 꼼꼼하게 평가하게 하지 않는 이상, 번역할 시점에서야 호출하여 작동시키기 때문입니다.(문자열은 사용자가 입력한 것 또는 함수가 평가되기 전까지는 모르는 무엇인가입니다.)

보통 대본 기록철 이름인 기록철.m을 명령으로하여 대본 기록철을 실행하지만, 함수 source로 아무 기록철에서나 대본 기록철을 실행할 수 있습니다.

source (기록철)
source (기록철, 문맥)

기록철의 내용물을 구문 분석하고 실행합니다.

문맥을 주지 않으면, 이름이 기록철.m인 필요하다거나 실행 경로에 있어야 한다는 조건이 필요하지 않은 것만 빼고 대본 기록철에서 명령을 실행하는 것과 똑같습니다.

현재 문맥 대신, 대본을 현재 함수의 문맥("caller") 또는 최상위 문맥("base")에서 실행할 수 있습니다.

같이 보기: run.


다음: , 이전: , 상위 문서: Functions and Scripts   [차례][찾아보기]