起初,我认为方案中的set!
赋值更像是python中的赋值=
而不是c / c ++。
在python中:
>>> 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!)
但在R6RS的1.3
部分:
Scheme允许标识符代表包含的位置 值。这些标识符称为变量。在很多 情况,特别是当从未修改位置的值时 在创建之后,考虑变量是有用的 直接代表价值。
在1.8 Assignment
部分:
由定义或let或lambda绑定的方案变量 表达式实际上并不直接绑定到对象 在相应的绑定中指定,但指向位置 包含这些对象。这些地点的内容 随后可以通过转让破坏性地修改。
所以在方案分配set!
中似乎就像c / c ++赋值=
那样?
然后如何解释以下内容:
=> (define x 10)
=> x
10
=> (set! x "lonnnnnnnnnnnnng")
=> x
"lonnnnnnnnnnnnng"
首先x
是location
来存储一个小整数。但后来set!
将一个LONG字符串放入该SMALL内存位置?但是我觉得这个位置没有足够的内存空间吗?
答案 0 :(得分:3)
手册中的两个引用都说同样的事情:标识符(例如像x
或y
之类的东西)与位置(存储单元格,例如,“绑定”)相关联。地址为0x7ffe3e6adba4的单元格,可以包含不同的值(例如整数,字符串等),并且可以使用新值修改位置的内容。那就是:
Identifier -> Location -> Value
取决于组合语言/编译器,该值可以是直接值(或“未装箱”值,因为有时会调用它,通常是在整数或浮点数等值的情况下)或“盒装” value,即指向某个内存区域的指针,包含值(通常用于复杂值,例如cons单元格,数组,字符串等)。
正如我所说,关键点在于实现可以自由选择如何在位置存储值,例如,如果使用统一的方法根据类型存储值,如果使用不同的策略优化和分配值,等等唯一重要的是严格遵循上面要求双重映射的语言规范。 这里的关键点是,像Lisp指针这样的语言(并且应该保持)对用户(程序员)来说是“不可见的”。