让我们假设我们正在从标准输入中读取并构建已读取的所有行的列表。最后,我们需要显示这些行,用逗号分隔。
go:-
prompt(_, ''),
processInput([ ], Lines),
findall(_, (member(L, Lines), write(L), write(',')), _),
nl.
processInput(LinesSoFar, Lines):-
read_line_to_codes(current_input, Codes),
processInput(Codes, LinesSoFar, Lines).
processInput(Codes, LinesSoFar, Lines):-
( Codes \= end_of_file
->
atom_codes(Line, Codes),
append(LinesSoFar, [ Line ], LinesSoFar1), % <---- append/3 - O(n)
processInput(LinesSoFar1, Lines)
;
Lines = LinesSoFar ).
这段代码的问题是append
调用processInput/3
成本为 O(n)。我们怎样才能避免这种成本并且仍然让我们的谓词是尾递归的(因为我们可能会从标准输入中读取很多行)?
我突然想到我们可以用append
以下内容替换。
LinesSoFar1 = [ Line | LinesSoFar ],
我们可以在显示之前反转列表。但这似乎很老套。有没有更好的办法?