首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位置在方案的R6RS中意味着什么?

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

Stack Overflow用户
提问于 2016-07-09 03:29:34
回答 1查看 78关注 0票数 1

首先,我认为方案中的set!分配更像python中的赋值=,而不是在c/c++中。

在python中:

代码语言:javascript
复制
>>> x = 1
>>> id(x)
15855960
>>> x = 2
>>> id(x)
15855936 # different from above!

第二个赋值意味着将变量/名称重新绑定到另一个值,而不是覆盖x内存位置中的原始值。

但c/c++是后一种情况:

代码语言:javascript
复制
int x = 1;
cout << &x << endl; // 0x7ffe3e6adba4
x = 2;
cout << &x << endl; // 0x7ffe3e6adba4  (the same memory location!)

但在1.3R6RS部分

方案允许标识符代表包含值的位置。这些标识符称为变量。在许多情况下,特别是当位置的值在创建后从未被修改时,将变量直接视为值是有用的。

1.8 Assignment部分:

由定义或let或lambda表达式绑定的方案变量实际上并不直接绑定到各自绑定中指定的对象,而是绑定到包含这些对象的位置。这些位置的内容随后可以通过赋值进行破坏性修改。

因此,在方案分配中,set!就像c/c++赋值=所做的那样?

但如何解释以下几点:

代码语言:javascript
复制
=> (define x 10)
=> x
10
=> (set! x "lonnnnnnnnnnnnng")
=> x
"lonnnnnnnnnnnnng"

起初,x是存储一个小整数的location。但是后来set!在那个小内存位置放了一个长字符串?但是这个位置没有足够的内存空间去做我想的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-09 04:39:24

手册中的两个引用都说明了相同的情况:标识符(例如,xy之类的东西)与一个位置(例如地址0x7ffe3e6adba 4的单元格)相关联(“绑定”),它可以容纳不同的值(例如整数、字符串等),并且可以用一个新的值修改位置的内容。这就是:

代码语言:javascript
复制
Identifier -> Location -> Value

根据组合语言/编译器的不同,该值可以是直接值(或有时称为“unboxed”值,通常是整数或浮点数),也可以是“装箱”值,即指向包含该值的某个内存区域的指针(通常用于复杂的值,如con单元格、数组、字符串等)。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38277997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档