这种时候怎么实现?我只能觉得用类模拟指针了……

2014-03-30 22:09:30 +08:00
 tioover
不小心发出来了,我在回复里面说
4135 次点击
所在节点    Python
28 条回复
bcxx
2014-03-30 22:15:23 +08:00
是的,你说的对
casparchen
2014-03-30 22:16:42 +08:00
对的
tioover
2014-03-30 22:18:09 +08:00
嗯,刚刚写了一大堆,提交编辑却说没办法,我重新写。
tioover
2014-03-30 22:18:49 +08:00
是这样的,我在写一个 Lisp 解释器,里面要实现闭包,可是 Python 里面没有指针
tioover
2014-03-30 22:21:17 +08:00
比如说

def foobar():
....foo = 1
....def bar():
........return foo

在这种情况下,foobar() 的环境是 {"foo": 1}
按照一般思路,bar() 里面找不到 foo,就往上层作用域找
bcxx
2014-03-30 22:24:28 +08:00
你设计一个 context 将函数运行的状态(就是运行环境)注入进去就行(解释器解释的时候根据这个 context 来解释)
tioover
2014-03-30 22:24:51 +08:00
问题是 bar 如果作为一个返回值返回,foo 的环境应该删除
bcxx
2014-03-30 22:26:51 +08:00
@tioover 应该是将 bar 的运行环境和 bar 绑定了一起返回(就是不返回 function,而是返回 function + context,也就是整个闭包。)
tioover
2014-03-30 22:27:15 +08:00
所以应该 bar 的环境里包括 bar 里面的自由变量 {"foo": parent_env["foo"]}
但是这样的话上层的变量变更了以后bar里面的foo还是1


def foobar():
....foo = 1
....def bar():
........return foo
....foo = 2
tioover
2014-03-30 22:28:56 +08:00
所以应该传递指向数据的指针,Python 里面没有指针,但是被容器(class)容纳的数据是必然传递指针的,比如说 []

所以我想可以用 class Ptr 来模拟指针

env["foo"] = Ptr(data)

这样就可以了,但是感觉不美好
tioover
2014-03-30 22:29:37 +08:00
@bcxx 我就是这个意思……刚刚想说完再回复
tioover
2014-03-30 22:32:01 +08:00
接 #10
在 bar 的闭包中,只需要

env["foo"] = parent["foo"] 就行

复制就是 parent["foo"].ptr = data 这样就行了。

但是用指针模拟总感觉很糟
bcxx
2014-03-30 22:33:41 +08:00
@tioover 你可以看看 lisp / racket 之类是怎样做的……
tioover
2014-03-30 22:34:39 +08:00
@bcxx 人家背后直接能用指针吧 = = 用 Python 只能用这种曲线的方法实现
bcxx
2014-03-30 22:39:57 +08:00
@tioover 额,你太执着名字上的东西了= = 那时语义上的实现啊,你底层具体怎么实现是另外一回事啊
tioover
2014-03-30 22:41:31 +08:00
@bcxx 我是觉得用一个 class 去模拟指针不美……
tioover
2014-03-30 22:45:07 +08:00
忘了还有附言了,把内容放在附言里面……
bcxx
2014-03-30 22:56:04 +08:00
@tioover = = 不能理解
ctrlaltdeletel
2014-03-31 01:01:35 +08:00
额 没太清楚为什么foo的值会被修改,以及被修改了为什么要影响bar环境中foo的值
tioover
2014-03-31 01:52:23 +08:00
@ctrlaltdeletel 在 Python 里面你改一样东西的值,其实是新创建一个对象然后修改指针,不能直接修改指针的内容。
后者是闭包的特性…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/106558

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX