Parenscript version is 2.6 from quicklisp 2018-07-11.
(ps:ps
(ps:lisp ps:*ps-lisp-library*)
(reduce (lambda (acc e) (min acc e)) '(1 2) 0))
(defun reduce (func list &optional init) ;; the use of init here is actually a bit broken wrt null
(let* ((acc))
(do* ((i (if init -1 0) (1+ i))
(acc (if init init (elt list 0)) (func acc (elt list i))))
((>= i (1- (length list)))))
acc))
> reduce((acc, e) => acc * e, [1,2,3,4,5], 0)
120 /* expect 0 */
> reduce((acc,e) => Math.min(acc, e), [1, 2], 0)
1 /* expect 0 */
> reduce((acc, e) => acc + e, [1.0, 2.0], NaN)
3 /* expect NaN */
> reduce((acc, e) => acc && e, [true,true,true], false)
true /* expect false */
> reduce((acc,e) => acc, ["foo", "bar"], "")
"foo" /* expect "" */
function reduce(func, list, init) {
var acc = null;
for (var i = init ? -1 : 0, acc = init ? init : list[0]; i < list.length - 1; i += 1, acc = func(acc, list[i])) {
};
return acc;
};