Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755

Как работает цикл do?

11.05.2020, 14:55. Показов 3830. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код отсюда http://lisper.ru/pcl/macros-st... constructs

Lisp
1
2
3
4
5
6
(do ((n 0 (1+ n))
     (cur 0 next)
     (next 1 (+ cur next)))
    ((= 10 n) cur))
 
==> 55
Каким образом получается результат 55, прошу расписать пошагово, что с чем складывается?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2020, 14:55
Ответы с готовыми решениями:

Цикл: как работает цикл в цикле
Не могу понять как работает цикл в цикле например: repeat begin lalalala if что-то1<>100 then begin lalalala2 ...

Цикл работает неправильно, в то время как POST работает
Всем привет! Я хотел написать под php скрипт с авторизацией, брут, на своем сайте(подбор пароля). Написал код на загрузку словаря +...

Цикл while - как работает?
Здравствуйте! Помогите разобраться, почему при условии а меньше либо равно 3, при запуске программа печатает цифру 4? код во вложении.

57
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 14
16.05.2020, 12:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _sg Посмотреть сообщение
как вариант, аромат.
- flavour
1
Заблокирован
16.05.2020, 13:46
Вот тебе долгий код
(loop () body) это на racker
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
20.05.2020, 17:47  [ТС]
Отсюда http://lisper.ru/pcl/macros-st... structs#DO

Вот несколько примеров цикла DO со скелетом, отмеченным фигурными скобочками вместо обычных (они используются только для демонстрационных целей – это не часть стандартного синтаксиса CL. – прим. ред.): FIXME

Lisp
1
2
3
4
5
{do {(i 0 (1+ i))}
 
    {(>= i 4)}
 
  (print i)}
А что делать с фигурными скобками? Их надо заменить на обычные или удалить?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
20.05.2020, 17:54
Выражение состоит из четырёх частей. Внешние скобки объединяют эти четыре части в единое выражение. Обсуждали же, что скобки выполняют группирующую роль. Как вы собираетесь удалять внешние скобки, если выражение развалится?
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
20.05.2020, 18:17  [ТС]
Вот здесь тоже нету лишних скобок?
Lisp
1
{(>= i 4)}
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
20.05.2020, 18:45
do - пример выражения с индивидуальным правилом вычисления (макрос). Согласно этому правило, do имеет три части: 1) инициализация и инкремент переменных; 2) условие выхода; 3) тело. Части 1) и 2) берутся в скобки. Иначе будет путаница. И 1), и 2) могут иметь сколько угодно форм. Поэтому должен быть способ понять, какие формы относятся к возвращаемому значению, а какие - к телу. Совершенно естественно использовать скобки, чтобы сгруппировать 1) и 2) скобками и отделить их таким образом друг от друга. Эти скобки, которые требует синтаксис do, сделаны фигурными. Лучше было бы их цветом отметить, но в книге может быть неудобно.

Сравните с dotimes. Вот, вы пишете:
Lisp
1
2
3
(dotimes (i 5)
  (print "hello")
  (print i))
Почему (i 5) пишется в скобках, это же не вызов функции? Потому что dotimes - макрос, у него индивидуальное правило вычисления. Это правило говорит, что сначала в скобках должны стоять имя переменной и число повторений, а после скобок - тело. Если хотите использовать dotimes, вы должны мириться с его правилами.

Но есть ли рациональное оправдание этим скобкам? Можно ли было определить его так, чтобы писать
Lisp
1
2
3
(dotimes% i 5
  (print "hello")
  (print i))
