Подтвердить что ты не робот

Сопоставление шаблонов в D

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

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

Можно ли это сделать в D?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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