编程功能(或生成功能的功能)我有一个问题,我想要的解决方案是使用一个函数来生成另一个函数。 这是一个玩具示例。 我希望它返回[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));