作者godfat (godfat 真常)
看板PLT
标题Re: [心得] Dependent Type "简"介
时间Mon Oct 1 17:07:22 2007
刚赶完一个工,来赚点 p 币...
如果後来有把东西都整理好的话,会释出这次的一些 action script 3 code,
名称定为 avatar block, 顾名思义就是放一群 avatar 的 block,
原始模型是 flickr 的照片 flash, 不过我加了很多扩充的东西。
action script 3 比 2 好用满多的,但还是有非常大的不足就是了...
※ 引述《jaiyalas (ZZZ)》之铭言:
: 据说,这个版的版主之前有尝试过以这样的方式来实做
: 也许可以请版主大人稍微讲一下实做的心得 = =+
如果我没记错的话在 C_and_CPP 讲过满多的 ccc
不过後来懒了,就很少在那边发言了。
其实我是觉得概念很简单啦,基本上就理解成 meta-programming 就好了。
不过要用 C++ template 做 meta-programming, 其实限制很多,
做起来时常会让人有脑爆感。而且 dependent on value, 几乎可以说只对数字有效。
像是假设这样:
clas NaturalNumber{};
template <NaturalNumber n>
class List{};
这样是不行的!
因为 NaturalNumber, 包含所有的 class, 都只能在 runtime 去 construct,
而 template 是完全 compile-time 的东西,两者不能混着用。
再来看 factorial 吧 XD
template <int N> class fact{
public:
enum{ value = N * fact<N-1>::value };
};
template <> class fact<1>{
public:
enum{ value = 1};
};
这里定义了两种 fact, 上面的 fact 是 generic 的,
也就是一般的 template. 而下面的,叫做 template specialization,
有点像是 case of 的味道吧,当 N = 1 时,不使用泛用的 template,
要求使用特制的 template. 而 C++ 在还没真正用到 fact 时,
不会做完整的 semantic 检查,只有部份的 type check,(当然 syntax check 会做)
直到真正要用时,才会做第二阶段的检查,这叫 two-phase lookup,
这细节很多很复杂,而且也不是这里的重点,所以就不多说了... @_@
不过微软的 VC 就是没做 two-phase lookup 的最好例子 XD
(2008 会不会做不知道,依照惯例大概是没有吧 XD)
C++ 强调 early error, 所以要求 two-phase lookup, 但是非常难实做,
所以微软第一阶段的检查忽略不做。
anyway, 当我们呼叫:
fact<10>::value
时,compiler 就会去检查 10 符不符合哪个 template specialization?
答案是没有,所以 fact<10> 会去 instantiation 最泛用的那个 N,
然後去计算他的 value 等於多少?
这边 compiler 又会发现,value 是 N * fact<9>::value,
於是他再去计算 fact<9>::value 是多少?
...
最後 compiler 会找到 fact<1> 是某个 specialization,
他的 value 会是 1, 然後就能够把 fact<10>::value 计算出来。
於是你的程式里面就会有 10 个 class, 分别是:
fact<10>, fact<9>, fact<8>, ... fact<1>
这 10 个 class 在 runtime 上分别是不同的 class,
所以用 template 时常会有 code bloat 的问题...
但在这个例子中,最佳化良好的话,其实一个 class 都不会产生。
因为 compiler 会发现 fact<10>::value 是个常数,
而其他地方都没有用到 fact<...>...,
所以 linking 时就会全部舍弃了。
唉呀呀,有事,待续...
: Omega http://web.cecs.pdx.edu/~sheard/Omega/index.html
: 没有试过,只有看过程式码
: 感觉语法和Haskell很像
我是觉得算是扩充 haskell 吧?
godfat ~ 3.2$ port info omega
Omega 1.4.2, lang/Omega (Variants: universal)
http://web.cecs.pdx.edu/~sheard/Omega/
Omega is a strict dialect of Haskell providing type-level computations
and by this virtue integrates a theorem prover.
Build Dependencies: ghc
Library Dependencies: readline
Platforms: darwin freebsd
Maintainers:
[email protected]
--
Nobody can take anything away from him.
Nor can anyone give anything to him.
What came from the sea,
has returned to the sea.
Chrono Cross
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.218.90.242
1F:推 jaiyalas:推签名档,好久没碰了..Orz 10/01 17:15