2016-10-16 3 views
-2

я следующие функции:Erlang: ошибка синтаксиса перед:», "слово"

search(DirName, Word) -> 
    NumberedFiles = list_numbered_files(DirName), 
    Words = make_filter_mapper(Word), 
    Index = mapreduce(NumberedFiles, Words, fun remove_duplicates/3), 
    dict:find(Word, Index). 

list_numbered_files(DirName) -> 
    {ok, Files} = file:list_dir(DirName), 
    FullFiles = [ filename:join(DirName, File) || File <- Files ], 
    Indices = lists:seq(1, length(Files)), 
    lists:zip(Indices, FullFiles). % {Index, FileName} tuples 

make_filter_mapper(MatchWord) -> 
    fun (_Index, FileName, Emit) -> 
    {ok, [Words]} = file:consult(FileName), %% <---- Line 20 
    lists:foreach(fun (Word) -> 
     case MatchWord == Word of 
     true -> Emit(Word, FileName); 
     false -> false 
     end 
    end, Words) 
    end. 

remove_duplicates(Word, FileNames, Emit) -> 
    UniqueFiles = sets:to_list(sets:from_list(FileNames)), 
    lists:foreach(fun (FileName) -> Emit(Word, FileName) end, UniqueFiles). 

Однако, когда я называю поиска (Path_to_Dir, Word) я получаю:

Error in process <0.185.0> with exit value: 
{{badmatch,{error,{1,erl_parse,["syntax error before: ","wordinfile"]}}}, 
[{test,'-make_filter_mapper/1-fun-1-',4,[{file,"test.erl"},{line,20}]}]} 

И I не понимаю, почему. Любые идеи?

ответ

1

переменная Words будет соответствовать к содержимому списка, который может быть не только один кортеж, но многие из них. Постарайтесь, чтобы соответствовать {ok, Words} вместо {ok, [Words]}.

+0

Хотя это не ошибка, которую он получает. Вызов файла: consult() возвращает {error, ...}, not {ok, ...}, поэтому в файле, который он читает, есть синтаксическая ошибка. – RichardC

0

Помимо того, что function file:consult/1 может возвращать список из нескольких элементов, так что вы должны заменить {ok,[Words]} (ожидая список одного элемента = Слова) на {ok,Words}, он фактически возвращает ошибку синтаксиса означает, что в файле вы читаете, есть синтаксическая ошибка.

Помните, что файл должен содержать только действительные термины erlang, каждый из которых заканчивается точкой. Самая распространенная ошибка - забыть точку или заменить ее запятой.

Смежные вопросы