質問

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

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

...そして、a は 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

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

これはリスト、ベクトル、構造体などで機能します。複数の値の場合は、次のようにします。 define-values:

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

または let-values. 。ただし定義できないことに注意してください t (ほとんどの) スキーム実装では複数の値がファーストクラスの値ではないため、「タプル」として扱われます。

他のヒント

イディオムを使用することです。

Aベアボーンのあなたはを使用すると思います。ここで、のラムダのの適用の を聞かせて、同様ます:

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

利点は、それがどのような実装で動作することです。もちろん、これは単純な例で使用することができますが、時にはそれはあなたが必要とするすべてです。

(少なくとも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)
非構造バインドのA 素敵実装するがありますように

に見えますスキームマクロとして

思を探してい:

let-values または let+.

あなたはmatch依存性をもたらすしたくない場合はラケットのこの作品ます:

リストから:

(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))

ここでは(例えばラケット又はシェスキームなど)destructuring-bind有するスキームの単純case-lambdaマクロがある:

(define-syntax bind
   (syntax-rules ()
      ((_ arg pat def body)
         (apply
            (case-lambda
               [pat body]
               [x def] )
            arg ))))
ここでは、このマクロを書くために私をやる気という例があります。読み取り可能なコードのためのボディ作る前にデフォルトを入れます:

(define (permutations l)
   ;
   (define (psub j k y)
      ;
      (define (join a b)
         (bind a (ah . at) b
            (join at (cons ah b)) ))
      ;
      (define (prec a b z)
         (bind b (bh . bt) z
            (prec (cons bh a) bt
               (psub (cons bh j) (join a bt) z) )))
      ;
      (if (null? k)
         (cons (reverse j) y)
         (prec (list) k y) ))
   ;
   (psub (list) (reverse l) (list)) )

ここでは様々な方式で、長さ9の順列を計算するためのベンチマークである

0m0.211s Chez Scheme
0m0.273s Bigloo
0m0.403s Chicken
0m0.598s Racket

GHCはHaskellへの変換が速くシェスキームよりも5倍です。ガイルははるかに遅いこれらの方式のいずれかよります。

ほかに、既存のcase-lambdaコードを活用のしやすさから、私はこのマクロは関数定義の引数リストとまったく同じ構文を受け入れる方法を好みます。私は、スキームのシンプルさが大好きです。私は許さ構文が文脈で乱暴に変えるパンチカード、上のFortranのプログラミングを覚えて十分に古いです。スキームは、それよりも良いことになっています。インパルスは、このようなマクロのユリをギルドために圧倒しています。あなたも関数定義の構文を変更することを正当化できない場合は、ここでもその構文を変更しないでください。直交文法を持つことが重要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top