В принципе, такой оператор цикла можно сделать (и вы сможете). Этот оператор предполагает, что сразу после dotimes% стоит имя переменной (символ, не вычисляется), потом число повторений (выражение, вычисляется один раз перед началом цикла), потому - набор выражений (вычисляются много раз в цикле). Но dotimes умеет кое-что, чего не умеет dotimes%. В скобках может присутствовать третий элемент - возвращаемое значение.
Lisp
1
2
3
(dotimes (i 5 'done)
  (print "hello")
  (print i))
Этот элемент факультативен, по умолчанию возвращается nil. Из-за этой факультативности скобки становятся совершенно необходимы. Если вы захотите, чтобы dotimes% возвращал какое-то значение, нужно будет договориться, что оно в любом случае будет стоять, например, после числа повторений. А факультативно не выйдет, потому что иначе была бы двусмысленность: (print "hello") - это возвращаемое значение или часть тела.

Кроме того, даже если бы не было такой необходимости, можно было бы согласиться потратить лишнюю пару скобок, чтобы явно отделить "шапку" цикла от его тела.

Общий вывод такой, что макросы могут использовать скобки для создания "разделов". Это соответствует общему принципу: пробелы разделяют, скобки группируют.
2
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
20.05.2020, 20:44  [ТС]
А для чего здесь dotimes% знак %?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
20.05.2020, 21:47
Просто прилепил такую фигню, чтобы было похоже на dotimes, но не dotimes.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
21.05.2020, 05:44  [ТС]
А здесь для чего две пары скобок?
Lisp
1
{(>= i 4)}
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
21.05.2020, 12:38
Вот же:
Цитата Сообщение от helter Посмотреть сообщение
Согласно этому правило, do имеет три части: 1) инициализация и инкремент переменных; 2) условие выхода; 3) тело. Части 1) и 2) берутся в скобки.
По-вашему, из чего состоит условие выхода в do?

Добавлено через 18 минут
В секции "выход" записывается условие выхода, потом - выражение, определяющее результат цикла. (Его можно не писать, и возвратится nil, или же их может быть несколько). Условие выхода - выражение. В вашем случае условие выхода - проверка того, что i больше или равно 4. Это обычное составное выражение, поэтому записывается списком: (>= i 4). Выражения-результата у вас нет. Значит, в разделе "выход" один элемент - тестовое выражение. Секцию выхода обрамляете скобками. Внутрь записываете выражение выхода - у него тоже есть скобки. Получается две пары скобок подряд. Внешние являются частью do, внутренние являются частью выражения-теста.
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
21.05.2020, 14:04  [ТС]
А почему здесь http://lisper.ru/pcl/macros-st... constructs
в коде звездочки приделаны? Пример:
Lisp
1
2
3
(do (variable-definition*)
    (end-test-form result-form*)
  statement*)
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
21.05.2020, 14:30
Значит "любое число". Наверно, под влиянием CLHS. Там используется стандартный формат описания аргументов, похожий на регулярные выражения. Например, http://www.lispworks.com/docum... _do_do.htm
do ({var | (var [init-form [step-form]])}*) (end-test-form result-form*) declaration* {tag | statement}*
Звёздочка значит произвольное число, квадратные скобки - опциональность, палка в фигурных скобках - вариант. В данном случае в разделе объявлений перемежаются в любом числе символы для переменных и формы для переменных, состоящие из символа для переменной и опционально инициализации и опционально при наличии инициализации - инкремента; раздел окончания состоит из теста окончания и любого числа форм, которые вычисляются для получения результата; потом любое число деклараций; потом любое число перемежающихся тэгов и "утверждений" (составных выражений). В тексте поясняется, что есть что.
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
21.05.2020, 16:42  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
Получается две пары скобок подряд. Внешние являются частью do
А почему в одном случае используется две пары скобок, а в другом одна?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
21.05.2020, 17:22
Не понял, в каких случаях.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
21.05.2020, 18:15  [ТС]
Ладно, тогда задам другой вопрос пока по примеру из "Мир Лиспа", страница 138.
Lisp
1
2
3
4
5
6
7
(defun expt1 (x n)
  (do ((результат 1)) ; начальное
                        ; значение
    ((= n 0) результат)    ; условие
                        ; окончания
    (setq результат (* результат x))
    (setq n (- n 1))))
