2010-11-18 10 views

Respuesta

24

En la raqueta puede utilizar match,

(define t (list 1 2)) 
(match [(list a b) (+ a b)]) 

y cosas relacionadas, como match-define:

(match-define (list a b) (list 1 2)) 

y match-let

(match-let ([(list a b) t]) (+ a b)) 

que funciona para listas, vectores, estructuras, etc. etc. Para valores múltiples, usaría define-values:

(define (t) (values 1 2)) 
(define-values (a b) (t)) 

o let-values. Pero tenga en cuenta que no puedo definir t como una "tupla" ya que los valores múltiples no son valores de primera clase en (la mayoría) implementaciones de esquema.

+0

Esto funciona, pero estaba buscando algo que usase 'let', y esto' lo define'. Sin embargo, supongo que podría escribir una macro que empalme tal definición en 'local '. –

+2

Bueno, hay 'match-let' (actualizado con un ejemplo), pero una simple 'coincidencia' puede hacerlo también. (Su pregunta hizo que pareciera que usted * quería * definiciones). Además, siempre puede usar las definiciones en un ámbito local. –

4

creo que esto es lo que busca:

Mira let-values o let+.

+0

¡Gracias por publicar esto! Lo único es que 'let-values' no hace * bastante * lo que yo quería que hiciera, y parece que no puedo obtener la biblioteca que se requiere para usar' let + 'funcionando. Dicho esto, este "sitio web para programadores de Python" ciertamente será útil. –

+0

Bueno, al menos tienes un nuevo sitio interesante para buscar si tienes otros problemas. Échale un vistazo, espero que encuentres cómo configurar tu entorno para 'let +'. Aclamaciones. –

5

El término general para lo que está buscando (por lo menos en Lisp-mundo) es desestructuración y una macro que pone en práctica se conoce como desestructuración-bind. En Common Lisp, funciona así:

(destructuring-bind (a b c) '(1 2 3) 
    (list a b c)) ;; (1 2 3) 

también funciona para varios "niveles" de anidación:

(destructuring-bind (a (b c) d) '(1 (2 3) 4) 
    (list a b c d)) ;; (1 2 3 4) 

Parece que hay un nice implementation de desestructuración-bind como una macro esquema.

5

un lenguaje escueto es utilizar aplican con lambda donde debería usar vamos, como:

(define t '(1 2)) 
(apply (lambda (a b) 
      ;; code that would go inside let 
     ) 
     t) 

La ventaja es que funciona en cualquier implementación. Por supuesto, esto solo se puede usar en casos simples, pero a veces eso es todo lo que necesitas.

Cuestiones relacionadas