編程功能(或生成功能的功能)我有一個問題,我想要的解決方案是使用一個函數來生成另一個函數。 這是一個玩具示例。 我希望它返回[3,4,5]。它沒有按我希望的那樣工作,因為顯然傳遞的參數(偏移量)不適用於返回的匿名函數。 我的猜測是有一種替代方法可以做到這一點,但我無法弄清楚。
funWrapper = Function({array, fun},
fun(array);
);
funFunctional = Function({offset},
Function({x},
x + offset;
);
);
funWrapper([1,2,3], funFUnctional(2));腳本編寫回复:編程功能(或生成功能的功能)我做了一些實驗:如何使用定義類和使用JSL對象的函數式編程
如果您發現更多難題,請發回;在這一點上,我並沒有過多地使用JSL類,但是它們可能是實現所需功能的最佳方法。 命名空間可能是等效的,而沒有一些子分類的想法。 任一種都可以讓您將一個函數和數據打包在一起,然後通過引用將該包傳遞給另一個函數。
回复:編程功能(或生成功能的功能)感謝您分享這些有見地的小插曲,Craige。
這是使用兩種方法的解決方案。 類對我來說更直觀(並且“ this”當然比名稱空間(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>回复:編程功能(或生成功能的功能)你好@米特曼,
不知道這是否正是您想要的,但是至少可以解決您在原始帖子中給出的示例。
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
回复:編程功能(或生成功能的功能)你好@DiedrichSchmidt , 謝謝回复。 但是,這不適用於我的實際用例。 我希望能夠將任意(單調)函數作為參數傳遞給找到零的函數。 如果我明確定義每個函數,這將非常簡單,但是當我想編寫一個用於從參數化類創建函數實例的函數時,我就遇到了麻煩。 我在R(不是真正的OO)中長大,但作用域規則允許代碼像我在原始文章中一樣。
-電磁
回复:編程功能(或生成功能的功能)你好@米特曼,
聽起來您正在嘗試求解方程式的根(在這種情況下為函數,而不是JSL Function()),對嗎?
有一個稱為Minimize()的內置JSL函數,您可以將函數傳遞給Minimize()函數的起點,以開始其優化例程。 這可能比編寫自己的JSL Function()更容易。 您可以閱讀有關它的博客文章這裡。
希望能有所幫助!,
DS
回复:編程函數(或生成函數的函數)請注意,JMP14 類的功能並不完整,如果您過分依賴它們,您可能會被燒毀;但是,在 JMP12+ 中,您可以使用命名空間和一些元編程來創建類(包括繼承、構造函數、析構函數等)。
要回答 OP 的最初問題——您只需對腳本進行最少的編輯即可實現您的目標——只需注意在返回之前評估 JSL 函數的返回值(使用 Eval() 語句)。因此,如果您的最後一條語句是未計算的表達式(例如 Expr( Function( _definition_ ) ),則它將按預期返回該函數。只需在第二個函數中稍加技巧即可調用該函數(“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));