Scheme: Różnice pomiędzy wersjami

Dodane 228 bajtów ,  4 lata temu
m
<syntaxhighlight lang="scheme">
m (<syntaxhighlight lang="scheme">)
m (<syntaxhighlight lang="scheme">)
 
"`" jest to skrót do funkcji quasiquote, "," – to skrót do unquote a ",@" to skrót do unquote-splicing
<syntaxhighlight lang="scheme">
<pre>
(define-macro (for params . body)
(let ((iter (gensym)) (step (if (= (length params) 4)
; przykład użycia
(for-list (i (list 10 20 30)) (display i) (newline))
</syntaxhighlight>
</pre>
 
=== Kontynuacje ===
Przykładowe zastosowanie kontynuacji to implementacja [[współprogram]]ów czy generatorów takich jak te w [[Python]]ie czy [[C Sharp|C#]]. Przykładowa implementacja [[współprogram]]ów:
 
<syntaxhighlight lang="scheme">
<pre>
(define (make-coroutine fn . args)
(define (return . args) (call-with-current-continuation
(k)
(values)))))
</syntaxhighlight>
</pre>
 
Przykładowy generator atomów grafu:
 
<presyntaxhighlight lang="scheme"> (define (tree-iterate yield datum)
(cond ((null? datum))
((pair? datum)
(tree-iterate yield (cdr datum)))
(else (yield datum))))
</syntaxhighlight>
</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 [[Uchwyt (informatyka)|uchwyty]]<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 ===
Wejście i wyjście w języku Scheme reprezentowane jest przez porty. Są to obiekty, które (odpowiednio) są źródłem znaków (obiektów typu char) lub które mogą przyjmować znaki. Podstawowe procedury odczytu i zapisu to <tt>read</tt> i <tt>write</tt>. Przykład zastosowania:
<syntaxhighlight lang="scheme">
<pre>
(write (+ (read) (read)))
</syntaxhighlight>
</pre>
 
Standard języka opisuje również funkcje otwierające pliki i otwierające i zamykające porty.
Funkcja czytająca linie z pliku i zwracająca listę (działająca w interpreterze Guile).
<syntaxhighlight lang="scheme">
<pre>
(define (read-lines filename)
(call-with-input-file filename
result
(loop (append result (list line)))))))))
</syntaxhighlight>
</pre>
Fukcja zapisująca liste stringów do pliku
<syntaxhighlight lang="scheme">
<pre>
(define (write-lines list port)
(let loop ((list list))
(define (write-lines list port)
(for-each (lambda (line) (write-line line port)) list))
</syntaxhighlight>
</pre>
 
== Definicja języka ==
57 605

edycji