Kilka pytań tutaj, dotyczących letcc
, które są używane w Przyprawionym Schemerze.Sezonowany Schemat, letcc i podstęp
(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))))))
Chyba rozumiem, co
letcc
osiąga, a to jest po prostu coścatch
ithrow
w Ruby (i pozornie CL), co w zasadzie oznacza cały blok kodu może być przerwana przez wywołanie cokolwiek nazywa sięletcc
. Wydaje mi się, że to najmniej "funkcjonalna" rzecz, którą spotkałem w tej krótkiej serii książek i sprawia, że czuję się nieco niezdecydowana, aby z niej skorzystać, ponieważ chcę nauczyć się dobrego stylu funkcjonalnego. Czy po prostu nie rozumiem, że jest toletcc
, czy też nie jest to funkcjonalna koncepcja programowania i istnieje tylko w celu poprawy wydajności? Cała idea, że mogę być w trakcie rutyny, a następnie nagle dostać się do innego punktu w kodzie czuje się trochę źle ... jak nadużywanie próby/catch w Javie dla przepływu programu.letcc
nie wydaje się istnieć w wersji guile (1.8.7) Zainstalowałem w OS X. Czy jest tam inna nazwa, której powinienem szukać w guile?Jeśli mam nieporozumienie
letcc
porównując ją z try/catch w Java lub połowu/rzucać w Ruby (co jest nie obsługa wyjątków, tak aby było jasne, dla non-Rubiego), jak dokładnie działa na poziomie funkcjonalnym? Czy można go wyrazić w dłuższej, bardziej złożonej formie, która przekonuje mnie, że mimo wszystko jest funkcjonalna?
Jeśli masz implementację, która obsługuje zarówno "normalne" kontynuacje i kontynuację ucieczki, zwykle taniej jest używać tego ostatniego. Wzór w twoim przykładzie jest naturalnym dopasowaniem do kontynuacji ucieczki. Standardowy skrót to "let/ec". – soegaard
FYI, [ta strona] (http://community.schemewiki.org/?seasoned-schemer) pokazuje, jak zdefiniować 'letcc' w kategoriach' call/cc' używając prostego makra. –
@ JonO, czytałem to wcześniej i wypróbowałem, ale podstęp tylko mówi 'BŁĄD: nieprawidłowa składnia()' 'PRZERWA: (błąd pomyłki)'. Sprawdzone Zrobiłem to tak, jak mówi strona, ale nadal nie działa. Prawdopodobnie dowiem się dlaczego, kiedy dostaję się do nauki makr. – d11wtq