Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Непонятное поведение цикла по списку

Непонятное поведение цикла по списку

Ответ
Поиск в этой теме
Непрочитано 25.03.2012, 09:42
Непонятное поведение цикла по списку
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

День добрый.

Имеем список из 4-х элементов: ((1 T) (2 T) (3 T) (4 T))
В первом же шаге цикла меняю T на nil для элементов списка с 1-м значением >=3, т.е. получаем
((1 T) (2 T) (3 nil) (4 nil))
В цикле должны обрабатываться только те элементы, у которых 2-е значение = T,
поэтому я рассчитывал увидеть на экране:
elem: (1 T)
elem: (2 T)
но вместо этого увидел
elem: (1 T)
elem: (2 T)
elem: (3 T)
elem: (4 T)

Почему условие (if (cadr elem) ...) так нагло игнорируется ?
Такое впечатление, что в памяти образуется два экземпляра списка lst.
Проясните, плиз, такое поведение.

Код:
[Выделить все]
 (defun test ()
(setq lst (list '(1 T) '(2 T) '(3 T) '(4 T)))
(foreach elem lst
	(if (cadr elem)
	(progn
		(princ "\n elem: ") (princ elem)

		(setq lst2 (vl-remove-if
						(function (lambda (e)
								  	(< (car e) 3)
							  )
							)
						lst
						))
			
		(if lst2
			(foreach elem2 lst2
				(if (cadr elem2)
					(setq oldelem (car (vl-member-if (function (lambda (e) (equal e elem2))) lst))
						  newelem (subst nil T oldelem)
						  lst (subst newelem oldelem lst))
				)
			)
		)
			
	)
	)
)
(princ)
)
Просмотров: 7203
 
Автор темы   Непрочитано 26.03.2012, 08:59
#21
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Во вложении. По поводу изменяемости списка.
В обоих случаях нет упоминания о том, что возвращаемое значение - новый список.
Миниатюры
Нажмите на изображение для увеличения
Название: Определение subst.jpg
Просмотров: 54
Размер:	12.2 Кб
ID:	77113  Нажмите на изображение для увеличения
Название: Определение cons.jpg
Просмотров: 59
Размер:	11.0 Кб
ID:	77114  

Последний раз редактировалось swkx, 26.03.2012 в 09:09.
swkx вне форума  
 
Непрочитано 26.03.2012, 11:30
#22
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Да таких книжек (по автолиспу) абсолютное большинство - не раскрывают (или делают это очень бегло, не заостряя внимания) саму суть, что есть список, пара, lambda (которая почему-то, обычно, рассматриваеться как приложение к mapcar) и пр. функциональные понятия, а уж тем более их слабые и сильные стороны - типо мы сразу "практичной части" учим. А потом и пушут "примеры" с изменением списков - после чего вопросы подобные Вашему заглавию и рождаются.
з.ы. "не читайте советских газет"
з.з.ы В 1.9.20 написано, с натяжкой, верно - возращаемое значение..., во втором примере бред полный - попробуйте добавить в созданный список чего-либо с помощью cons.
з.з.з.ы кстати откуда это?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.03.2012, 11:40
#23
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
В обоих случаях нет упоминания о том, что возвращаемое значение - новый список.
Тем не менее это именно новый список. Упоминать об этом нет нужды. Это же LISP! В нем только функции, которые всегда что-то возвращают.
Даже if, cond и тому подобное - тоже функции. В LISP нет ничего наподобие Inc (i).

Для понимания сути очень полезно изучить книгу "Мир Лиспа" финских авторов. Там очень наглядно показано, как хранятся данные в Лисп.
ShaggyDoc вне форума  
 
Непрочитано 26.03.2012, 11:47
#24
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Даже if, cond и тому подобное - тоже функции.
Вот здесь небольшая натяжка - они конечно функции, но в лисп терминологии - это так называемые "особые формы" (не помню кто, на мой взгляд плохо, их перевел как операторы) - так как их поведение отличается от обычных функций, и для создания подобных вещей (с непоследовательной и возможно неполной обработкой аргументов) в "расширенных" лиспах созданы отдельные конструкции - макросы. У любой "настоящей" функции в лиспе (как и в математике) в начале вычисляются все ее аргументы.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.03.2012, 14:09
#25
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
они конечно функции, но в лисп терминологии - это так называемые "особые формы" (не помню кто, на мой взгляд плохо, их перевел как операторы) - так как их поведение отличается от обычных функций
Цитата:
— Но ведь это же равиолли.
— Ну они же пельмени!
— Да, но ведь они все-таки равиолли!
— Михалыч — сначала они — пель-ме-ни. А потом уже все остальное. Михалыч, ну это пельмени!..
— М-да, равиолли…
Да, особое и хитрое поведение. Которое можно с умом использовать. И перевел как "операторы" какой-то "сионист" или бейсикист.
Но все-таки это функции, они возвращают результат, который можно использовать. А во "всяких разных" языках
нельзя получить результат if...then...else.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 26.03.2012, 14:36
#26
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Цитата:
Сообщение от Дима_ Посмотреть сообщение
з.з.з.ы кстати откуда это?
На картинке 1-я страница этой книжки
Миниатюры
Нажмите на изображение для увеличения
Название: Book.jpg
Просмотров: 49
Размер:	162.5 Кб
ID:	77136  
swkx вне форума  
 
