2011-06-11 62 views
18

我最近偶然发现了D编程语言,我真的很喜欢它。你真的可以PROGRAMM高水平,同时具有类似于CD中的模式匹配

从一个相当实用的背景(Haskell中,斯卡拉)I'm寻找一种方法来在d模式匹配来全硬件访问,但我没有发现任何关于http://www.digitalmars.com/d/ 。 Haskell模式匹配由语言本身支持。 在斯卡拉它是通过案例类或提取器(具有不适用方法的普通对象)实现的。

在D中可以这样做吗?

std.concurrency中的接收方法,用于在erlang和scala中执行actor风格的并发处理,这些方法需要一堆函数和模式数学运算。 但我认为它不像其他语言那样灵活。你能用卫兵吗?你可以提取对象的内容,就像scala中可能的内容一样吗?

+0

嗯......你说的模式匹配究竟是什么意思?你在谈论逻辑编程吗? – Mehrdad 2011-06-11 17:06:12

+0

@Mehrdad我认为Haskell中的模式匹配有点像C++中的模板特化。 – Arlen 2011-06-11 20:59:09

+0

@红:呃......我不确定我明白为什么它叫做模式匹配。说它像Scheme一样是否正确(因为lambdas和宏几乎都是模式匹配器)?如果是这样,那么我想我会看到我们要去的地方。 – Mehrdad 2011-06-11 21:04:42

回答

7

Haskell没有将模式匹配内置到语言中,但D具有非常通用的编译时和反射功能,可以让您在库中匹配类型及其结构。为了匹配运行时间值,您只能使用普通的if/switch ...结构; lazy evaluation of function arguments也可能有助于实现一些匹配运行时技术。

Template Constraints将允许您根据在编译时评估的任何表达式(D允许您在编译期间执行几乎所有正常代码)创建函数(模板)重载。您也可以使用static if获得类似的效果。这实际上可以让你匹配类型结构。这也是常用的技术,在D.

您可能会发现的std.algorithm有趣的代码,寻找isInputRange和类似的功能 - 他们进行匹配的类型结构 - 它们限制参数的类型是某些的类型类

为编译时反射部分的方向:

7

没有像Haskell或Scala那样强大的专用模式匹配功能。如您已经想出的那样,重载和调用(模板化)函数或委托是模式匹配的限制形式。您只能匹配参数类型。

您可以在编译时间模式匹配模板参数。无法在其中提取对象的内容。但是你可以提取一个类型的内容。

如:

import std.stdio, std.conv; 
template match(T...){ 
    enum match = "default case"; 
} 
template match(string a : "x", int b : 1, int c){ 
    enum match = "matched 1, b="~to!string(b); 
} 
template match(int a, string b, int c : 100){ 
    enum match = "matched 2, b="~b; 
} 
template match(T : T[]*[]){ 
    enum match = "matched 3, an array of pointers to an array of "~T.stringof; 
} 


void main(){ 
    int a=100; 
    writeln(match!("x",1,5));  // "matched 1, b=1"                          
    writeln(match!(12,"str"));  // "default case"                          
    writeln(match!(12,"str",100)); // "matched 2, b=str"                         
    writeln(match!(int*[]*[]));  // "matched 3, an array of pointers to an array of int*"                 
    //writeln(match!(12,"str",a)); // would be error, because 'a'                        
            // is not evaluable during compile time                     
} 

如果你有兴趣,你可能想看看http://d-programming-language.org/template.html

'是' - 表达的是另一种类型上的模式匹配,见

http://d-programming-language.org/expression.html(搜索 “Is表达式”)。

-1

如果您不坚持使用D2和/或火卫一,您可以使用tango library。它有一个你可以使用的regex module。 [编辑] D2/Phobos中还有一个正则表达式模块[/ Edit]如果你坚持使用D2和/或Phobos,你可以尝试移植它。它不应该太难。

探戈是一个替代性的标准库。许多探戈游戏开发者和用户不喜欢D2的发展方向,也不喜欢D1。这就是为什么只有一些不完整的port D2可用。

还有一个项目scregex提供静态编译的正则表达式。我已经自己使用它了,它工作。但我认为它也是仅限于D1的。然而,它同时适用于phobos和探戈。

+0

2.0 phobos中有一个正则表达式模块:check [std.regex](http://www.d-programming-language.org/phobos/std_regex.html) – 2011-06-11 22:34:28

+2

问题是关于http://en.wikipedia。 org/wiki/Pattern_matching,而不是正则表达式 – 2011-06-11 22:51:22

+0

Wops。对不起这是我的错。 – Marenz 2011-06-12 14:21:03