이전: 이름으로 함수 호출, 상위 문서: 풀이   [차례][찾아보기]


9.2 다른 문맥에서 평가

표현식을 평가하기 전에 표현식에 사용한 변수를 값으로 바꾸어야 합니다. 이는 상징표에 있습니다. 해석기가 새 함수를 읽기 시작할 때마다, 새 함수를 현재 상징표에 저장하고 새 상징표를 만들어 함수 매개변수 목록과 nargin 같은 미리 정의된 변수 몇 개로 초기화 합니다. 함수에 안긴 표현식은 새 함수표를 사용합니다.

가끔은 함수를 작성하고, 함수를 호출하면 자체적인 문맥에서 함수가 변수를 건들 필요가 있습니다. C 같은 풀그림 짜기 언어에서 지시기를 사용하는 것과 비슷하게 이름으로 접근 꼴인 함수로 이를 행합니다.

saveload를 m 기록철에서 어떻게 하는지 생각해 보십시오. 예시:

function create_data
  x = linspace (0, 10, 10);
  y = sin (x);
  save mydata x y
endfunction

evalin를 함께 쓰면, save를 아래처럼 쓸 수 있습니다.

function save (file, name1, name2)
  f = open_save_file (file);
  save_var (f, name1, evalin ("caller", name1));
  save_var (f, name2, evalin ("caller", name2));
endfunction

caller’는 create_data 함수이고, name1은 평가하면 단순히 x 값인 문자열 "x"입니다.

다른 문맥에서 mydata의 값을 다시 불러오려고 합니다.

function process_data
  load mydata
  … do work …
endfunction

evalin를 함께 쓰면, load를 아래처럼 쓸 수 있습니다.

function load (file)
  f = open_load_file (file);
  [name, val] = load_var (f);
  assignin ("caller", name, val);
  [name, val] = load_var (f);
  assignin ("caller", name, val);
endfunction

caller’가 process_data 함수입니다.

명령 처리기에서 문맥 ‘caller’가 아닌 ‘base’에서 변수를 설정하고 사용할 수 있습니다.

실제로는 이 함수를 잘 쓰지 않습니다. 한 예시는, ‘code’를 호출자의 문맥에서 평가하고 출력한 오류 문구가 준 양상과 일치하는지 확인하는 fail (‘code’, ‘pattern’) 함수입니다. saveload 같은 다른 예시는, 모든 옥타브 변수가 ‘caller’ 문맥 안에 있고, evalin 가 필요없는  C++로 작성하였습니다.

evalin (문맥, 시도)
evalin (문맥, 시도, 예비)

"caller""base" 같은 문맥 문맥 안에서 표현식을 평가한다는 점만 빼면 eval과 같습니다.

같이 보기: eval, assignin.

assignin (문맥, 변수_이름, )

"base""caller" 같은 문맥 문맥 안에 있는 변수_이름을 할당합니다.

같이 보기: evalin.


이전: 이름으로 함수 호출, 상위 문서: 풀이   [차례][찾아보기]