Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Vaderkos
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447

Есть ли разница между этими макросами?

25.12.2015, 18:40. Показов 1588. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ли какая то разница между этими макросами (В производительности и в коде в который они разворачиваются)? Или же нет. Если говорить о loop или do, то там намного больше разных конструкций, и они более универсальны в плане циклов(все таки встроенные мини-языки циклов ).

Lisp
1
2
3
(dolist (i lst) (do-something i))
 
(loop for i in lst do (do-something i))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2015, 18:40
Ответы с готовыми решениями:

Есть ли разница между этими записями?
bool param1, param2, param3; bool param1; bool param2; bool param3;

Есть ли разница между этими записями
есть ли разница между этими записями? если да, то и какая? \int k (x) \frac{du}{dx} \frac{du}{dx} dx и \int \frac{d}{dx} (k (x)...

Какая разница между этими кодами?
<p id="one">Hello World</p> <div id="one"> <p>Hello World</p> </div>

22
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
25.12.2015, 19:40
Нет. Loop предоставляет больше фантазии, нежели do-something.
2
1075 / 968 / 113
Регистрация: 04.11.2012
Сообщений: 1,013
25.12.2015, 21:33
Лучший ответ Сообщение было отмечено Vaderkos как решение

Решение

dolist очень простой, это foreach
а loop, это свой встроенный декларативный язык внутри лиспа.
2
 Аватар для Vaderkos
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
25.12.2015, 21:56  [ТС]
Lambdik, Да, но разницы в коде в который они разворачиваются нет?
0
1075 / 968 / 113
Регистрация: 04.11.2012
Сообщений: 1,013
25.12.2015, 22:02
Лучший ответ Сообщение было отмечено _sg как решение

Решение

Почему нет, есть!
Lisp
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
> (pprint (macroexpand-1 '(loop for i in '(1 2 3) do (print i))))
 
