Шутка с subst
Скорее всего, Америку я не открою, но для меня было полнейшей неожиданностью немного странное поведение subst
Сама по себе функция subst должна выполнять элементарные действия - заменять указанный элемент в списке новым. И почти всегда так и срабатывает.
Проблемы начинаются, если в списке есть повторяющиеся целые числа, и одно из них и надо заменить.
Так, например, есть список:
1 | (setq lst '(5 5 16 28)) |
И надо заменить вторую (и только вторую!) цифру 5 на, например, 46. Что сделает обычный программист? Правильно:
1 | (setq res (subst 46 5 lst)) |
И будет жить долго и счастливо немного обломается:
1 2 | $_ res (46 46 16 28) |
О как! Так что будьте внимательны - лисп, конечно, быстро работает с целыми числами, но не всегда предсказуемо
А разве так не должно работать? Почему непредсказуемо?
https://knowledge.autodesk.com/ru/search-result/caas/CloudHelp/cloudhelp/2016/RUS/AutoCAD-AutoLISP/files/GUID-25214E69-090A-45C3-8210-6D9801255E44-htm.html
"EVERY OCCURRENCE"
Всё правильно он делает. Строго по описанию в AutoLISP Reference Guide:
Searches a list for an old item and returns a copy of the list with a new item substituted in place of EVERY occurrence of the old item.
Ну, да... Но я настолько привык, что меняется именно указанный элемент (второй, шестнадцатый и т.д.), что для меня такое поведение оказалось немного неожиданным