2009-11-06 7 views
5

J'ai lu la documentation de fonctions telles que les valeurs et les valeurs-définitions qui renvoient et consomment plusieurs valeurs. Je comprends ce qu'ils font. Ce n'est pas clair pour moi quand vous voudriez utiliser une telle chose.Quand utiliser (values ​​...) (define-values ​​...) dans le schéma

Quand est-ce qu'il serait mauvais/impossible de construire une seule liste de valeurs et de consommer cette seule liste de valeurs à la place?

Répondre

5

define-values ​​ est une fonctionnalité qui vous permet de lier directement des variables aux résultats d'une expression. Cela vous évite de taper car vous n'avez pas à décompresser explicitement une liste. Je ne pense pas qu'il y ait des situations où il est mauvais ou impossible de construire une seule liste de valeurs. En fait, ce sera plus portable que définir-valeurs.

+0

Lorsque vous utilisez des listes de ce type, vous devez probablement les déstructurer immédiatement avec une bibliothèque de correspondance. – grettke

+0

@grettke Mais tous les schémas n'ont pas de bibliothèque de correspondance :( –

+0

@Vijay: D'accord. – grettke

5

Here est mon article original sur le sujet; il est copié ci-dessous.

Dans this thread dans comp.lang.scheme les moyens de retourner plusieurs valeurs sont discutés. Il y a apparemment 3 solutions dans 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)) 

Par Aziz et le point d'Aaron; vous devez utiliser l'approche qui communique le plus d'informations au lecteur.