(BLOCK NIL
  (MACROLET ((LOOP-FINISH () '(GO #:|end-loop-740|)))
    (LET ((I NIL) (#:|tail-743| '(1 2 3)) (#:|by-744| 'SYSTEM:CDR$CONS))
      (TAGBODY
       #:|begin-loop-739| NIL
               (PROGN
                 (WHEN (OR (ENDP #:|tail-743|)) (GO #:|end-loop-740|))
                 (LET ((#:|temp-746| (FUNCALL #:|by-744| #:|tail-743|))
                       (#:|temp-745| (SYSTEM:CAR$CONS #:|tail-743|)))
                   (SETQ I #:|temp-745|)
                   (SETQ #:|tail-743| #:|temp-746|)))
               (PRINT I)
               (GO #:|begin-loop-739|)
       #:|end-loop-740| (RETURN-FROM NIL NIL)))))
 
 
 
> (pprint (macroexpand-1 '(dolist (i '(1 2 3)) (print i))))
 
(DO ((#:|dolist-749| '(1 2 3)
      (CDR (COMPILER::INTERNAL-THE CONS #:|dolist-749|))))
    ((ENDP #:|dolist-749|))
  (LET ((I (CAR (COMPILER::INTERNAL-THE CONS #:|dolist-749|))))
    (DECLARE (IGNORABLE I))
    (TAGBODY (PRINT I))))
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,709
Записей в блоге: 14
26.12.2015, 14:24
Lambdik, боже мой!.. Оказывается, loop for разворачивается в ужасный код с setq и, страшно сказать - GO !!! "И эти люди запрещают мне ковырять в носу!..." (это я об авторах реализации).
3
 Аватар для Vaderkos
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
26.12.2015, 22:22  [ТС]
Catstail, Я так понимаю в плане производительности dolist пошустрее будет)
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
26.12.2015, 22:28
Цитата Сообщение от Catstail Посмотреть сообщение
Lambdik, боже мой!.. Оказывается, loop for разворачивается в ужасный код с setq и, страшно сказать - GO !!! "И эти люди запрещают мне ковырять в носу!..." (это я об авторах реализации).
Ээ. А во что ещё ему раскрываться? Все «операторы цикла» в лиспе — макросы, поэтому раскрыв все макросы, мы заведомо получаем код без циклов.

Добавлено через 45 секунд
Цитата Сообщение от Vaderkos Посмотреть сообщение
Catstail, Я так понимаю в плане производительности dolist пошустрее будет)
Откуда такой вывод?
3
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
26.12.2015, 22:36
Лучший ответ Сообщение было отмечено _sg как решение

Решение

Vaderkos, нет разницы в скорости
Lisp
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
INSOMNIA> (progn
            (pprint "Loop")
            (time (loop 
                     repeat 1000
                     do (loop for a in *1000000*)))
            (pprint "Dolist")
            (time (loop 
                     repeat 1000 
                     do (dolist (a *1000000*) (declare (ignore a))))))
 
"Loop"
Evaluation took:
  2.840 seconds of real time
  2.788000 seconds of total run time (2.788000 user, 0.000000 system)
  98.17% CPU
  6,799,001,607 processor cycles
  32,992 bytes consed
  
 
"Dolist"
Evaluation took:
  2.846 seconds of real time
  2.794000 seconds of total run time (2.794000 user, 0.000000 system)
  98.17% CPU
  6,811,839,198 processor cycles
  33,136 bytes consed
  
NIL
3
 Аватар для Vaderkos
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
26.12.2015, 22:44  [ТС]
helter, transformator.t, Уже понял, сам вот сижу проверяю
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
27.12.2015, 01:41
Цитата Сообщение от helter Посмотреть сообщение
Ээ. А во что ещё ему раскрываться? Все «операторы цикла» в лиспе — макросы, поэтому раскрыв все макросы, мы заведомо получаем код без циклов.
Наверно, я неправ.
http://www.lispworks.com/docum... _ababb.htm
An implementation is free to implement any macro operator as a special operator, but only if an equivalent definition of the macro is also provided.

Насколько понимаю, допустима реализация, в которой dotimes — специальный оператор и макрос, раскрывающийся (например) в этот же специальный оператор. Тогда после раскрытия всех макросов циклы могут оставаться в виде специальных операторов.

Хотя я всё равно не понял насчёт ковыряния в носу. По-моему, вполне нормально реализовать циклы через go и потом писать структурный код с циклами и без go. Какая разница, в какой низкоуровневый лисп и машкод превращается наш прекрасный структурный код.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,709
Записей в блоге: 14
27.12.2015, 10:01
Цитата Сообщение от helter Посмотреть сообщение
Ээ. А во что ещё ему раскрываться?
- не знаю... Апологеты "правильного программирования" топтались и продолжают топтаться по goto... Лично я - по убеждениям демократ, и не вижу в goto ничего страшного. Но действительно без goto почти всегда можно обойтись. А чтобы отказаться от go даже в макро, достаточно реализовать в ядре функцию, обеспечивающую бесконечный цикл с возможностью выхода по return.
2
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
29.12.2015, 20:10
Цитата Сообщение от Catstail Посмотреть сообщение
Апологеты "правильного программирования" топтались и продолжают топтаться по goto...
'то было когда фортран и алгол правили миром. Как-то я grep'нул ядро linux на goto коих выявилось более многодесятковтысяч. Так что апологеты пусть выводят догмы, а мы продолжим делать дело.
Всегда Ваш. Самуил.
2
188 / 155 / 17
Регистрация: 18.12.2015
Сообщений: 179
02.01.2016, 20:33
Цитата Сообщение от Catstail Посмотреть сообщение
бесконечный цикл с возможностью выхода по return
Так тоже нельзя. Этак мы выйдем из середины цикла, а это не структурненько.

Например, такой код не считается структурным (паскаль):
Pascal
1
2
3
4
5
6
7
8
9
10
for a:=1 to 1000 do
  begin
 
    ...
 
    if условие_выхода then break;
 
    ...
 
  end;
Он должен быть переписан следующим образом:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
a:=0;
repeat
  inc(a);
 
  ...
 
  flag:=условие_выхода;
  if not flag then
    begin
 
      ...
 
    end
until (a=1000) or flag;
То, что второй вариант длиннее, непонятнее и медленнее работает - это детали. Зато он структурный. Впрочем, это, опять, вопрос политических пристрастий.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,709
Записей в блоге: 14
02.01.2016, 20:47
Цитата Сообщение от rdt Посмотреть сообщение
Так, тоже, нельзя. Этак мы выйдем из середины цикла, а это не структурненько.
Например, такой код не считается структурным (паскаль):
- кем не считается и в чем разница между первым и вторым? Выход есть в обоих кодах. Все. В одной книге я прочитал хорошую фразу на эту тему: "Оставим подобные рассуждения правоверным"...

В основе любого фанатизма (и структурного программирования в т.ч.) лежит желание не думать, а выполнять инструкции. Многим это нравится. Мне - не очень.
0
188 / 155 / 17
Регистрация: 18.12.2015
Сообщений: 179
02.01.2016, 21:19
Catstail, я читал давно какую-то книжку, сейчас уже не помню половину.

Остаётся сослаться на википедию: https://ru.wikipedia.org/wiki/... _—_Якопини

Суть в том, что разрешены 3 вида конструкций:
1) последовательное выполнение операторов;
2) оператор "if";
3) цикл "пока".

Что касается желания не думать, я только за. Если б у меня было желание сделать как можно больше работы, я бы писал только на ассемблере. Но, т.к. хочется написать программу как можно быстрее, приходится идти на компромиссы. Структурное программирование - один из способов писать программы быстрее. Его нужно освоить, оставить полезное и, собственно, идти дальше. Следовать как догме - и в мыслях не было.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,709
Записей в блоге: 14
02.01.2016, 22:03
rdt, теорема Бёма-Якопини - это замечательно. Но языки программирования развиваются в противоположном направлении. А так - все можно и на машине Тьюринга запрограммировать, только, боюсь, много желающих не найдется.

Цитата Сообщение от rdt Посмотреть сообщение
Суть в том, что разрешены 3 вида конструкций:
- кем "разрешены"? ГД? Следственным комитетом? Лично я в разрешениях не особо нуждаюсь...

Цитата Сообщение от rdt Посмотреть сообщение
Что касается желания не думать, я только за.
- не понял... Вы за самостоятельное мышление или за шаблоны?

Цитата Сообщение от rdt Посмотреть сообщение
Структурное программирование - один из способов писать программы быстрее.
- по сравнению с чем?

Да Бог с ним, со структурным программированием. На смену ему пришло ООП и уже устарело... А то, что код нужно писать структурировано и аккуратно, я понимал и без структурного программирования. Просто смешно, что несмотря на все проклятия в адрес GOTO, он либо стыдливо сохраняется в языке (и потихоньку используется; см. выше ), либо изживается из языка и заменяется несколькими уродливыми конструкциями (Java).
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,368
03.01.2016, 01:53
Цитата Сообщение от Catstail Посмотреть сообщение
несмотря на все проклятия в адрес GOTO, он либо стыдливо сохраняется в языке
почему стыдливо? Для совместимости всего лишь
Цитата Сообщение от Catstail Посмотреть сообщение
Бог с ним, со структурным программированием. На смену ему пришло ООП и уже устарело...
Тут вы не правы, это как сравнивать литры и километры... разные категории... хоть в основе ООП и лежит структурное программирование.
И еще позвольте полюбопытствовать, что же пришло на смену ООП?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,709
Записей в блоге: 14
03.01.2016, 10:35
Цитата Сообщение от vlisp Посмотреть сообщение
Для совместимости всего лишь
- если это так, то почему лисповские макро разворачиваются в код с GOTO?

Действительная причина недовольства GOTO состоит в том, что излишние их (GOTO) нагромождения порождают нечитаемый код. 40-50 лет назад показалось, что в GOTO главное зло (убери GOTO - и будет счастье; в этом апологеты структурного программирования напоминали религиозных фанатиков и коммунистов).

GOTO попытались убрать. И выяснилось: a) счастье все равно не наступило; б) возникли большие проблемы у макрогенераторов, компиляторов и т.п. И тогда решили оставить GOTO (в подавляющем большинстве языков), аргументируя это тем, что не всякий код на языке предназначен для человека, некоторые - для компилятора (человек их вообще не видит и "вреда" от GOTO нет; пример в Лиспе см. выше).

Кстати, Вы же не будете утверждать, что Д.Кнут - лох, ничего не понимающий в программировании? Большинство его алгоритмов изложены в императивном стиле и изобилуют фразами типа: "Если условие соблюдается, перейти к п.7" Или даже проще и без затей "Перейти к п. 11".

Теперь про ООП. В полной мере оно не устарело, но трансформируется на глазах. В частности, возрастает роль интерфейсов (интерфейсы позволяют реализовать наследование и полиморфизм проще и естественнее, чем классические механизмы). Но есть и гораздо более радикальные точки зрения (которых придерживаются, кстати, такие "киты", как П.Грэм и А.Степанов (кто не знает - это автор STL).

Поймите меня правильно: я всего лишь либерал по убеждениям и считаю, что любые запреты в духе "Долой GOTO", "Ликвидируем богатых", и т.п. приводят к одинаково плохим результатам (в своих областях).
1
 Аватар для _sg
4709 / 4404 / 380
Регистрация: 12.05.2012
Сообщений: 3,101
03.01.2016, 10:46
Цитата Сообщение от Catstail Посмотреть сообщение
А.Степанов (кто не знает - это автор STL)
An Interview with A. Stepanov by Graziano Lo Russo
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.01.2016, 10:46
Помогаю со студенческими работами здесь

В чем разница между этими массивами?
const char *names = {"Ivanov", "Petrov", "Sidorov"}; const char **names = {"Ivanov", "Petrov", "Sidorov"}; Добавлено через 8...

В чем разница, между этими матрицами?
В общем, у меня сломалась матрица ноутбука. Я решил её заменить. Нашел в интернете б\у матрицу. Только её "model", а именно...

В чем разница между этими объявлениями?
private: System::Windows::Forms::Label ^L2; и private: System::Windows::Forms::Label^ L2; если есть разница, могли бы мне ее...

В чем разница между этими двумя документами ?
Не могу разобраться какие изменения внесены в документ пример пункта_до2_new. При выделении текста видны "полоски" вертикальные,...

В чем разница между этими двумя функциями?
int fp16_sign(fp16_t f) { int sign = 0; __asm( "shl $1, %1;" // CF = f << 1; "adc $0, %0" // sign += CF; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru