2011-06-11 7 views
18

최근에 D 프로그래밍 언어를 우연히 발견 했으므로 정말 좋았습니다. 당신은 C와 같은 전체 하드웨어 액세스를 가지고있는 동안 programm를 매우 높일 수 있습니다.패턴 일치 D

다소 기능적인 배경에서 오는 것입니다 (하스켈, 스칼라). D에서 패턴 매치하는 방법을 찾고 있는데, 아무 것도 발견되지 않았습니다. http://www.digitalmars.com/d/ . Haskell에서 패턴 일치는 언어 자체에서 지원됩니다. Scala에서는 대소 문자 클래스 또는 추출기 (적용 할 수없는 메서드가있는 일반 개체)를 사용합니다.

D에서이 작업을 수행 할 수 있습니까?

erlang과 scala에서와 같이 액터 스타일에서 동시성을 수행하는 데 사용되는 std.concurrency의 수신 방법은 이들에 대해 많은 함수와 패턴을 사용합니다. 하지만 다른 언어처럼 유연하지는 않습니다. 가드를 사용할 수 있습니까? 가능한 한 스칼라에서 Object의 내용을 추출 할 수 있습니까?

+0

흠 ... 패턴 일치로 정확히 무엇을 의미합니까? 논리 프로그래밍에 대해 이야기하고 있습니까? – Mehrdad

+0

@Mehrdad Haskell의 패턴 일치는 C++의 템플릿 전문화와 비슷하다고 생각합니다. – Arlen

+0

@Red : 허 ... 나는 그것이 패턴 매칭이라고 불리는 이유를 잘 모르겠다. 그것이 Scheme과 같다고 말하는 것이 맞습니까? (람다와 매크로는 꽤 많은 패턴 매칭 자이기 때문에)? 그렇다면, 나는 우리가 어디로 갈지를 생각합니다. – Mehrdad

답변

7

Haskell에서 알려진 패턴 매칭은 언어에 내장되어 있지 않지만 D는 매우 일반적인 컴파일 시간 및 리플렉션 기능을 갖추고 있으므로 라이브러리에서 유형과 구조를 일치시킬 수 있습니다. 일치하는 런타임 값의 경우 일반 if/switch ... 구조 만 사용할 수 있습니다. lazy evaluation of function arguments 또한 일부 일치하는 런타임 기술 구현에 도움이 될 수 있습니다.

Template Constraints은 컴파일 타임에 평가 된 표현식 (D는 컴파일하는 동안 거의 모든 일반 코드를 실행할 수 있음)을 기반으로 함수 (템플릿) 오버로드를 만들 수 있도록합니다. 유사한 효과를 얻으려면 static if을 사용할 수도 있습니다. 이것은 실질적으로 타입 구조를 매치시킬 수 있습니다. 이것은 또한 일반적으로 D.

에 기술을 사용

당신은 흥미로운 std.algorithm의 코드를 찾을 수 isInputRange 유사한 기능 보일 수 있습니다 - 그들은 형 구조를 일치 수행 - 그들이

typeclass 특정 의로 인수의 유형을 제한 컴파일시 반사에 대한

어떤 방향 :

7

하스켈 또는 스칼라만큼 강력한 전용 패턴 일치 기능이 없습니다.

이미 알아 냈으므로 (템플릿 처리 된) 함수 또는 델리게이트를 오버로드 및 호출하는 것은 제한된 패턴 일치 형식입니다. 인수 유형 만 일치시킬 수 있습니다.

에서 패턴 일치를 사용하여 컴파일 시간 템플릿 인수를 사용할 수 있습니다. 거기에 객체의 내용을 추출 할 수도 없습니다. 그러나 유형의 내용을 추출 할 수 있습니다.

예 : 당신이 관심이 있다면

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 좀보고 할 수 있습니다.

는 '이다'- 표현식 유형에 대한 패턴 일치에 또 다른 방법입니다 ("IsExpression"에 대한 검색)

http://d-programming-language.org/expression.html를 참조하십시오.

-1

D2 및/또는 Phobos를 사용하지 않으려는 경우 tango library을 사용할 수 있습니다. 사용할 수있는 regex module이 있습니다. [편집] D2/Phobos [/ 편집]에 정규 표현식 모듈도 있습니다. D2 및/또는 Phobos 사용을 주장하는 경우, 이식을 시도 할 수 있습니다. 너무 어려워서는 안됩니다.

탱고는 대체 표준입니다. 많은 탱고 개발자와 사용자는 D2가가는 방식을 선호하지 않으며 D1의 대부분을 사용합니다. 그래서 D232에 대한 불완전한 부분이 port에 불과합니다.

정적으로 컴파일 된 정규 표현식을 제공하는 프로젝트 scregex도 있습니다. 나는 이미 그것을 직접 사용했고 효과가 있었다. 그러나 나는 또한 D1 전용이라고 생각한다. 그러나, 그것은 포보스와 탱고 모두와 함께 작동합니다.

+0

2.0 phobos에 regex 모듈이 있습니다. check [std.regex] (http://www.d-programming-language.org/phobos/std_regex.html) –

+2

질문은 http : //en.wikipedia입니다. org/wiki/Pattern_matching, 정규식이 아닌 –

+0

Wops. 미안 내 실수. – Marenz