プログラミング関数 (または関数を生成する関数)関数を使用して別の関数を生成することが必要な解決策であるという問題があります。 おもちゃの一例をご紹介します。 私は[3,4,5]を返すと予想しています。どうやら、渡された引数(オフセット)が、返される匿名関数で使用できないため、期待どおりに機能しません。 置換でこれを行う方法があると思いますが、わかりませんでした。
funWrapper = Function({array, fun},
fun(array);
);
funFunctional = Function({offset},
Function({x},
x + offset;
);
);
funWrapper([1,2,3], funFUnctional(2));スクリプト作成Re: 関数 (または関数を生成する関数) のプログラミング二重投稿して申し訳ありませんが、実際にはこれを行うより良い方法があり、関数の変更のみが必要です。
funWrapper = Function({array, fun},
fun(array);
);
funFunctional = Function({offset},
Eval( Substitute(
Expr(
Function({x},
x + _offset_;
)
)
,
Expr( _offset_ ), offset
) )
);
funWrapper([1,2,3], funFUnctional(2));Re: 関数 (または関数を生成する関数) のプログラミング@SDF1 、次のように、関数がゼロになるパラメーターの値を見つけようとしています。ユニルートRの関数。 同様の JMP 関数を知りません。 いずれにせよ、それを行うためのコードを盗んだので、とても簡単でした:)
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));Re: 関数 (または関数を生成する関数) のプログラミングやあ@ミットマン、
方程式の根(この場合は JSL Function() ではなく関数)を解こうとしているように思えますが、正しいですか?
Minimize() という組み込みの JSL 関数があり、これに Minimize() 関数の開始点を指定して関数を渡し、最適化ルーチンを開始できます。 これは、独自の JSL Function() を作成するよりも簡単な方法かもしれません。 それに関するブログ投稿を読むことができますここ。
お役に立てば幸いです!、
DS
Re: 関数 (または関数を生成する関数) のプログラミングやあ@SDF1 、 返信いただきありがとうございます。 ただし、これは私の実際の使用例では機能しません。 ゼロを見つける関数に引数として任意の(単調)関数を渡せるようにしたいと考えています。 これは、各関数を明示的に定義する場合には十分簡単ですが、パラメーター化されたクラスから関数のインスタンスを作成する関数を作成したい場合に問題が発生しました。 私は R で育ちました。R は実際には OO ではありませんが、スコープ ルールにより元の投稿にあるようなコードが許可されています。
-EM
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: 関数 (または関数を生成する関数) のプログラミングクレイジ、洞察力に富んだエピソードを共有してくれてありがとう。
両方のアプローチを使用した解決策を次に示します。 私にとってはクラスの方が直感的だと感じます (そして、「this」は確かに namespace(expr(ns<
JMP 14 Pro と JMP 12 Pro の両方でテスト済み。 クラスは JMP 12 Pro では利用できません。
funOffsetAdder = Function({offset},
ns = NewNamespace();
ns:offset = offset;
ns:theMethod = EvalExpr(
Function({x},
this = namespace(expr(ns<<GETNAME></GETNAME>Re: 関数 (または関数を生成する関数) のプログラミングいくつかの実験をしてみました。クラス定義の使い方とJSLオブジェクトを使用した関数型プログラミング
パズルの詳細がわかったら、また投稿してください。現時点では JSL クラスはあまり使用していませんが、やりたいことを行うには JSL クラスが最適な方法かもしれません。 いくつかのサブクラス化の概念がなければ、名前空間は同等である可能性があります。 どちらを使用しても、関数とデータを一緒にパッケージ化し、そのパッケージを参照によって別の関数に渡すことができます。