Экспериментирую тут с сабжем, и наткнулся на одну непонятку. Вот код:
(define mul (lambda(x y) (write 'foo) (* x y)))
(define fact (lambda(n opt)
(call/cc (lambda(ret)
(cond
((and (< n 2) opt) (ret 1))
((< n 2) 1)
(#t (mul n (fact (- n 1) opt))))))))
(write (fact 5 #t))
; foofoofoofoo120
mul=function(x, y){console.log("foo"); return x*y}
fact=function(n, opt){
if(opt&&(n<2)) throw 1 // если 2-й аргумент == истина -- бросить единицу
if(n<2) return 1 // дальше как обычно
return mul(n, fact(n - 1, opt))
}
try{
fact(5, true)
}catch(n){console.log(n)} // 1
Ни хрена непонятно, чем этот код отличается от такого:
(define search (lambda(wanted? lst)
(call/cc (lambda(c)
(for-each (lambda(el) (if (wanted? el) (c el))) lst)))))
(define wanted-2? (lambda(el) (write el) (= el 2)))
(write (search wanted-2? '(1 2 3)))
; 122