сопоставление с образцом в D - PullRequest
21 голосов
/ 11 июня 2011

Я недавно наткнулся на язык программирования D, и он мне действительно нравится. Вы можете программировать действительно высокий уровень, имея полный доступ к аппаратному обеспечению, как в C.

из довольно функционального фона (Haskell, scala) Я ищу способ сопоставления с образцом в D, но ничего не нашел на http://www.digitalmars.com/d/. В Haskell сопоставление с образцом поддерживается самим языком. В Scala это достигается с помощью case-классов или экстракторов (обычные объекты с неприменимым методом).

Возможно ли сделать это в D?

метод receive в std.concurrency, который используется для выполнения параллелизма в стиле актера, как в erlang и scala, использует для этого кучу функций и шаблонных выражений. Но я думаю, что это не так гибко, как в других языках. Вы можете использовать охрану? Можете ли вы извлечь содержимое объекта, как это возможно в Scala?

Ответы [ 3 ]

10 голосов
/ 11 июня 2011

Никакое сопоставление с образцом, как известно из Haskell, не встроено в язык, но D имеет очень общие возможности времени компиляции и отражения, которые позволят вам сопоставлять тип и их структуру в библиотеке.Для сопоставления значений времени выполнения вы можете использовать только обычные конструкции if / switch ...; отложенная оценка аргументов функции может также помочь в реализации некоторых методов сопоставления во время выполнения.

Ограничения на шаблон позволят вам создавать перегрузки функций (шаблонов) на основедля любого выражения, вычисляемого во время компиляции (D позволяет вам выполнять почти весь обычный код во время компиляции).Вы также можете использовать static if для аналогичного эффекта.Это практически позволит вам соответствовать структуре типа.Этот метод также часто используется в D.

Вы можете найти интересный код std.algorithm , ищите isInputRange и подобные функции - они выполняют сопоставление со структурой типов - они ограничивают тип аргументабыть определенным класс типов

Некоторые указания для отражения времени компиляции:

8 голосов
/ 11 июня 2011

Нет специальной функции сопоставления с образцом, столь же мощной, как в 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.

'is' - выражения - это еще один способ сопоставления с образцом типов, см.

http://d -programming-language.org / expression.html (поиск "IsExpression").

0 голосов
/ 12 июня 2011

Если вы не настаиваете на использовании D2 и / или Фобоса, вы можете использовать библиотеку танго .Он имеет модуль регулярных выражений , который вы можете использовать.[Edit] В D2 / Phobos также есть модуль регулярных выражений. [/ Edit] Если вы настаиваете на использовании D2 и / или Phobos, вы можете попробовать его портировать.Это не должно быть слишком сложно.

Tango - это альтернативная стандартная библиотека.Многим разработчикам и пользователям танго не нравится, как идет D2, и большинство придерживается D1.Вот почему есть только несколько неполных портов для D2 из них.

Также существует проект scregex , который предоставляет статически скомпилированные регулярные выражения.Я уже использовал это сам, и это работало.Но я думаю, что это также только для D1.Тем не менее, он работает как с Фобосом, так и с танго.

...