我正在尝试按照D应用在各个地方给出的示例。通常在学习语言时,我会从示例应用程序开始并自行更改,纯粹是为了测试内容。
引起我注意的一个应用是计算传入的文本块中的单词的频率。因为字典是在关联数组中构建的(元素存储频率,键是单词本身) ,输出没有任何特定的顺序。因此,我尝试根据网站上给出的示例对数组进行排序。
无论如何,这个例子显示了一个lambda'排序!(...)(数组);'但是当我尝试代码时,dmd将无法编译它。
这是简化的代码:
import std.stdio;
import std.string;
void main() {
uint[string] freqs;
freqs["the"] = 51;
freqs["programming"] = 3;
freqs["hello"] = 10;
freqs["world"] = 10;
/*...You get the point...*/
//This is the actual example given, but it doesn't
//seem to work, old D version???
//string[] words = array(freqs.keys);
//This seemed to work
string[] words = freqs.keys;
//Example given for how to sort the 'words' array based on
//external criteria (i.e. the frequency of the words from
//another array). This is the line where the compilor craps out!
sort!((a,b) {return freqs[a] < freqs[b];})(words);
//Should output in frequency order now!
foreach(word; words) {
writefln("%s -> %s", word, freqs[word]);
}
}
当我尝试编译此代码时,我得到以下内容
s1.d(24): Error: undefined identifier sort s1.d(24): Error: function expected before (), not sort of type int
有谁能告诉我我需要做什么?
我使用DMD v2.031,我已经尝试安装gdc,但这似乎只支持v1语言规范。我只是开始关注dil,所以我不能评论这是否支持上面的代码。
答案 0 :(得分:11)
尝试在文件顶部附近添加:
import std.algorithm;
答案 1 :(得分:2)
这是一种更简单的方法来获取输入文件(来自cmdline),获取行/单词并打印一个单词频率表,按降序排列:
import std.algorithm;
import std.file;
import std.stdio;
import std.string;
void main(string[] args)
{
auto contents = cast(string)read(args[1]);
uint[string] freqs;
foreach(i,line; splitLines(contents))
foreach(word; split(strip(line)))
++freqs[word];
string[] words = freqs.keys;
sort!((a,b)=> freqs[a]>freqs[b])(words);
foreach(s;words)
writefln("%s\t\t%s",s,freqs[s]);
}
嗯,差不多4年后......: - )