位置在方案的R6RS中意味着什么?

时间:2016-07-09 03:29:35

标签: scheme

起初,我认为方案中的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!)

但在R6RS1.3部分:

  

Scheme允许标识符代表包含的位置   值。这些标识符称为变量。在很多   情况,特别是当从未修改位置的值时   在创建之后,考虑变量是有用的   直接代表价值。

1.8 Assignment部分:

  

由定义或let或lambda绑定的方案变量   表达式实际上并不直接绑定到对象   在相应的绑定中指定,但指向位置   包含这些对象。这些地点的内容   随后可以通过转让破坏性地修改。

所以在方案分配set!中似乎就像c / c ++赋值=那样?

然后如何解释以下内容:

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

首先xlocation来存储一个小整数。但后来set!将一个LONG字符串放入该SMALL内存位置?但是我觉得这个位置没有足够的内存空间吗?

1 个答案:

答案 0 :(得分:3)

手册中的两个引用都说同样的事情:标识符(例如像xy之类的东西)与位置(存储单元格,例如,“绑定”)相关联。地址为0x7ffe3e6adba4的单元格,可以包含不同的值(例如整数,字符串等),并且可以使用新值修改位置的内容。那就是:

Identifier -> Location -> Value

取决于组合语言/编译器,该值可以是直接值(或“未装箱”值,因为有时会调用它,通常是在整数或浮点数等值的情况下)或“盒装” value,即指向某个内存区域的指针,包含值(通常用于复杂值,例如cons单元格,数组,字符串等)。

正如我所说,关键点在于实现可以自由选择如何在位置存储值,例如,如果使用统一的方法根据类型存储值,如果使用不同的策略优化和分配值,等等唯一重要的是严格遵循上面要求双重映射的语言规范。 这里的关键点是,像Lisp指针这样的语言(并且应该保持)对用户(程序员)来说是“不可见的”。