13

Python でタプルの値を変数に割り当てる方法と同様に、リストの値を Common Lisp のシンボルのリストに割り当てる方法はありますか?

x, y, z = (1, 2, 3)

何かのようなもの

(setq '(n p) '(1 2))

ここnで、 とはそれぞれとにp等しくなりました。以上、頭の中で考えただけですが、うまくいきません。次のように適用してみました:12

(apply setq '('(n p) '(1 2)))

私は Lisp を初めて使用するので、これが露骨に明らかなことである場合は、あまり厳しくしないようにして、正しい方向に向けてください! ありがとう。

PS:Scheme でこれを行うことに関する投稿と、Common Lisp でのタプル展開に関する同様の投稿を見たことがありますが、それらは私の質問に答えるのにあまり役に立ちませんでした。1) 私は Scheme を使用していないため、2)最高ランクの回答は単語だけでしたapply

4

3 に答える 3

13

DESTRUCTURING-BINDを使用すると、タプルのアンパックよりもはるかに多くのことができます。キーワードによる代入や、オプションのパラメーターなど。実際、関数のパラメーター リストでできることはすべてです。

しかし、実際に分解するリストがなく、一度にたくさんの変数を設定したい場合は、PSETFを使用してください:

(psetf n 1
       p2)

SETF を使用することもできますが、PSETF はタプル割り当ての類似物です。たとえば、値の交換/置換に使用できます。

# Python
n, p = p, n
x, y, z = z, x, y
;; 舌足らずの発音
(psetf np
       PN)
(psetf xz
       yx
       ジ)

実際には、おそらく平凡な LET で問題を解決できます。

また、SETQ を気にしないでください。SETF/PSETF を使用すると、より優れており、さらに特定の種類の割り当てを実行する唯一の方法になります。

于 2011-05-16T04:44:47.993 に答える
10

destructuring -bind (一番下にあります) は、あなたが望むことをするかもしれません。

また、HyperSpecの説明ですが、他のリンクがそれをよりよく示していると思います。

(destructuring-bind (x y z) (list 1 2 3) (+ x y z))
于 2011-05-16T03:07:21.060 に答える
7

リストがあり、その値を複数の変数に割り当てたい場合は、DESTRUCTURING-BINDが最適です。

ただし、pythonicの「リストまたはタプルを返す、割り当てる変数のリストまたはタプルを使用する」場合は、複数の戻り値とMULTIPLE-VALUE-BINDを使用する方が(おそらく)より簡単です。

于 2011-05-16T10:16:18.050 に答える