Как применить динамический список аргументов к блоку в Io? - PullRequest
2 голосов
/ 12 октября 2011

Я пишу фреймворк для юнит-теста ( IoCheck ).Будет метод forAll, который принимает свойство, такое как isEven, которое возвращает четное целое число, и список генераторов list(genInt).

Синтаксис будет выглядеть следующим образом:

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

forAll(isEven, list(genInt))

Поскольку не все целые числа являются четными, выходные данные будут выглядеть следующим образом:

***Failed!
57

forAll вызовет генераторы, сохранят значения в списке и применят значения ксобственность 100 раз.Если свойство возвращает значение false, тестовый случай считается неудачным, и на экран выводятся ошибочные значения.

Для этого forAll должен принять блок неизвестной арности и вызвать егосо списком аргументов.Я не знаю, как это сделать.

Примечание: это НЕ то же самое, что Io язык 'применять аргументы' , потому что в этом случае код знает арность, но не функцию,В этом случае код не будет знать ни того, ни другого.

1 Ответ

1 голос
/ 12 октября 2011

Обновление: Block callWithArgList добавлено в главную ветвь Io.

Парагон имеет ответ. Добавьте этот фрагмент в свой код, и вы сможете отправить любому объекту Block сообщение «callWithArgList».

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

Работает как функция apply в Лиспе.

...