Python では、次のようなことができます。
t = (1, 2)
a, b = t
...そして a は 1 になり、b は 2 になります。Scheme にリストがあると'(1 2)
します。で似たようなことをする方法はありますlet
か?違いがあれば、ラケットを使用しています。
Python では、次のようなことができます。
t = (1, 2)
a, b = t
...そして a は 1 になり、b は 2 になります。Scheme にリストがあると'(1 2)
します。で似たようなことをする方法はありますlet
か?違いがあれば、ラケットを使用しています。
使用できるラケット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を使用する場所でapplyをlambdaとともに使用することです。
(define t '(1 2))
(apply (lambda (a b)
;; code that would go inside let
)
t)
利点は、どの実装でも機能することです。もちろん、これは単純なケースでのみ使用できますが、場合によってはそれだけで十分な場合もあります。
(少なくとも 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の優れた実装があるようです。
これがあなたが探しているものだと思います:
let-values
またはを見てくださいlet+
。
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))