|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Непонятное поведение цикла по списку
Регистрация: 22.01.2010
Сообщений: 311
|
||
Просмотров: 7521
|
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
Вы меня не поняли, уважаемые.
Перед началом цикла список выглядит так: ((1 T) (2 T) (3 T) (4 T)) Уже после 1-го шага он выглядит так: ((1 T) (2 T) (3 nil) (4 nil)) Почему же на 3-м и 4-м шаге значение elem составляет (3 T) и (4 T) соответственно, как будто цикл ничего не знает о внесенных в список изменениях ? |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Список не изменяемая структура - он не может на одном шаге выглядеть так, а на другом этак - если списки отличаються значит они РАЗНЫЕ (просто в Вашем случае Вы разным спискам присваиваете одинаковые имена) - то как Вы пытаетесь сделать "не кашерно" с точки зрения лиспа - Вам два примера уже дали вчетверо короче чем Ваш - а Вы все пытаетесь "блох" выловить.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Вам бы неплохо понять почему оно такое. В вашем примере выдает ровно то, что Вы просите, посмотрите внимательней.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Список НИКАК НЕВОЗМОЖНО изменить, все далее следствие непонимания этого.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Тут вернее сказать могут, но не желательны - чтоб не путаться кто где.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Тогда переведи для сирых - что делает subst?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Offtop: Алексей это Вы спрашиваете???
(subst x y z) Возращает НОВЫЙ список на основе z с измененными элеметами равными y на x, логический аналог можно представить так (не оптимальный вариант, но "проще" всех показывает логику): Код:
Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 26.03.2012 в 00:33. |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
изменяет переменную lst в выражениях ( 3 аргумент функции foreach) второй аргумент она не может изменить по определению (не та область видимости). Поэтому, Дима_, в принципе, правильно написал, что это разные списки
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
По "нашему" в этом коде вы трижды переопределяете переменную lst. Offtop: и сейчас полетят тухлые помидоры А по моему SETQ в автолиспе это "злейшие зло" благодаря которому все как-бы "упрощают" задачу, но тем самым закрывая самому себе дорогу понимания к ОСНОВАМ лиспа.
з.ы. Без присваивания (setq) конечно не возможны глобальные переменные и есть еще пара "узких" мест (по сути тоже возможны, но тут дело выходит за рамки "модели" автолиспа), но "втыкать" ее везде и всюду - ИХМО признак плохого тона и как минимум нечитаемости, "уязвимости" (когда без отладчика хрен поймешь что тут где) кода. з.з.ы. To Gomer по моему ВАЖНО понимать разницу между изменением переменной lst и переопределением (ведь она по сути тоже неизменна).
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Если Вы, например, двух своих сыновей (дочерей) двойняшек одинаковыми именами назовете - измениться ли у Вас количество детей?? Но с обращением к ним у Вас возникнут некоторые проблемы. Если делать аналогию с классическим (императивным) представлением в программировании, то lst это ссылка на список, а не изменяем он для того, чтоб не было разницы между ссылкой и содержимым (сколько-бы "копий" этого списка мы не создали - физически это одни и те-же данные). Переоперделить данные мы можем локально ((lambda (lst) (здесь уже другой lst)) '(1 2 3)), это же не значит что мы локально "изменили" список.
В автолиспе ИЗМЕНИТЬ мы можем, например, свойства объекта (entmod или vla-put), сама объектная (и DXF) модель разработанна под императивное программирование (имеет изменяемые состояния) - из за чего при обращении (изменении) к последней необходимо вводить vla-startundomark и учитывать в каком "состоянии" она находиться (но есть конечно и плюсы от этого подхода).
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 26.03.2012 в 09:00. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Да таких книжек (по автолиспу) абсолютное большинство - не раскрывают (или делают это очень бегло, не заостряя внимания) саму суть, что есть список, пара, lambda (которая почему-то, обычно, рассматриваеться как приложение к mapcar) и пр. функциональные понятия, а уж тем более их слабые и сильные стороны - типо мы сразу "практичной части" учим. А потом и пушут "примеры" с изменением списков - после чего вопросы подобные Вашему заглавию и рождаются.
з.ы. "не читайте советских газет" з.з.ы В 1.9.20 написано, с натяжкой, верно - возращаемое значение..., во втором примере бред полный - попробуйте добавить в созданный список чего-либо с помощью cons. з.з.з.ы кстати откуда это?
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Даже if, cond и тому подобное - тоже функции. В LISP нет ничего наподобие Inc (i). Для понимания сути очень полезно изучить книгу "Мир Лиспа" финских авторов. Там очень наглядно показано, как хранятся данные в Лисп. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Вот здесь небольшая натяжка - они конечно функции, но в лисп терминологии - это так называемые "особые формы" (не помню кто, на мой взгляд плохо, их перевел как операторы) - так как их поведение отличается от обычных функций, и для создания подобных вещей (с непоследовательной и возможно неполной обработкой аргументов) в "расширенных" лиспах созданы отдельные конструкции - макросы. У любой "настоящей" функции в лиспе (как и в математике) в начале вычисляются все ее аргументы.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Цитата:
Но все-таки это функции, они возвращают результат, который можно использовать. А во "всяких разных" языках нельзя получить результат if...then...else. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
В общем-то действительно Уважаемые люди (я правда книжек из этой серии так ни одной и не прочел - может из-за этого и "такой"
![]() p/s/ хотя, судя по содержанию, про что я говорил в #22 здесь тоже пропущенно напрочь - но уточню - не читал - вижу только содержание.
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 26.03.2012 в 15:11. |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Какие еще ячейки??? Забудьте это слово в отношении лисп - тут их просто нет. Mapcar получил АРГУМЕНТ и ему глубоко плевать как он назывался lst, spisok или еще как - внутри его функции (лямбды в данном случае) его (аргумент) никаким образом не изменить, можете хоть "обприсваиваться".
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Цитата:
Несоветские, зачастую нисколько не лучше, в процессе написания книги пришлось поковыряться в документации и самом АКАДе глубже обычного, там неточностей и недоговорённостей тож хватает. Последний раз редактировалось Alaspher, 28.03.2012 в 15:04. |
|||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
К сожалению это правда. Давайте может, хоть при помощи отдельной темы этого форума, напишем "брошюрку" про основы, в контексте именно автолиспа. Я б ей богу взялся, что знаю расскажу, но во первых сам знаю далеко не все, во вторых, в разумные сроки не потяну, да и надо, чтоб кто-то "знающий" проверил. Уверен у кого-то уже готовые статьи есть (про рекурсию я точно видел, кажется у Елпанова Евгения) - надо все в логической последовательности в "кучу" собрать. Сделаеам такое "сообщество авторов" dwg.ru, ну а если доделаем в отдельную pdf'ку оформим (заработать на всех вряд-ли получиться - так что думаю здесь вариант - только из любви к исскуству).
p.s. Если еще 1-2 человека найдеться, то я берусь (пока надо логику содержания продумать - с чего начинать).
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
swkx, спасибо, мы старались )
Дима_, "брошюрка" потянет страниц так на тыщщу в бумажном эквиваленте, это в лучшем случае. В рамках форума/вики можно осилить интересные локальные темы, типа области видимости или рекурсии, ничего большего, без наличия одного автора, который и будет тащить почти всё на себе, кмк не получится. |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
Цитата:
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Непонятное поведение многострочного атрибута блока | Нитонисе | AutoCAD | 2 | 11.09.2010 17:35 |
Непонятное поведение функции strlen, и вообще об unicode в txt-файлах | batmax | Программирование | 4 | 01.09.2010 19:08 |
Непонятное поведение SCADа | Engineer SV | Расчетные программы | 1 | 06.08.2010 23:37 |
Как ввести ключевое слово в командную строку при выполнении цикла lisp'ом? | Дмитрий_Leo | LISP | 8 | 15.05.2010 09:44 |