Lisp
1
2
(expt1 2 3)
8
Это функция возведения в степень. Не пойму, в какой последовательности, что куда подставляется и как вычисляется.

Мы использовали в качестве имени функции символ
ЕХРТ1, чтобы не переопределять лисповскую функцию
возведения в степень ЕХРТ.
Идея определения состоит в том, чтобы умножить
X на себя N раз, что и является N-й степенью числа X.
В каждом цикле значение переменной РЕЗУЛЬТАТ
умножается на X до тех пор, пока значение счетчика N
не уменьшится до 0 и конечное значение переменной
РЕЗУЛЬТАТ можно будет выдать в качестве значения
предложения ЕЮ.
Там дальше другой пример. Надо пока что разобраться с этим.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
21.05.2020, 18:19
Вроде про синтаксис do уже говорили. Для этой функции приведено сверхподробное пояснение. Не знаю, чего добавить.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
22.10.2020, 13:28  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
Даже запись языка можно настраивать. Необязательно писать скобками. Процедуру чтения можно настроить так, что программа на питоне будет прочитана как программа на лиспе. (Хотя это, вероятно, непросто, потому что синтаксис питона сложный.)
А для чего это может быть нужно?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
22.10.2020, 14:32
Например, в стандартном ридере, кроме скобок, тоже кое-что используется. Например, для чтения строк своё особое правило, для чтения чисел - свои, для символов - свои. То есть уже на уровне стандарта абсолютной однородности нет. Стандарт признаёт, что скобки не панацея, что для определённых классов объектов могут быть полезны особые правила чтения. И что кавычка тоже полезна, хотя она ничего мудрёного не делает - разворачивается в форму. Раз так, то зачем ограничивать правила чтения? Все задачи предусмотреть невозможно, поэтому лучше дать программисту возможность настройки под его задачу и по своему вкусу.

Например, предположим, что кому-то приходится много работать со строками. Может быть, ему пригодилась бы интерполяция строк. В "обычном языке" нужно дожидаться выхода версии, поддерживающей интерполяцию. В лиспе есть библиотека: http://edicl.github.io/cl-interpol/ А в LOL https://letoverlambda.com/inde... chap4.html рассматривается перлоподобный синтаксис для регулярных выражений:
Lisp
1
2
3
span class="sy0"> * (funcall #~s/abc/def/ "Testing abc testing abc")
 
"Testing def testing def"
(причём funcall можно убрать).

Есть вот такие проекты: https://github.com/Neronus/clesh/ в которых макросы чтения используются для более удобного вызова внешних программ. Можно быть менее радикальным и обойтись простым макросом, оборачивающим список в uiop:run-program по аналогии с кавычкой.

Короче говоря, можно делать, что угодно. С одной стороны, это даёт возможность пользоваться синтаксическими удобствами, найденными в других языках или подходящими к конкретной задаче. С другой стороны, осознав свободу, можно со спокойной совестью продолжать писать скобками - не потому что по-другому нельзя, а потому что нравится.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2020, 14:32

Как работает цикл?
Здравствуйте! Помогите разобраться. Есть генератор случайных чисел, который выдает 100 чисел от 0-20. Надо их отсортировать. ...

Как работает цикл for?
не могу понять как работает printf в цикле for. Почему цикл выводит результат с 0 ? И почему, если написать printf("%d /n", i*2)...

как работает цикл while
Вопрос может и глупый... Но хотелось бы узнать точно.. Вообщем, есть класс-оболочка, который блокирует и освобождает ресурс.. Блокирует...

Как работает цикл
Уважаемые, не могли бы вы пояснить работу следующего цикла: vector<int> path; for (int cur=t; cur!=-1; cur=p) path.push_back...

Как работает этот цикл?
нужно разделить строку на слова и записать эти слова в обратном порядке. наткнулся на похожий код в интернете, тут используется вот такой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
58
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru