22

Python では、次のようなことができます。

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

...そして a は 1 になり、b は 2 になります。Scheme にリストがあると'(1 2)します。で似たようなことをする方法はありますletか?違いがあれば、ラケットを使用しています。

4

6 に答える 6

29

使用できるラケット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、(ほとんどの) スキームの実装では、複数の値はファースト クラスの値ではないため、「タプル」として定義できないことに注意してください。

于 2010-11-18T23:53:32.310 に答える
11

必要最低限​​ のイディオムは、次のように、letを使用する場所でapplylambdaとともに使用することです。

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

利点は、どの実装でも機能することです。もちろん、これは単純なケースでのみ使用できますが、場合によってはそれだけで十分な場合もあります。

于 2012-09-18T16:43:53.900 に答える
7

(少なくとも Lisp の世界では) 探しているものの一般的な用語はdestructuringであり、それを実装するマクロはdestructuring-bindとして知られています。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)

スキーマ マクロとして destructuring-bindの優れた実装があるようです。

于 2010-11-21T17:42:39.543 に答える
4

これがあなたが探しているものだと思います:

let-valuesまたはを見てくださいlet+

于 2010-11-18T23:33:33.943 に答える
1

match依存関係を持ち込みたくない場合、これは Racket で機能します。

リストから:

(let-values ([(a b c) (apply values '(1 2 3))])
  (+ a b c))

または値式から直接:

(let-values ([(a b c) (values 1 2 3)])
  (+ a b c))
于 2018-11-07T21:05:19.903 に答える