プログラミング汎関数(または関数を生成する関数)私が望む解決策が、ある関数を使用して別の関数を生成することであるという問題があります。 これがおもちゃの例です。 私はそれが[3,4,5]を返すことを期待しています。返された匿名関数で渡された引数(オフセット)を使用できないため、期待どおりに機能しません。 私の推測では、これを置換で行う方法があると思いますが、私はそれを理解できませんでした。
funWrapper = Function({array, fun},
fun(array);
);
funFunctional = Function({offset},
Function({x},
x + offset;
);
);
funWrapper([1,2,3], funFUnctional(2));スクリプティングRe:プログラミング汎関数(または関数を生成する関数)私はいくつかの実験をしました:クラスの定義の使用方法そしてJSLオブジェクトを使用した関数型プログラミング
パズルの詳細がわかったら、投稿してください。この時点では、私はJSLクラスをあまり使用していませんが、JSLクラスがあなたが望むことを行うための最良の方法かもしれません。 名前空間は、サブクラス化のアイデアがなくても同等である可能性があります。 どちらの場合も、関数とデータを一緒にパッケージ化し、そのパッケージを参照によって別の関数に渡すことができます。
Re:プログラミング汎関数(または関数を生成する関数)これらの洞察に満ちたビネットを共有してくれてありがとう、Craige。
両方のアプローチを使用したソリューションを次に示します。 クラスは私にとってより直感的だと感じます(そして「これ」は名前空間(expr(ns << get name)))よりも確かに入力が簡単です。
JMP 14ProとJMP12Proの両方でテスト済み。 クラスはJMP12Proでは利用できません。
funOffsetAdder = Function({offset},
ns = NewNamespace();
ns:offset = offset;
ns:theMethod = EvalExpr(
Function({x},
this = namespace(expr(ns<<GETNAME></GETNAME>Re:プログラミング汎関数(または関数を生成する関数)こんにちは@ミットマン、
これがまさにあなたが望むものであるかどうかはわかりませんが、少なくとも元の投稿で示した例を解決するために機能します。
Names Default to Here (1);
fWrap = Function({array, offset}, fFun(array offset));
fFun = Function({x, offset}, x + offset);
fWrap([3, 4, 5, 6], 5 );これは[8、9、10、11]を返します。
見るのは興味深い問題です。 なぜこのようにする必要があるのかを共有できれば、私は非常に興味があります。
お役に立てれば!、
DS
Re:プログラミング汎関数(または関数を生成する関数)こんにちは@DiedrichSchmidt 、 返信いただきありがとうございます。 ただし、これは私の実際のユースケースでは機能しません。 ゼロを見つける関数の引数として、任意の(単調)関数を渡せるようにしたい。 これは、各関数を明示的に定義すれば十分に簡単ですが、パラメーター化されたクラスから関数のインスタンスを作成するための関数を作成したいときに問題が発生しました。 私はRで育ちましたが、これは実際にはOOではありませんが、スコープ規則により、元の投稿にあったようなコードが許可されています。
-EM
Re:プログラミング汎関数(または関数を生成する関数)こんにちは@ミットマン、
方程式の根(この場合はJSL Function()ではなく関数)を解こうとしているようですが、それは正しいですか?
Minimize()と呼ばれる組み込みのJSL関数があり、Minimize()関数の開始点を使用して関数を渡して、最適化ルーチンを開始できます。 これは、そのための独自のJSL Function()を作成するよりも簡単な方法かもしれません。 あなたはそれについてのブログ投稿を読むことができますここに。
お役に立てば幸いです!、
DS
Re:プログラミング汎関数(または関数を生成する関数)JMP14クラスは完全には機能しておらず、それらに過度に依存するとやけどを負う可能性があることに注意してください。ただし、JMP12 +では、名前空間といくつかのメタプログラミングを使用してクラス(継承、コンストラクタ、デストラクタなどを含む)を作成できます。
OPの最初の質問に答えるには(スクリプトを最小限に編集するだけで目標を達成できます)、JSL関数からの戻り値が返される前に(Eval()ステートメントで)評価されることに注意してください。したがって、最後のステートメントが未評価の式(Expr(Function(_definition_)など)の場合、意図したとおりに関数が返されます。関数を呼び出すことができるようにするために必要なのは、2番目の関数のわずかなトリックだけです(「fun = fun」ステートメント)。
funWrapper = Function({array, fun},
fun = fun;
fun(array);
);
funFunctional = Function({offset},
Substitute(
Expr(
Function({x},
x + _offset_;
)
)
,
Expr( _offset_ ), offset
)
);
funWrapper([1,2,3], funFUnctional(2));