2015-02-08 4 views
0

Erlang newbie: Я работаю над примерами в книге Джо Армстронга, и я тестирую его код для цикла «for». Я думаю, что получаю неправильный список, но я не уверен, почему. Далее (с 1-го издания книги) компилирует и загружает просто отлично:Пример Erlang: неправильный список создан?

-module(lib_misc). 
-export[for/3]. 

for(Max, Max, F) -> 
    [F(Max)]; 
for(I, Max, F) -> 
    [F(I)|for(I+1, Max, F)]. 

erl> lib_misc:for(1,10, fun(I) -> I end). 

возвращает:

[1,2,3,4,5,6,7,8,9,10]

как и ожидалось. Однако, если заменить 100 на 10:

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, 19,20,21,22,23,24,25,26,27,28 29 | ...]

Это справедливо для всех чисел> 29. Имеется ли «автоматическая» (или настраиваемая пользователем) ограничение на элементы списка? Если этот код создает неверный список, почему? Заранее спасибо.

NB: Я бегу «последнюю» (17.3) сборка Эрл на Windows, Debian и NixOs и я получаю те же результаты ...

ответ

3

все в порядке. Это просто проблема представления в оболочке. Если вы проверите длину своего результата length(lib_misc:for(1,10, fun(I) -> I end)). вы увидите, что оно имеет правильное значение. Вы также можете распечатать его:

io:format("~p~n",[lib_misc:for(1,10, fun(I) -> I end)]). 

Это общее предупреждение, оболочка показывает вам результат в «лучшей» презентации. Для длинного списка или глубоких вложенных терминов он делает некоторое «резюме», чтобы избежать потенциальных сотен страниц.

+4

Вы также можете использовать команду 'rp' оболочки, то есть' rp (lib_misc: for (1,10, fun (I) -> I end)). ', Чтобы увидеть весь термин, который легче ввести, чем '-й: format'. –

+0

Полезное замечание @Steve, я не понял смысла справки оболочки для этой команды ('display Term с использованием информации о записи оболочки ') – Pascal

+0

команда 'rp' оболочки может печатать термины, используя знания записи, загруженные в оболочку, 'rr' или определен там с' rd'. Но 'rp' также печатает весь термин, а не сокращенно, содержит ли он экземпляры записей. Дополнительную информацию об этих командах см. В [документации по оболочке erlang] (http://www.erlang.org/doc/man/shell.html). –

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