昨天的你和今天的你
by address-withheld@my.opera.com.invalid (F0)
at 2012-05-08 16:31:20
original http://my.opera.com/freewinger/blog/show.dml/47707312
;今天翻译Drangonfly的是看到下面的代码, 迷惑了下觉得(new iface obj:@self-sym); 这有点问题
;下面代码来之ObjNL.lsp
(define (instantiate class)
(letn ( obj-sym (sym (string class "#" (++ class:@instance-counter)))
obj (new class obj-sym)
)
;你认为 obj 和 obj-sym 一样吗
(println (source 'obj-sym) "\n" (source 'obj) "===\n")
(println (symbol? obj-sym) (symbol? obj))
(println (context? obj-sym) (context? obj))
(set 'obj:@self obj 'obj:@self-sym obj-sym)
)
)
;结果
> (instantiate Class)
(set 'obj-sym 'Class#1)
(context 'Class#1)
(set '@instance-counter 1)
(define (Class#1:Class#1 )
(cons (context) (args)))
(context MAIN)
===
truenil
niltrue
Class#1
Class#1
;昨天的你和今天的你不一样 世界知道 但是人们知道吗
;下面两个函数的作用呢 他们产生的效果一样吗
(define (add-interface iface obj)
(new iface obj:@self-sym);
(push iface obj:@interfaces)
)
(define (add-interface2 iface obj)
(new iface obj:@self);
(push iface obj:@interfaces)
)
;效果是一样的 为什么?
;因为(new iface obj:@self-sym) 这样一条语句 nl 为我们自动把每个参数都eval 了再送给函数new
;这就是为什么
>(println (add 4 5))
7
;而不是输出'(add 4 5) 的原因
;有种东西叫宏, 他非常清正廉洁 任何人他都 平等相待 不计算他的值.
;这也是他强大的地方, 一切都只是symbol.
所以想不被symbol 搞糊涂了 就得记住 大部分时候 表达式都会将参数先eval 再传递给函数
如果想不糊涂 就像macro一样思考 "看破三界 万物归虚"
大部分人只看到当下的你
而你清楚往日的你和今天的你 不再一样
如果你还不清楚 那就执行两遍 (delete you nil)
因为你已经被(new Other you "kill mind")太多次了