|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
25.03.2012, 09:42 | #1 | |
Непонятное поведение цикла по списку
Регистрация: 22.01.2010
Сообщений: 311
|
||
Просмотров: 7196
|
|
||||
Регистрация: 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,840
|
Список не изменяемая структура - он не может на одном шаге выглядеть так, а на другом этак - если списки отличаються значит они РАЗНЫЕ (просто в Вашем случае Вы разным спискам присваиваете одинаковые имена) - то как Вы пытаетесь сделать "не кашерно" с точки зрения лиспа - Вам два примера уже дали вчетверо короче чем Ваш - а Вы все пытаетесь "блох" выловить.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Вам бы неплохо понять почему оно такое. В вашем примере выдает ровно то, что Вы просите, посмотрите внимательней.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
|
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Список НИКАК НЕВОЗМОЖНО изменить, все далее следствие непонимания этого.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Тут вернее сказать могут, но не желательны - чтоб не путаться кто где.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833
|
Тогда переведи для сирых - что делает subst?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
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,840
|
По "нашему" в этом коде вы трижды переопределяете переменную lst. Offtop: и сейчас полетят тухлые помидоры А по моему SETQ в автолиспе это "злейшие зло" благодаря которому все как-бы "упрощают" задачу, но тем самым закрывая самому себе дорогу понимания к ОСНОВАМ лиспа.
з.ы. Без присваивания (setq) конечно не возможны глобальные переменные и есть еще пара "узких" мест (по сути тоже возможны, но тут дело выходит за рамки "модели" автолиспа), но "втыкать" ее везде и всюду - ИХМО признак плохого тона и как минимум нечитаемости, "уязвимости" (когда без отладчика хрен поймешь что тут где) кода. з.з.ы. To Gomer по моему ВАЖНО понимать разницу между изменением переменной lst и переопределением (ведь она по сути тоже неизменна).
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Если Вы, например, двух своих сыновей (дочерей) двойняшек одинаковыми именами назовете - измениться ли у Вас количество детей?? Но с обращением к ним у Вас возникнут некоторые проблемы. Если делать аналогию с классическим (императивным) представлением в программировании, то lst это ссылка на список, а не изменяем он для того, чтоб не было разницы между ссылкой и содержимым (сколько-бы "копий" этого списка мы не создали - физически это одни и те-же данные). Переоперделить данные мы можем локально ((lambda (lst) (здесь уже другой lst)) '(1 2 3)), это же не значит что мы локально "изменили" список.
В автолиспе ИЗМЕНИТЬ мы можем, например, свойства объекта (entmod или vla-put), сама объектная (и DXF) модель разработанна под императивное программирование (имеет изменяемые состояния) - из за чего при обращении (изменении) к последней необходимо вводить vla-startundomark и учитывать в каком "состоянии" она находиться (но есть конечно и плюсы от этого подхода).
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 26.03.2012 в 09:00. |
|||
|
Опции темы | Поиск в этой теме |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Непонятное поведение многострочного атрибута блока | Нитонисе | 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 |