- 论坛徽章:
- 2
|
回复 214# starwing83
>> 你也知道一个能打的都没有,你还皈依lisp教?难道是传说中的叶公好龙?
所以一直在说语言本身优美,但实现没找到好的。
或者是否不可能有好的实现?不就是在争论这个嘛……
>> 说明一个你没有意识到的问题:+是否映射机器码和是否能改变的确是正交的。
显然意识到了,那天qq难道白说了嘛…… 以后果然还是要gtalk…… 聊天记录方便……
所以才会说capture by value,以及cl那段不包含call的反汇编也许是因为safety的原因所以编译器才敢替换了也不管的优化。
>> 我真不是特别明白你的pass-by-value,要不要你重新开个贴详细讲解一下?讲解包括:
- (let ((x 12))
- (print x) )
复制代码 (print x)有自由变量x,但这个表没有机会在(let 之外被求值,所以根本看不出它到底是dynamic还是lexical。
必须要让包含自由变量的表达式(或者函数什么的)在bound form之外求值才能看出来。
按注释前的序号阅读:
- (let ((x "dynamic: emacs lisp"))
- ( (let ((x "capture by value: C++")) 1. 如果是非dynmaic,0处包含的自由变量就是这个。如果是capture by value,它的"值"会被复制到f中。
- (let ((f (lambda () x))) ; 0. 该表达式有自由变量x,并且它的求值会超出 1 处建立的bound,因此能观察到到底是什么作用域。
- (set! x "lexical: C(top level),CL,scheme,lua...")) 2. 如果是词法,f中的x与这里被set!的x是同一个"变量",会影响到f。
- f ) 3. 返回f, 使它超出1处的bound。
- ) ) 4. 调用f。如果是dynamic,1处的bound根本就不会影响到f,只有最外层的let才会影响到
复制代码 输出是什么就是什么作用域。代码是按scheme写的,是lexical。
>> 1.局部变量及作用域
这是上面所的,包含自由变量但不会超出bound form被求值的情况吧?
>> 3.局部函数及upvalue
说了嘛,就类似C++的lambda。
或者理解为C里面的callback+context,context被整体复制,不需要显示处理。
>> 5.如何实现共享的upvalue语义
指针…… 然后手工管理内存,或者gc……
>> 4.全局函数及不可改变的命名,还有对其他全局对象(变量+函数)的引用
依然是可改的,只是改了对已经产生的闭包不可见。
- (let ((+ __builtin_add__))
- (let ((f (lambda () (+ 1 2)))) ; 此处的+始终是 __builtin_add__
- (set! + *) ; 此处被改了
- (list (f) ; 不会影响到f
- (+ 1 2) ))) ; 但会影响到这里
- ; => (3 2)
- ; => (2 2) 如果是词法就应该输出这个
复制代码 >> 2.全局变量
>> 你知道的,lua的_ENV方案太优美了,优美到我觉得一个程序,根本就不应该是有所谓“全局变量”一说的,这方面你得说服我。
对,很多语言在顶层的东西与函数内的东西有区别。差不多就是与lua相同的想法。
不过那个全局表要在不需要的时候干掉,映射到data section。
同时也想干掉声明什么的…… 还要是静态类型什么的……
嗯,还没想好……
这里并不是lisp独有的问题。
如果像lua那样带个全局表,而且是动态类型检测,就没难度了。
或者说lua想要将这些映射到data section也需要添加其他什么东西才能描述?
|
|