动态创建BlockClosures?

时间:2013-09-03 10:16:25

标签: closures metaprogramming smalltalk pharo currying

我正在玩/向BlockClosure添加一些小东西。

要动态完成它(即不对原始块的不同数量的参数进行硬编码)我需要动态构造BlockClosures,以传递不同数量的参数。

有没有办法做到这一点,即使它涉及某种动态eval / compile?

2 个答案:

答案 0 :(得分:4)

看看Vassili Bykov的这篇文章:

特别是我理解你的问题是关于不同数量的论点:

  

但是,由于Smalltalk块不支持等效的Lisp“rest”参数,因此curriedWithArguments:方法必须显式枚举和处理我们实际期望在块调用中使用的所有arities。使用CurriedBlock会产生一个更好的例子。

答案 1 :(得分:1)

以下是您要找的内容?在工作区中尝试:

|myBlock|
myBlock := Compiler evaluate: '[ 1 + 2 ]'.

现在您已经从字符串中编译了一个块:

myBlock class -> BlockClosure

并且可以评估它:

myBlock value -> 3