Template parameter specializations constrain the values or types the
/TemplateParameter/ can accept.
例如:
template TFoo(T) { }
alias TFoo!(int) Foo1; // (1) T is deduced to be int
alias TFoo!(char*) Foo2; // (1) T is deduced to be char*
template TBar(T : T*) { }
alias TBar!(char*) Foo3; // (2) T is deduced to be char
template TAbc(D, U : D[]) { }
alias TAbc!(int, int[]) Bar1; // (2) D is deduced to be int, U is int[]
alias TAbc!(char, int[]) Bar2; // (4) error, D is both char and int
template TDef(D : E*, E) { }
alias TDef!(int*, int) Bar3; // (1) E is int // (3) D is int*
也很清晰易用.
但是, 对于 T 有一个成员叫做 clone 这种用模板A匹配, 有成员叫做 copy 用模
板B匹配这种, 我不知道应该怎么做简单清晰, work-around 肯定是有的, 但是我
一点都不喜欢迂回的方法, 迂回的方法, 不能直接表达思想, 给可读性带来很大麻烦.
C++ 中, 我最不喜欢的, 也是这么迂回的东西太多, 太多东西语言不支持, 而通过
一些什么什么常用范式来解决问题, 还以此标榜为语言强大, 实际上就是编译器抱
残守缺, 不肯进化. ---- 对我来说, 这才是 C++ 的 "思维负担" --- 写代码和读
代码都要弯弯绕才能知道实际目的, std::string 后台做什么那种倒算不了思维负担.
longshanksmo 写道:
如果D仅仅试图消除C++的缺点,那么,可以说它并没有真正地从C
++身上吸取教训。
他应该有更宏大的目标。
D 2.0 着重解决的问题更多的是C++ 现有缺陷之外的考虑了. 包括更多的 fp 特
性, 更好地支持并发, AST macro等东西. 其中的 AST macro 具体如何我没有找到
文档, 但是这个东西, 号称是可以用来扩展语言的语法的一个东西.
这样的话, D 完善支持的范式有 过程式, OO, GP; meta programming 支持得不
错, 支持一点 fp; AST macro 可以用来扩展语法或者用来做 DSL, aspect 没有看
到什么动作, 不过 aspect 这个东西, 实用中发挥的作用听说也不是特别的大.
Walter Bright 的一个观念是, 一个特性或者工具, 只有很方便就能够得到的时
候, 才能够得到广泛的使用, 所以他将 unittest, code covergage, profile 都
建到语言内部里面去了, 我对这个倒是非常满意. DSL 的态度, D 社区里面有过讨
论, 我没有完整看完,但是印象是, 他们认为很多应用, 有一个 DSL 会更简单.
这些特征, 对于D的目标, 系统编程, 看起来也差不多了, 在语言技术没有出现大
的突破之前 (例如 GP 的意义被挖掘那种)
, 这个语言应该都还可以比较干净.
不过, 如果他成功的话, 应该也会有一些需求将其推向偏应用层, 那边又会出现什
么新语言要求呢 ?
Tango 2.0 milestone 那里有一个 wishlist 是 derailed, 是 D 语言版本的
rail, 这个东西将会综合考验 D 的效率, 表达力(包括 Dhtml template DSL), 使
用简洁方便等东西了.
> C++的理念里一句话很有理想主义光辉:对一门特定问题领域怎么编程呢?先把
库扩展到他们丫家里,然后针对库来编程。正因为这个原因,C+ +才致力于成为一
门有助于设计更好的库的语言。这个目标能不能实现呢?如果真能理想实现的话,
通用语言跟领域语言的区别就不是那么大了呢...
>
这个我觉得基本很难, 库可以提供功能, 但是很难有好的表达力, 例如, 语言不支
持, 用库做一个 foreach, 看起来就难受.
如果 AST macro 做得真是强, 那可能倒是能够有些作用.
不过我一般使用 Rake
在 2007-09-16日的 13:56 +0800,Atry写道:
在 2007-09-16日的 13:34 +0800,red...@gmail.com写道:
dsss 可以自动分析 d 之间的 import 关系, 你只需要指明 main.d 这个文件, 剩
下都不用管了.
但是 dsss 和 dmd 的object 输出在一些诡异的地方有冲突, 我自己碰到的问题
是, 告诉我的代码中Sprint 这个模板的实例化和 tina 里面对 Sprint 的实例化
冲突了, 天地良心, 模板的实例化不应该冲突的. 我的解决方法是告诉我冲突的时
候, import tina 那个文件进来就好了.
这里面 dsss 作者和 walter 估计还没有想好最后的处理方式, walter 说, 如果
要避免问题, 要修改目前已经很 stable 的输出代码, 要将里面一个优化去掉, 大
概要多花几十个点的编译时间; dsss 作者说, 你做了这个优化, 那么无论
project 有多少个文件, 我都可以一次全部编译, 否则我要一个一个文件编译, 这
是局部和整体的问题. 我不管他们, 就用 import 的方式搞定.
我用 dsss 的方法, 下载解开 dsss
然后
dsss net install dmd
安装 dmd
dsss net install tango
安装 tango
就可以开始工作了.
这样做的话, 无论用 gdc, photos, tango, 之间的一些版本处理的问题, 不用自
己操心.
我的 项目 dsss.conf 配置文件如下, 我的 test.d 是主文件. 我有很多控制
debug 代码和 unittest 代码的选项.
name=test
[*]
buildflags+=-w
#带优化的
#buildflags+=-O -release -inline
#调试
buildflags+=-g
#单元测试和 cov
#buildflags+=-cov
#要开单元测试, 则需要设置debug(module), 另外, 有debug(ut_all),
debug(all), 但是没有 debug(trace_all)
# debug(ut_module) 和 debug(trace_module) 都会启动 debug(module)
buildflags+=-unittest -debug=all
buildflags+=-debug=util_pktcomm -debug=ut_util_pktcomm
-debug=trace_util_pktcomm
#buildflags+=-debug=util_memory -debug=ut_util_memory
-debug=t1race_util_memory
#buildflags+=-debug=util_intrusive -debug=ut_util_intrusive
-debug=trace_util_intrusive
#是否跟踪析构函数 (和模块自身的 trace 一起都enable, 才会显示出来)
#buildflags+=-debug=trace_dtor
[test.d]
target=test
Atry 写道: