昨天的你和今天的你

2012-05-09 00:31

昨天的你和今天的你

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")太多次了