2010-11-18 12 views
15

在Python,我可以做這樣的事情:什麼是方案相當於元組拆包?

t = (1, 2) 
a, b = t 

...和爲1和B爲2。假設我有方案列表'(1 2)。有什麼辦法可以做與let類似的事嗎?如果它有所作爲,我正在使用Racket。

回答

24

在球拍可以用match

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

和相關的東西像match-define

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

match-let

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

,對於列表,向量,結構等工作等等。對於多個值,您可以使用define-values

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

let-values。但請注意,我不能將t定義爲「元組」,因爲在(大多數)方案實現中多個值不是第一類值。

+0

這有效,但我一直在尋找使用'let'的東西,並且這個'定義了它。我想我可以編寫一個將這種定義拼接成「本地」的宏。 – 2010-11-20 00:28:41

+2

好吧,有'match-let'(更新了一個例子),但一個簡單的'match'也可以。 (你的問題使得它看起來像你想要的*定義。)另外,你總是可以在局部範圍內使用定義。 – 2010-11-20 03:14:35

4

我認爲這是你在找什麼:

let-valueslet+

+0

感謝您發佈此!唯一的問題是'let-values'並沒有完成我想做的事情,而我似乎無法得到使用'let +'工作所需的庫。也就是說,這個「Python程序員計劃」網站肯定會派上用場。 – 2010-11-20 00:30:40

+0

那麼,至少你有一個很酷的新網站可以挖掘,如果你遇到其他問題。看看它,希望你能找到如何爲'let +'設置你的環境。乾杯。 – 2010-11-20 00:35:12

5

你正在尋找什麼(在Lisp的世界中至少)的總稱,是解構和實現它被稱爲解構綁定宏。在Common Lisp的,它的工作原理是這樣的:

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

它也適用於嵌套多個「級別」:

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

它看起來像有解構綁定的方案宏的nice implementation

5

的精簡版的成語是使用申請拉姆達在那裏你會使用,如:

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

的優點是,它適用於任何實現。當然,這隻能用於簡單的情況,但有時候這只是你需要的。

相關問題