首先,我认为方案中的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!)但在1.3的R6RS部分
方案允许标识符代表包含值的位置。这些标识符称为变量。在许多情况下,特别是当位置的值在创建后从未被修改时,将变量直接视为值是有用的。
在1.8 Assignment部分:
由定义或let或lambda表达式绑定的方案变量实际上并不直接绑定到各自绑定中指定的对象,而是绑定到包含这些对象的位置。这些位置的内容随后可以通过赋值进行破坏性修改。
因此,在方案分配中,set!就像c/c++赋值=所做的那样?
但如何解释以下几点:
=> (define x 10)
=> x
10
=> (set! x "lonnnnnnnnnnnnng")
=> x
"lonnnnnnnnnnnnng"起初,x是存储一个小整数的location。但是后来set!在那个小内存位置放了一个长字符串?但是这个位置没有足够的内存空间去做我想的?
发布于 2016-07-09 04:39:24
手册中的两个引用都说明了相同的情况:标识符(例如,x或y之类的东西)与一个位置(例如地址0x7ffe3e6adba 4的单元格)相关联(“绑定”),它可以容纳不同的值(例如整数、字符串等),并且可以用一个新的值修改位置的内容。这就是:
Identifier -> Location -> Value根据组合语言/编译器的不同,该值可以是直接值(或有时称为“unboxed”值,通常是整数或浮点数),也可以是“装箱”值,即指向包含该值的某个内存区域的指针(通常用于复杂的值,如con单元格、数组、字符串等)。
正如我说过的,关键是实现可以自由选择如何在位置存储值,例如,如果使用统一的方法根据值的类型存储值,如果使用不同的策略优化和分配值,则唯一重要的是严格遵循需要上述双映射的语言规范。这里的关键点是,在像Lisp这样的语言中,指针对用户(程序员)来说是(而且应该保持)“不可见的”。
https://stackoverflow.com/questions/38277997
复制相似问题