Gru*_*rig 13 static d language-design static-if
我认为D static if是一个有趣的语言功能.这提示了我的问题:是否还有编译语言的其他示例,其中编译器具有强大的代码概念,并且有语言工具可以访问它们?
例如,此代码提供类似于reprPython的代码:
char[] repr(T)(T value) {
static if (is(typeof(value.__repr__))) { // class T provides a "repr()" method
return value.__repr__();
} else static if (is(T:string)) {
return `"` ~ value ~ `"`;
// ...other cases...
} else {
return toString(value);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这很酷,因为它允许一种不同的,更通用的方法来实现重载,这是一种让代码更加动态的内部方式,与这样的功能相比.例如,编译器知道我的类有多少字段,但是在大多数语言中,我的代码无法在编译时访问该信息.
CAVEAT:最后一段中有意见,但我只是想为我的问题提供一些动力和澄清,而不是引起争议.我只是想知道是否有其他编译语言有这样的功能.
Bax*_*imo 10
任何具有真实宏的语言都具有静态if的形式.例如,Lisp和Nemerle允许您使用编程结构(如'if'和for-loops)构建宏扩展的代码.这些本质上是编译时的决定,让你做类似于static的事情.在Nemerle宏的情况下,宏基本上是编译时在编译时执行的插件.
在C++中有一个boost MPL库,如果可以用来在两种类型之间进行选择,它有一种静态.你可以将一些代码放在run()成员中的两种类型中,并获得类似的东西,但语法非常繁琐.
例如,使用Boost MPL,您可以执行以下操作:
struct float_impl {
static void run() { /* float case code */ }
}
struct int_impl {
static void run() { /* int case code */ }
}
typedef typename if_<
is_same<T, float>
, float_impl
, int_impl
>::type impl_t;
impl_t::run();
Run Code Online (Sandbox Code Playgroud)
在D中,它是:
static if(is(T == float)) {
/* float code */
}
else {
/* int code */
}
Run Code Online (Sandbox Code Playgroud)