Twitter @m_hiyama 
Follow @m_hiyama

 hiyama{at}chimaira{dot}org 



 

セミナー補足:関数コードの実行エンジン


E


f2f^ f


(一)E(f^, a, b) = f(a, b) -- E3

(二)E(f^, [a, b]) = f(a, b) -- E22

(三)E([f^, a, b]) = f(a, b) -- E13

(四)E([f^, [a, b]]) = f(a, b) -- E12

 

f^EExec, Eval, EngineEf^ff

EEf


(一)E(λ(x, y).(x + y), a, b) = <x, y| x + y>(a, b)

(二)E(λ(x, y).(x + y), [a, b]) = <x, y| x + y>(a, b)

(三)E([λ(x, y).(x + y), a, b]) = <x, y| x + y>(a, b)

(四)E([λ(x, y).(x + y), [a, b]]) = <x, y| x + y>(a, b)




EApply, Exec, Eval1, Eval2JavaScript
/* 関数コードと、引数並び(タプル、リスト)を受け取って、
 * もとの関数の計算を再現する
 */ 
function Apply(fun, args) {
  return fun.apply(null, args);
}

/* 関数コードと、その関数コードに埋め込まれてない任意の引数を受け取って、
 * もとの関数の計算を再現する
 * Exec自体は可変引数
 */
function Exec(fun /* ... */) {
  var args = new Array();
  for (var i = 1; i < arguments.length; i++) {
    args[i-1] = arguments[i];
  }
  return fun.apply(null, args);
}

/* 関数コードと、引数をそのまま並べたタプル(リスト)を受け取って
 * もとの関数の計算を再現する
 */ 
function Eval1(funArgs) {
  var fun = funArgs.shift();
  var args = funArgs;
  return Apply(fun, args);
}

/* 関数コードと、引数並びの組み(2項のタプル、リスト)を受け取って
 * もとの関数の計算を再現する
 */ 
function Eval2(funArgs) {
  var fun = funArgs[0];
  var args = funArgs[1];
  return Apply(fun, args);
}

[追記 date=""]ウゲッ:

  var fun = funArgs[0];
  funArgs.shift();

[/]


js> Apply(function(x, y){return x + y}, [2, 3])
5
js> Exec(function(x, y){return x + y}, 2, 3)
5
js> Eval1([function(x, y){return x + y}, 2, 3])
5
js> Eval2([function(x, y){return x + y}, [2, 3]])
5
js> 

JavaScriptevalEval1Eval2

Apply, Exec, EvalJavaScriptApply