Непрочитано 26.03.2012, 14:44
#27
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


В общем-то действительно Уважаемые люди (я правда книжек из этой серии так ни одной и не прочел - может из-за этого и "такой" ). Тем паче, что "про лямбды" разъяснил мне лично (на одной из пъянок встреч формучан) Alaspher (он-же Лоскутов П.В.).
p/s/ хотя, судя по содержанию, про что я говорил в #22 здесь тоже пропущенно напрочь - но уточню - не читал - вижу только содержание.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 26.03.2012 в 15:11.
Дима_ вне форума  
 
Непрочитано 26.03.2012, 14:56
#28
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Дима_ Посмотреть сообщение
ВАЖНО понимать разницу между изменением переменной lst и переопределением
имхо, дело не в этом фунция foreach копирует значение lst в другую "ячейку", и руководствуется ей, а не ячейкой, на которую ссылается lst. mapcar работает так же, например:
Код:
[Выделить все]
 (defun test ( / lst)
(setq lst '(1 2 3))
(mapcar '(lambda (x) (setq lst (cons (1+ x) lst))) lst)
lst)
(test)
gomer вне форума  
 
Непрочитано 26.03.2012, 15:06
#29
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Какие еще ячейки??? Забудьте это слово в отношении лисп - тут их просто нет. Mapcar получил АРГУМЕНТ и ему глубоко плевать как он назывался lst, spisok или еще как - внутри его функции (лямбды в данном случае) его (аргумент) никаким образом не изменить, можете хоть "обприсваиваться".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.03.2012, 09:13
#30
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Да таких книжек (по автолиспу) абсолютное большинство - не раскрывают (или делают это очень бегло, не заостряя внимания) саму суть, что есть список, пара, lambda (которая почему-то, обычно, рассматриваеться как приложение к mapcar) и пр. функциональные понятия, а уж тем более их слабые и сильные стороны - типо мы сразу "практичной части" учим. А потом и пушут "примеры" с изменением списков - после чего вопросы подобные Вашему заглавию и рождаются.
Эта книга, по сути, справочник функций, не более. Вопросам логики LISP и тем более областям видимости там вообще не уделяется никакого внимания. И так объём книги превысил первоначально намеченный. Вероятно, формулировки можно было сделать более точными, это справедливое замечание. В книге формулировки даны с точки зрения самих обрабатываемых данных, а не их размещения. Учится программировать по этой книге нельзя - она для того, что бы вспомнить, что делает та или иная функция.
Цитата:
Сообщение от Дима_ Посмотреть сообщение
з.ы. "не читайте советских газет"
Несоветские, зачастую нисколько не лучше, в процессе написания книги пришлось поковыряться в документации и самом АКАДе глубже обычного, там неточностей и недоговорённостей тож хватает.

Последний раз редактировалось Alaspher, 28.03.2012 в 15:04.
Alaspher вне форума  
 
Автор темы   Непрочитано 28.03.2012, 09:32
#31
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Цитата:
Сообщение от Alaspher Посмотреть сообщение
она для того, что бы вспомнить, что делает та или иная функция
Именно для этих целей и используется. И лучшего справочника я не встречал. Во всяком случае, у меня в компьютере уйма литературы по автолиспу, но кроме этой книжки уже давно ничего не открывается.
swkx вне форума  
 
Непрочитано 28.03.2012, 10:41
#32
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Alaspher Посмотреть сообщение
Несоветские, зачастую нисколько не лучше...
К сожалению это правда. Давайте может, хоть при помощи отдельной темы этого форума, напишем "брошюрку" про основы, в контексте именно автолиспа. Я б ей богу взялся, что знаю расскажу, но во первых сам знаю далеко не все, во вторых, в разумные сроки не потяну, да и надо, чтоб кто-то "знающий" проверил. Уверен у кого-то уже готовые статьи есть (про рекурсию я точно видел, кажется у Елпанова Евгения) - надо все в логической последовательности в "кучу" собрать. Сделаеам такое "сообщество авторов" dwg.ru, ну а если доделаем в отдельную pdf'ку оформим (заработать на всех вряд-ли получиться - так что думаю здесь вариант - только из любви к исскуству).
p.s. Если еще 1-2 человека найдеться, то я берусь (пока надо логику содержания продумать - с чего начинать).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.03.2012, 15:11
#33
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


swkx, спасибо, мы старались )

Дима_, "брошюрка" потянет страниц так на тыщщу в бумажном эквиваленте, это в лучшем случае. В рамках форума/вики можно осилить интересные локальные темы, типа области видимости или рекурсии, ничего большего, без наличия одного автора, который и будет тащить почти всё на себе, кмк не получится.
Alaspher вне форума  
 
Непрочитано 28.03.2012, 15:39
#34
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Какие еще ячейки??? Забудьте это слово в отношении лисп - тут их просто нет. Mapcar получил АРГУМЕНТ и ему глубоко плевать как он назывался lst, spisok или еще как - внутри его функции (лямбды в данном случае) его (аргумент) никаким образом не изменить, можете хоть "обприсваиваться".
дык, я именно про это и говорил
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Непонятное поведение цикла по списку

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятное поведение многострочного атрибута блока Нитонисе 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