Шутка с 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)

О как! Так что будьте внимательны - лисп, конечно, быстро работает с целыми числами, но не всегда предсказуемо ;)



Комментарии

Есть 4 коммент. к “Шутка с subst”
  1. Евгений пишет:

    А разве так не должно работать? Почему непредсказуемо?

  2. Евгений пишет:

    Всё правильно он делает. Строго по описанию в 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.

  3. Кулик Алексей aka kpblc пишет:

    Ну, да... Но я настолько привык, что меняется именно указанный элемент (второй, шестнадцатый и т.д.), что для меня такое поведение оказалось немного неожиданным ;)

Поделитесь своим мнением


Я не робот.