Dart没有任何对DSL的内置支持。但是,在某些情况下,您可以使用method cascades和operator overloading来实现基本DSL。
对于您的示例,只需要方法级联。您可以在parsers library和Fuzzy Logic library中看到运营商超载的一些很好的示例。
这里是你的代码的方法级联版本可能是什么样子:
new Record()
..leader = '00000nam a2200000 u 4500'
..controlfield('001', 'LIB001')
..controlfield('005', '20120311123453.0')
..datafield('100', '',
new Subfield('a', 'Author of record'))
..datafield('245', '0',
new Subfield('a', 'Title of record'));
循环无法在此添加,但你可以根据这些数据定义方法接受数据和函数来创建领域:
List data = [
['a', 'Title of record'],
['a', 'Something of record']
];
// Same record code from above with the addition of this line:
..datafields('245', '', data, (e) => new Subfield(e[0], e[1]));
的示例使用了以下支持类:
class Record {
String leader;
List<ControlField> controlFields = [];
List<DataField> datafieldList = [];
void controlfield(String a, String b) {
controlFields.add(new ControlField(a, b));
}
void datafield(String a, String b, Subfield subfield) {
datafieldList.add(new DataField(a, b, subfield));
}
void datafields(String a, String b, Iterable data, Subfield f(E e)) {
data.forEach((e) {
datafieldList.add(new DataField(a, b, f(e)));
});
}
}
class ControlField {
String a;
String b;
ControlField(this.a, this.b);
}
class DataField {
String a;
String b;
Subfield subfield;
DataField(this.a, this.b, this.subfield);
}
class Subfield {
String a;
String b;
Subfield(this.a, this.b);
}
因为我不熟悉MARC记录,所以我已经在所有字段中使用了相当无用的字段名称a和b,随意将它们改为适当的。另外,我确信我根据代码片断对结构进行的一些假设是错误的,但它们应该很容易更改。
域特定语言 - 其中代码是用一种语言编写的,错误在另一种语言中给出:) –
请您详细说明这一点吗? :)我正在使用DSLs只用于小任务。但也许我必须更加小心,才考虑使用它来做更大的事情。有没有关于DSL的缺点的文章? – NagyI