【发布时间】:2013-09-03 10:16:24
【问题描述】:
我正在向 BlockClosure 添加一些柯里化的东西。
要动态完成(即,不对原始块的不同数量参数的所有情况进行硬编码),我需要动态构造 BlockClosures,以便传递不同数量的参数。
有没有办法做到这一点,即使它涉及某种动态评估/编译?
【问题讨论】:
标签: closures metaprogramming smalltalk pharo currying
我正在向 BlockClosure 添加一些柯里化的东西。
要动态完成(即,不对原始块的不同数量参数的所有情况进行硬编码),我需要动态构造 BlockClosures,以便传递不同数量的参数。
有没有办法做到这一点,即使它涉及某种动态评估/编译?
【问题讨论】:
标签: closures metaprogramming smalltalk pharo currying
看看 Vassili Bykov 的这篇文章:
特别是据我了解,您的问题是关于不同数量的论点:
但是,由于 Smalltalk 块不支持等效的 Lisp“rest”参数,因此 curriedWithArguments: 方法必须显式枚举和处理我们实际期望在块调用中使用的所有参数。使用 CurriedBlock 会产生更好的示例。
【讨论】:
以下是您要查找的内容吗?在工作区尝试:
|myBlock|
myBlock := Compiler evaluate: '[ 1 + 2 ]'.
现在你已经从一个字符串编译了一个块:
myBlock class -> BlockClosure
并且可以评估它:
myBlock value -> 3
【讨论】: