在Python,我可以做這樣的事情:什麼是方案相當於元組拆包?
t = (1, 2)
a, b = t
...和爲1和B爲2。假設我有方案列表'(1 2)
。有什麼辦法可以做與let
類似的事嗎?如果它有所作爲,我正在使用Racket。
在Python,我可以做這樣的事情:什麼是方案相當於元組拆包?
t = (1, 2)
a, b = t
...和爲1和B爲2。假設我有方案列表'(1 2)
。有什麼辦法可以做與let
類似的事嗎?如果它有所作爲,我正在使用Racket。
在球拍可以用match
,
(define t (list 1 2))
(match [(list a b) (+ a b)])
和相關的東西像match-define
:
(match-define (list a b) (list 1 2))
(match-let ([(list a b) t]) (+ a b))
,對於列表,向量,結構等工作等等。對於多個值,您可以使用define-values
:
(define (t) (values 1 2))
(define-values (a b) (t))
或let-values
。但請注意,我不能將t
定義爲「元組」,因爲在(大多數)方案實現中多個值不是第一類值。
感謝您發佈此!唯一的問題是'let-values'並沒有完成我想做的事情,而我似乎無法得到使用'let +'工作所需的庫。也就是說,這個「Python程序員計劃」網站肯定會派上用場。 – 2010-11-20 00:30:40
那麼,至少你有一個很酷的新網站可以挖掘,如果你遇到其他問題。看看它,希望你能找到如何爲'let +'設置你的環境。乾杯。 – 2010-11-20 00:35:12
你正在尋找什麼(在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。
的精簡版的成語是使用申請與拉姆達在那裏你會使用讓,如:
(define t '(1 2))
(apply (lambda (a b)
;; code that would go inside let
)
t)
的優點是,它適用於任何實現。當然,這隻能用於簡單的情況,但有時候這只是你需要的。
這有效,但我一直在尋找使用'let'的東西,並且這個'定義了它。我想我可以編寫一個將這種定義拼接成「本地」的宏。 – 2010-11-20 00:28:41
好吧,有'match-let'(更新了一個例子),但一個簡單的'match'也可以。 (你的問題使得它看起來像你想要的*定義。)另外,你總是可以在局部範圍內使用定義。 – 2010-11-20 03:14:35