2010-11-18 9 views

risposta

24

In racchetta è possibile utilizzare match,

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

e cose correlate come match-define:

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

e match-let

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

che funziona per le liste, vettori, le strutture, ecc ecc. Per valori multipli, useresti define-values:

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

o let-values. Notare che non è possibile definire t come una "tupla" poiché più valori non sono valori di prima classe in (la maggior parte) implementazioni di schemi.

+0

Funziona, ma stavo cercando qualcosa che usasse 'let', e questo' lo definisce. Suppongo di poter scrivere una macro che giunca tale definizione in 'local'. –

+2

Bene, c'è 'match-let' (aggiornato con un esempio), ma anche un semplice' match' può fare. (La tua domanda ha fatto apparire come te * voluto * definizioni.) Inoltre, puoi sempre usare le definizioni in un ambito locale. –

4

credo che questo è quello che stai cercando:

Guarda let-values o let+.

+0

Grazie per aver postato questo! L'unica cosa è che 'let-values' non fa * abbastanza * ciò che volevo che facesse, e non riesco a ottenere la libreria che è necessaria per usare' let + 'lavorando. Detto questo, questo sito web "schema per programmatori Python" sarà sicuramente utile. –

+0

Beh, almeno un nuovo sito interessante da esplorare se si incontrano altri problemi. Dai un'occhiata a questo, spero che troverai come impostare il tuo ambiente per 'let +'. Saluti. –

5

Il termine generale per quello che stai cercando per (almeno in Lisp-mondo) è destrutturazione e una macro che implementa è conosciuto come destrutturazione-bind. In Common Lisp, funziona così:

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

funziona anche per più "livelli" di nidificazione:

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

Sembra che ci sia un nice implementation di destrutturazione-bind come macro schema.

5

Uno scarno linguaggio è quello di utilizzare applicano con lambda dove occorre utilizzare diamo, come:

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

Il vantaggio è che funziona su qualsiasi implementazione. Ovviamente questo può essere usato solo su casi semplici, ma a volte è tutto ciò di cui hai bisogno.