シンボルa
とその値を(setq a '(1 2))
の後に示す図です。ボックスは基本的なデータ構造(シンボルとコンス)であり、矢印はポインタ(データが別のデータを参照する)です。 (私は少し単純化しています。)
symbol cons cons
+-------+----------+ +------+------+ +------+------+
|name: |variable: | |car: |cdr: | |car: |cdr: |
| a | | | | 1 | | | | 2 | nil |
+-------+----|-----+ +------+--|---+ +------+------+
| ↑ | ↑
+-------------+ +-------+
表現'(1 2)
は、2要素のリストを構成する右側にある2つのコンスを、構築します。式(setq a '(1 2))
は、存在しない場合はシンボルa
を作成し、その「可変スロット」(シンボルの値を含む部分)を新たに作成されたリストを指し示します。 setq
は組み込みマクロであり、(setq a '(1 2))
は(set 'a '(1 2))
の省略形です。 set
の最初の引数は変更するシンボルで、2番目の引数はシンボルの可変スロットを設定する値です。
(add-to-list 'a 3)
は、ここに(set 'a (cons 3 a))
と等価です。これは、3がリストに含まれていないためです。この表現は4つのことを行います:
- 新しいコンスセルを作成します。
- 新しいコンスセルの車フィールドを
3
に設定します。
- 新しいコンスセルのcdrフィールドを
a
という以前の(まだ現在の)値に設定します(つまり、a
の変数スロットの内容をコピーします)。
- 可変スロット
a
を新しいコンスセルに設定します。
このように、その呼び出し、関連するデータ構造は見た後:
symbol cons cons cons
+-------+----------+ +------+--|---+ +------+------+ +------+------+
|name: |variable: | |car: |cdr: | |car: |cdr: | |car: |cdr: |
| a | | | | 3 | | | | 1 | | | | 2 | nil |
+-------+----|-----+ +------+--|---+ +------+--|---+ +------+------+
| ↑ | ↑ | ↑
+-------------+ +-------+ +-------+
setcar
への呼び出しが任意の新しいデータ構造を作成していない、とシンボルa
ではなく、その上で動作していませんcar
現在(setcar a 4)
後3が含まれているコンスセルである値、データ構造は次のようになります。
symbol cons cons cons
+-------+----------+ +------+--|---+ +------+------+ +------+------+
|name: |variable: | |car: |cdr: | |car: |cdr: | |car: |cdr: |
| a | | | | 4 | | | | 1 | | | | 2 | nil |
+-------+----|-----+ +------+--|---+ +------+--|---+ +------+------+
| ↑ | ↑ | ↑
+-------------+ +-------+ +-------+
push
ですマクロ。ここでは(push 5 a)
は(set 'a (cons 5 a))
に相当します。
setq
とpush
は(setq
は限り我々が懸念しているとして、ここで定義インタプリタに組み込まれており、Lispで提供されていないマクロを意味し、「特別な形式」、である)マクロです。マクロは引数が評価されず、拡張するかどうかを選択できます。 set
,setcar
およびadd-to-list
は、評価された引数を受け取る関数です。シンボルを評価すると、可変スロットの内容が返されます。最初の(setq a '(1 2))
の後にシンボルa
の値は1
を含むコンスセルです。あなたはまだ混乱している場合
、私はもの((setq b a)
を試して、あなたがa
にして(シンボルa
に作用するものを)行動するときb
を修正式のどの自分のために見ないではないことを示唆しています記号a
の値に作用する)。
マクロまたは関数であるかどうかは、実装を見ていなくても、そのドキュメントから分かりますか? – Tom
@Tomのドキュメントでは、通常、最初の行でpush-'pushは' 'cl.el 'のLispマクロです。 –
はい、でもsetcarはどうですか?ドキュメントから、その議論を評価していないことをどうやって知っていますか? – Tom