如何将动态参数列表应用于Io中的块?

时间:2011-10-12 17:03:57

标签: lambda block apply iolanguage

我正在编写一个单元测试框架(IoCheck)。将有forAll方法接受属性,例如isEven,它返回整数是否为偶数,以及生成器列表list(genInt)

语法如下所示:

isEven := block(i, i % 2 == 0)

forAll(isEven, list(genInt))

由于并非所有整数都是偶数,因此输出将如下所示:

***Failed!
57

forAll将调用生成器,将值存储在列表中,并将值应用于属性100次。如果属性返回false,则测试用例被视为失败,并且违规值将被打印到屏幕上。

为了做到这一点,forAll必须接受一个未知的arity块并用一个参数列表调用它。我不知道该怎么做。

注意:这与Io language 'apply arguments'不同,因为在这种情况下代码知道arity但不知道函数。在这种情况下,代码都不会知道。

1 个答案:

答案 0 :(得分:1)

更新:Block callWithArgList已添加到Io主分支。

Paragon有答案。将此代码段添加到您的代码中,您将能够向任何Block对象发送消息“callWithArgList”。

getSlot("Block") callWithArgList := method(argList,
    getSlot("self") doMessage(argList asMessage setName("call"))
)

它就像Lisp的apply函数一样。