Scheme: Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
TjBot (dyskusja | edycje)
m r2.7.2) (Robot dodał az:Scheme
Linia 164:
 
=== Kontynuacje ===
Dość unikalną cechą Scheme jest wbudowane w język wsparcie dla [[kontynuacjaInstrukcja kontynuacji|kontynuacji]]. Za pomocą standardowej funkcji <tt>call-with-current-continuation</tt> lub <tt>call/cc</tt> możliwy jest dostęp do następnego wyrażenia podlegającego ewaluacji. W przykładowym wyrażeniu <tt>(foo (bar (baz) (xenu)))</tt> kontynuacją <tt>(bar (baz) (xenu))</tt> będzie <tt>(foo x)</tt> gdzie <tt>x</tt> jest wartością zwracaną przez <tt>(bar ...)</tt>.
 
Szczególną cechą kontynuacji jest możliwość wywołania ich wielokrotnie czy zapisania w zmiennej do użycia na później, po odwinięciu ''stosu''. W przeciwieństwie do funkcji biblioteki standardowej C <tt>setcontext</tt>, wzorcowa implementacja Scheme nie powoduje żadnego narzutu wydajności przy pobraniu czy wywołaniu kontynuacji. Stosowany jest tutaj [[styl przekazywania kontynuacji]] gdzie stos nie istnieje i pobranie/wywołanie kontynuacji niczym nie różni się od wywołania funkcji.
Linia 196:
</pre>
 
Kontynuacje wykorzystywane są by nadać wrażenie synchroniczności typowo asynchronicznym operacjom takim jak np. zapytania HTTP<ref>http://www.cs.brown.edu/~sk/Publications/Papers/Published/khmgpf-impl-use-plt-web-server-journal/paper.pdf</ref>. Niestety, przez obecność kontynuacji jako typ danych pierwszej klasy w Scheme nie jest możliwe orzeknięcie czy dany blok kodu będzie jeszcze wywoływany, komplikując zamykanie zasobów takich jak deskryptory plików i inne [[uchwytUchwyt (informatyka)|uchwyty]]y<ref>[http://www.nhplace.com/kent/PFAQ/unwind-protect-vs-continuations-original.html KMP's PFAQ: UNWIND-PROTECT vs Continuations (page 3)<!-- Tytuł wygenerowany przez bota -->]</ref>.
 
=== I/O ===