2009-11-06 11 views
5

Ho letto la documentazione per funzioni come valori e valori di definizione che restituiscono e consumano più valori. Capisco cosa fanno. Non mi è chiaro quando vorresti usare una cosa del genere.Quando utilizzare (valori ...) (define-values ​​...) in Schema

Quando sarebbe sbagliato/impossibile creare un singolo elenco di valori e consumare invece un singolo elenco di valori?

risposta

5

valori di definizione è una comodità che consente di associare direttamente variabili ai risultati di un'espressione. Ti risparmia un po 'di digitazione in quanto non devi decomprimere esplicitamente un elenco. Non penso che ci siano situazioni in cui è brutto o impossibile costruire un singolo elenco di valori. In effetti, questo sarà più portatile di define-values ​​.

+0

Quando si utilizzano elenchi simili, è probabile che si destrutturino immediatamente con una libreria di corrispondenze. – grettke

+0

@grettke Ma non tutti gli schemi hanno una libreria di corrispondenze :( –

+0

@Vijay: D'accordo, ci sono però delle librerie di corrispondenze portatili. – grettke

5

Here è il mio post originale sull'argomento; è copiato di seguito.

Nel thread this in comp.lang.scheme vengono discussi i metodi per restituire più valori. Ci sono apparentemente 3 soluzioni in R6RS:

(import (rnrs)) 

; let-values + values 
(define (foo1) 
    (values 1 2 3)) 

(let-values (((a b c) (foo1))) 
    (display (list a b c)) 
    (newline)) 

; cps 
(define (foo2 k) 
    (k 1 2 3)) 

(foo2 (lambda (a b c) 
     (display (list a b c)) 
     (newline))) 

; list 
(define (foo3) 
    (list 1 2 3)) 
(let ((result (foo3))) 
    (display result) 
    (newline)) 

per punto Aziz e Aaron; dovresti usare l'approccio che comunica la maggior parte delle informazioni al lettore.