Doświadczony Schemer, letcc i podstęp
Kilka pytań tutajletcc
który jest używany w The Seasoned Schemer.
(define (intersect-all sets)
(letcc hop
(letrec
((A (lambda (sets)
(cond
((null? (car sets)) (hop '())
((null? (cdr sets)) (car sets))
(else
(intersect (car sets)
(A (cdr sets)))))))
; definition of intersect removed for brevity
(cond
((null? sets) '())
(else (A sets))))))
Myślę, że rozumiem coletcc
osiąga, a to jest w zasadzie coś takiegocatch
ithrow
w ruby (i pozornie CL), co w zasadzie oznacza, że cały blok kodu może zostać skrócony, wywołując dowolną nazwęletcc
jest. Wydaje mi się, że jest to najmniej „funkcjonalna” rzecz, którą natknąłem się w tej krótkiej serii książek i sprawia, że czuję się trochę niezdecydowany, aby z niej korzystać, ponieważ chcę nauczyć się dobrego stylu funkcjonalnego. Czy jestem po prostu nieporozumieniem?letcc
lub czy nie jest to właściwie koncepcja programowania funkcjonalnego i istnieje tylko w celu poprawy wydajności? Cały pomysł, że mogę być w środku jakiejś procedury, a potem nagle dostać się do innego punktu w kodzie, wydaje się trochę błędny ... jak nadużywanie try / catch w Javie dla przepływu programu.
letcc
nie wydaje się istnieć w wersji guile (1.8.7) Zainstalowałem w OS X. Czy istnieje inna nazwa, której powinienem szukać w podstępnej?
Jeśli nie rozumiemletcc
porównując go z try / catch w Javie lub przechwytując / rzutując ruby (czylinie obsługa wyjątków, aby być jasnym, dla nie-rubyistów), jak dokładnie działa, na poziomie funkcjonalnym? Czy można to wyrazić w dłuższy, bardziej złożony sposób, który przekonuje mnie, że w końcu działa?