【问题标题】:How do I apply a dynamic list of arguments to a block in Io?如何将动态参数列表应用于 Io 中的块?
【发布时间】:2011-12-06 07:47:56
【问题描述】:

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

语法如下:

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

forAll(isEven, list(genInt))

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

***Failed!
57

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

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

注意:这与Io language 'apply arguments' 不同,因为在这种情况下,代码知道元数但不知道函数。在这种情况下,代码将一无所知。

【问题讨论】:

    标签: lambda block apply iolanguage


    【解决方案1】:

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

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

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

    它的工作方式类似于 Lisp 的 apply 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多