2016-07-09 1 views
1

最初に、私は、set!スキームの割り当てが、=とc/C++以外のPythonでの割り当てに似ていると考えました。 PythonでLocationはR6RSのスキームの意味は何ですか?

>>> x = 1 
>>> id(x) 
15855960 
>>> x = 2 
>>> id(x) 
15855936 # different from above! 

第割り当てはxのメモリ位置に別の値の代わりに上書き元の値に変数/名前を再バインドします。

が、C/C++は、後者のケースである:

int x = 1; 
cout << &x << endl; // 0x7ffe3e6adba4 
x = 2; 
cout << &x << endl; // 0x7ffe3e6adba4 (the same memory location!) 

しかし1.3R6RSのセクション:

スキーム識別子が 値を含む位置を表すことができます。これらの識別子は変数と呼ばれます。多くの のケースでは、具体的には場所の値が決して変更されていない場合は、 という変数が作成された後、変数 をそのまま値として扱うと便利です。

そして1.8 Assignmentセクションで:

スキームの定義によってバインドされた変数や、聞かせたりラムダ 式は、実際にそれぞれのバインディングで指定されたオブジェクト に直接結合されていないが、これらのオブジェクトを含む場所 へ。これらの場所 の内容は、割り当てによって破壊的に変更することができます。

したがって、set!は、C/C++の割り当て=のようになりますか?最初x

=> (define x 10) 
=> x 
10 
=> (set! x "lonnnnnnnnnnnnng") 
=> x 
"lonnnnnnnnnnnnng" 

が小さい整数を格納するためのlocationである:以下に説明する方法

しかし、その後。しかし後でset! LONG文字列をその小さなメモリ位置に配置しますか?しかし、場所には私が思うほど十分なメモリスペースがありませんか?

答えて

3

マニュアルの引用は、識別子(例えば、xまたはyのようなもの)が場所(メモリセル、たとえばアドレス0x7ffe3e6adba4のセル)に関連付けられている(バインドされている) (例えば、整数、文字列など)を保持することができ、場所の内容を新しい値で変更できることを意味します。すなわち:

Identifier -> Location -> Value 

値は、組み合わせ言語/コンパイラから応じて、典型的には、整数または浮動小数点のような値の場合には、時々、それが呼び出され、直接値(又は「アンボックス化」値のいずれかとすることができます)、または値を含むメモリ領域(通常はコンスセル、配列、文​​字列などの複雑な値)のポインタである "boxed"値です。

私が言ったように、重要なポイントは、インプリメンテーションでは値を場所に格納する方法を自由に選択できるということです。たとえば、値を最適化して異なる戦略で値を割り当てる場合、唯一重要なことは、上記のダブルマップを必要とする言語の仕様に厳密に従うことです。 ここで重要な点は、Lispポインタのような言語では、ユーザ(プログラマ)にとっては "見えない"ことです。

+0

お返事ありがとうございます!ですから、基本的に私は、実際には2つの意味を持つ「価値」という言葉を誤解していました。 2)ポインタ/実際の値への参照。そして、そのスキームは実際にはPythonに似ていますが、Pythonでは(例えば、小さな整数)を含むすべてがフードの下の参照/ポインタです。そうですか? – fubupc

+0

はい、これがポイントです。 – Renzo