ISWIM


ISWIM (от англ. If you See What I Mean — если вы понимаете, о чём я) — теоретический язык программирования, описанный Питером Лэндином (англ. Peter Landin) в 1966 году[1] как императивный язык с функциональным ядром на основе λ-исчисления с синтаксическим сахаром. Основная особенность — применение для изменяемого состояния, присваивания и механизма управления J-оператора, позволяющего захватывать текущее продолжение. Благодаря λ-исчислению в языке есть функции высшего порядка и переменные с лексической областью видимости.

Операционная семантика ISWIM определяется SECD-машиной (англ. stack, environment, code, dump), и использует вызов по значению, то есть строгое вычисление. Код на языке должен был выглядеть наиболее похожим на математическую нотацию, вследствие чего Лэндин убрал точку с запятой между утверждениями и блоки begin — end, типичные для алголоподобных языков, и заменил их областью видимости, зависимой от выравнивания.

Специфической особенностью в нотации ISWIM является использование where-предложений. Программа на ISWIM — это единственное выражение, ограниченное утверждениями where (вспомогательные определения, включающие в себя отношения между переменными), условными выражениями и определениями функций. ISWIM (вместе с CPL) — первый язык, использующий такую нотацию.

Примечательной семантической чертой была возможность определять новые типы данных, как (потенциально рекурсивную) сумму произведений; для этого использовалось ёмкое описание, довольно сходное с естественными языками, по сути равное алгебраическим типам данных в современных функциональных языках. Переменные в языке не имели явных объявлений типа, это даёт основание считать, что Лэндин планировал язык с динамической типизацией (как Лисп, а не Алгол); возможно, предполагая и некоторую форму вывода типов.

ISWIM так и не был реализован программно, хотя языки PAL Арта Эвана (Art Evan) и Gedanken Джона Рейнолда (John Reynold) использовали большинство ключевых решений языка Лэндина, включая операции передачи управления. Оба эти языка использовали динамическую типизацию. ML Милнера можно считать эквивалентным ISWIM без J-оператора, но обогащённым выводом типов.

Другая линия продолжателей ISWIM избавилась от императивных особенностей — присваивания и J-оператора, — развиваясь как чисто функциональные языки, впоследствии с переключением на ленивые вычисления. Этим путём пошли SASL, Miranda и Haskell.