Question

Je suis en train de suivre les exemples donnés dans divers endroits pour des applications D. En général, lorsque l'apprentissage d'une langue que je commence sur les applications par exemple et de les changer moi-même, uniquement pour des trucs de test sur.

Une application qui a attiré mon attention était de compter la fréquence des mots dans un bloc de texte passé. Comme le dictionnaire a été construit dans un tableau associatif (avec les éléments de stockage de la fréquence, et les clés étant les mots eux-mêmes) , la sortie n'a pas été dans un ordre particulier. Donc, j'ai essayé de trier le tableau en fonction des exemples donnés sur le site.

Quoi qu'il en soit, l'exemple a montré une lambda 'tri (...) (tableau);! mais quand je tente le code DMD ne le compiler.

Voici le code bouilli vers le bas:

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]);
   }
}  

Quand je tente de compiler ce code, je reçois le texte suivant

    s1.d(24): Error: undefined identifier sort
    s1.d(24): Error: function expected before (), not sort of type int

Quelqu'un peut-il me dire ce que je dois faire ici?

J'utilise DMD v2.031, j'ai essayé d'installer le GDC, mais cela ne semble soutenir la spécification de langage v1. Je n'ai commencé à regarder DIL, donc je ne peux pas dire si ce code prend en charge ci-dessus.

Était-ce utile?

La solution

Essayez d'ajouter ce en haut du fichier:

import std.algorithm;

Autres conseils

Voici une façon encore plus simple pour obtenir un fichier d'entrée (à partir cmdline), obtenir des lignes / mots et imprimer une table de mots frequencing, dans l'ordre décroissant:

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]);
}

Eh bien, presque 4 ans plus tard ...: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top