• Какие инструменты есть для тестирования чёрного ящика через stdin/stdout?

    @thewizardplusplus Автор вопроса
    Нашёл такое решение: Bats (Bash Automated Testing System). Это система юнит-тестирования для скриптов на bash и консольных утилит. Позволяет делать то, что я хотел, а так же гораздо больше.

    Пример, приведённый в вопросе, на Bats будет выглядеть следующим образом (файл test.bats):

    #!/usr/bin/env bats
    
    @test "test of words" {
    	result="`printf 'one two three' | wc -w`"
    	[[ "$result" == 3 ]]
    }
    
    @test "test of characters" {
    	result="`printf 'one two three' | wc -c`"
    	[[ "$result" == 13 ]]
    }


    Запуск:

    $ bats test.bats

    Вывод:

    ✓ test of words
    ✓ test of characters
    
    2 tests, 0 failures
    Ответ написан
    Комментировать
  • Как реализовать вариадическую чистую функцию без классов типов?

    @thewizardplusplus Автор вопроса
    Пока описал задачу, сам понял, как её нужно решать. ))

    function add(x) {
    	return function(y) {
    		return x + y;
    	};
    }
    
    function sum(a) {
    	return function(b) {
    		if (b) {
    			return sum(add(a)(b));
    		} else {
    			return a;
    		}
    	};
    }
    
    sum(1)(2)(3)(4)(5)() === 15


    function cons(x) {
    	return function(y) {
    		return [x, y];
    	};
    }
    
    function list(a) {
    	return function(b) {
    		if (b) {
    			return list(cons(a)(b));
    		} else {
    			return a;
    		}
    	};
    }
    
    list(1)(2)(3)(4)(5)() === [[[[1, 2], 3], 4], 5]


    Update

    Скорректированный код для второго случая, возвращающий более каноничный вид списка:

    function cons(x) {
      return function(y) {
        return [x, y];
      };
    }
    
    function list(a) {
      return function(b) {
        if (typeof b !== 'undefined') {
          if (a instanceof Array) {
              return list(cons(b)(a));
          } else {
              return list(cons(b)(cons(a)('NIL')));
          }
        } else {
          return a;
        }
      };
    }
    
    list(1)(2)(0)(4)(5)() === [5,[4,[0,[2,[1,"NIL"]]]]]


    Хотя список всё равно создаётся в обратном порядке.
    Ответ написан
    Комментировать