LISP. Функция /=
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

LISP. Функция /=

Ответ
Поиск в этой теме
Непрочитано 30.06.2011, 10:58 #1
LISP. Функция /=
Do$
 
AutoCAD/Civil3D LISP/C#
 
Санкт-Петербург
Регистрация: 15.08.2008
Сообщений: 1,701

Всегда считал, что если хотя бы один из аргументов этой функции не равен остальным, то она возвращает T. То есть, (/= a b c) то же самое, что (not (= a b c)) На деле оказалось, что это не так:
Код:
[Выделить все]
(/= 5 3 6 6)
(= 5 3 6 6)
(not (= 5 3 6 6))
->
nil 
nil 
T
Получается, что если хотя бы два аргумента функции /= оказались равны, то она возвращает nil. Это баг последних версий или так всегда было?
Просмотров: 3698
 
Непрочитано 30.06.2011, 11:14
#2
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Do$, по ходу так было всегда
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 127
Размер:	65.7 Кб
ID:	62303  
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 30.06.2011, 11:32
#3
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Тогда почему в примерах в этой статье четвертое сверху выражение возвращает T?
Новые наблюдения (просто менял местами аргументы):
Код:
[Выделить все]
(/= "AP8" "Ap8" "AP8")
(/= "AP8" "AP8" "Ap8")
(/= 5 6 5)
(/= 5 5 6)
->
T 
nil 
T 
nil
Получается, что если рядом стоят одинаковые аргументы - то возвращается nil, если не рядом - то T. Мне кажется, что тут какой-то глюк.
Do$ вне форума  
 
Непрочитано 30.06.2011, 11:45
#4
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Do$, прочитал справку по VisualLisp. Это не глюк, просто проверка идет по-парно, т. е. 1 агрумент со 2, 2 с 3 и т.д.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 88
Размер:	44.4 Кб
ID:	62308  
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 30.06.2011, 12:09
#5
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Что-то они намудрили... Ума не приложу, где можно такую функцию использовать.
Do$ вне форума  
 
Непрочитано 30.06.2011, 12:17
#6
Дима_

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Что-то они намудрили... Ума не приложу, где можно такую функцию использовать.
Для "разношерстных" (содержащие различные типы данных) списков.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 30.06.2011, 12:59
#7
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Do$ Посмотреть сообщение
Что-то они намудрили... Ума не приложу, где можно такую функцию использовать.
Do$, ну просто в обычном понимании будем использовать (not (= a b c)), а для /= придумал такой пример (может глупо конечно, тогда поправте)
Код:
[Выделить все]
 
; пусть lst1 lst2 списки вершин полилиний
_$ lst1 lst2
((0 0) (10 20) (10 20) (40 50) (70 10))
((0 0) (10 20) (15 20) (40 50) (10 20))
; определить есть ли сегменты нулевой длины (для lst1 очевидно есть 2-я и 3-я вершина дублируется, 
; а у lst2, хоть и есть одинаковые вершины 2-я и 5-я, но это просто самопересекающаяся полилиния), тогда
_$ (apply 'or (apply 'mapcar (cons '/= lst1)))
nil
_$ (apply 'or (apply 'mapcar (cons '/= lst2)))
T
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 30.06.2011, 14:44
#8
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Код и для такого списка выдаст nil: ((10 0) (10 20) (0 20) (40 50) (70 10)).
Я лично реальное применение функции /= вижу только в использовании с 2-мя аргументами, чтобы заменить две функции not и =.
Do$ вне форума  
 
Непрочитано 30.06.2011, 21:21
#9
Li6-D


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


У Полещука эта функция описана некорректно.
На самом деле, если в списке аргументов нет двух одинаковых соседних элементов возвращается T, иначе - nil. В самых ранних версиях AutoLisp у функции "/=" было только 2 аргумента.
В справке написано, что поведение этой функции в других диалектах Lisp вполне "традиционное" т.е. соответствует* комбинации функций
Код:
[Выделить все]
(not (= <аргумент1> [<аргумент2> ... [<аргументN>]...]))
А пример, который привел TararykovDG можно чуть изменить и использовать для проверки отсутствия в полилинии горизонтальных или вертикальных отрезков**:
Код:
[Выделить все]
(apply 'and (apply 'mapcar (cons '/= lst)))
Примечания:
*когда больше одного аргумента.
**когда точки списка lst не имеют координаты z.
Li6-D вне форума  
 
Непрочитано 08.07.2011, 21:47
#10
Li6-D


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Я лично реальное применение функции /= вижу только в использовании с 2-мя аргументами, чтобы заменить две функции not и =.
Пример использования функции /= с 3-мя аргументами.
Выражение предлагает пользователю решить дилемму Гамлета из трагедии Шекспира
Код:
[Выделить все]
((lambda (/ ?)
   (while (/= "БЫТЬ"
               (setq ? (strcase (getstring t "\nБыть или не быть, вот в чем вопрос: ")))
              "НЕ БЫТЬ"
          )
     (princ "Не мямли юзер, четко отвечай!")
   )
   ?
))
Li6-D вне форума  
 
Непрочитано 09.07.2011, 01:28
#11
gomer

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


Цитата:
Сообщение от Li6-D Посмотреть сообщение
Пример использования функции /= с 3-мя аргументами.
Выражение предлагает пользователю решить дилемму Гамлета из трагедии Шекспира
В нашем неоднозначном мире гораздо более полезна функция member
gomer вне форума  
 
Автор темы   Непрочитано 11.07.2011, 10:06
#12
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Li6-D, хороший пример использования
Но учитывая, что
Цитата:
Сообщение от Li6-D Посмотреть сообщение
поведение этой функции в других диалектах Lisp вполне "традиционное"
, я не рискну использовать такие конструкции. Т.к. решит автодеск привести поведение этой функции в соответствие с другими диалектами и вылезет в самый неподходящий момент ошибка.
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Функция /=



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DwgRuLispLib: Функция открытия диалога Open\Save As файла (файлов) Supermax Библиотека функций 20 14.03.2018 10:05
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
Какая LISP функция проверяет чётность/нечётность числа? Владимир Егорьев LISP 5 19.04.2011 21:11
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
структурированный список Holon Программирование 22 11.09.2007 14:09