28 / 4 / 1
Регистрация: 08.09.2012
Сообщений: 76
|
||||||
1 | ||||||
Почему на выходе nil?23.09.2013, 20:12. Показов 1855. Ответов 7
Метки нет (Все метки)
Хочу сделать ввод в список с клавиатуры до того, как будет введён nil. Подскажите пожалуйста, что я недопонимаю и почему в итоге список пустой?
0
|
23.09.2013, 20:12 | |
Ответы с готовыми решениями:
7
Enum - почему на выходе получаю 0, а не 1 ? Почему на выходе всегда NaN Почему запрос postgres выдает на выходе массив? Почему работает программа при выходе за пределы массива? |
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|
23.09.2013, 20:18 | 2 |
0
|
12 / 12 / 2
Регистрация: 02.09.2012
Сообщений: 40
|
|
23.09.2013, 23:01 | 3 |
Сообщение было отмечено как решение
Решение
Так, на скорую руку накарябал.. Функция будет возвращать список, полученный путём ввода с клавиатуры. Если его нужно будет вывести в консоль, например, просто добавишь туда format или ещё чего-нибудь.
Код
(defun f () (format t "Введите числа, для окончания ввода: nil~%") (let ((lst nil)) (do* ((elt (read) (read))) ((eql elt nil)) (push elt lst)) lst)) Во-вторых вот тут ((eq (read) nil) li) ты теряешь то, что вводится с клавиатуры, потому что результат работы read ничему не присваивается. В-третьих, вообще какой-то странный do у тебя получился.. да и весь код в целом)) Ты на чём писал до того как решил взяться за Lisp? Скобки так никто не оставляет в конце.. все скобки ставятся подряд на одной строке. И не надо ля-ля про то, что так читать удобней)))
3
|
28 / 4 / 1
Регистрация: 08.09.2012
Сообщений: 76
|
|
24.09.2013, 10:12 [ТС] | 4 |
Это ж самоочевидно, кэп.. иначе не спрашивал бы..
pascal, c++, assembler, исполнитель муравей. спасибо)
0
|
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|
24.09.2013, 10:30 | 5 |
Переменные нужно объявлять, и желательно, не с помощью setq.
Обычно используют переменные локальные лексические и глобальные динамические (если глобальные на самом деле нужны; в данном случае - нет). Лексические переменные чаще всего объявляются через let, глобальные - через defvar и defparameter. Для построения списков с нуля часто используется идиома push/nreverse. Функция push добавляет элемент в голову списка и присваивает получившийся список переменной. То есть эта функция имеет побочный эффект (изменение байндинга), что плохо с точки зрения функционального программирования, но нормально с точки зрения CL. Функция nreverse разворачивает список, модифицируя его конс-ячейки. Ею можно пользоваться, только если понимаешь, что делаешь. При построении списка внутри функции с нуля это, как правило, безопасно: конс-ячейки построены у нас на глазах, больше никем не используются и могут быть модифицированы. Кстати, надо учитывать, что (read) и (read) - разные вещи (то есть возвращают разные значения). Если однажды полученное значение не используется, оно, естественно, потеряется. Таковы они, побочные эффекты.
1
|
Модератор
|
||||||||||||||||
24.09.2013, 11:12 | 6 | |||||||||||||||
Почему в итоге список пустой?
Давай взглянем на твой код:
1
|
Модератор
|
||||||
24.09.2013, 11:21 | 7 | |||||
А можно - гораздо проще. Например, вот так (HomeLisp):
2
|
28 / 4 / 1
Регистрация: 08.09.2012
Сообщений: 76
|
|
24.09.2013, 21:21 [ТС] | 8 |
акей. тут вроде понял, спасибо.
пойду в следующую тему..
0
|
24.09.2013, 21:21 | |
24.09.2013, 21:21 | |
Помогаю со студенческими работами здесь
8
Глобальный вектор. Почему на выходе этот массив пуст? На выходе печатается одна строка с дополнительным третьим классом.Почему? Почему при выходе из цикла while переменная счетчик увеличивается на единицу? Почему массив путей файлов не обнуляется при выходе из программы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |