2011-10-12 22 views
2

我在写一个单元测试框架(IoCheck)。将有一个forAll方法接受一个属性,如isEven,它返回一个整数是否是偶数,以及一个发电机列表list(genInt)如何在Io中的块中应用动态参数列表?

的语法如下所示:

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

forAll(isEven, list(genInt)) 

由于不是所有的整数均匀,输出如下:

***Failed! 
57 

forAll将调用发电机,存储在列表中的值,并将这些值应用到属性100次。如果该属性返回false,则测试用例将被视为失败,并且会将违规值打印到屏幕上。

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

注意:这与Io language 'apply arguments'不一样,因为在那种情况下,代码知道的是arity而不是函数。在这种情况下,代码将不会知道。

回答

1

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

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

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

它很像Lisp的apply函数。

相关问题