Значок (язык программирования) - Википедия - Icon (programming language)

Значок
Панорама Иконка логотип Mondadori.png
Парадигмамультипарадигма: структурированный, ориентированный на текст
РазработаноРальф Грисволд
Впервые появился1977; 43 года назад (1977)
Стабильный выпуск
9.5.1 / 27 сентября 2018 г.; 2 года назад (2018-09-27)
Печатная дисциплинадинамичный
Интернет сайтwww.cs.Аризона.edu/значок
Основной реализации
Значок, Jcon
Диалекты
Юникон
Под влиянием
СНОБОЛ, SL5, АЛГОЛ
Под влиянием
Юникон, Python, Goaldi

Значок это язык программирования очень высокого уровня с участием целенаправленное исполнение и множество средств для управления струны и текстовые шаблоны. Это связано с СНОБОЛ и SL5, языки обработки строк. Иконка не объектно-ориентированный, но в 1996 году было разработано объектно-ориентированное расширение Idol, которое в конечном итоге стало Юникон.

Базовый синтаксис

Язык иконок происходит от АЛГОЛ -класс структурное программирование языков и, следовательно, имеет синтаксис, аналогичный C или же Паскаль. Icon больше всего похож на Pascal, используя := синтаксис для присвоений, процедура ключевое слово и аналогичный синтаксис. С другой стороны, Icon использует скобки в стиле C для структурирования групп выполнения, и программы запускаются с запуска процедуры, называемой главный.

Во многих отношениях Icon также разделяет функции с большинством языки сценариев (а также СНОБОЛ и SL5, из которого они были взяты): переменные не нужно объявлять, типы приводятся автоматически, а числа можно автоматически преобразовывать в строки и обратно. Другой особенностью, общей для многих языков сценариев, но не для всех, является отсутствие символа окончания строки; в Icon, строки, не заканчивающиеся точкой с запятой, заканчиваются подразумеваемой точкой с запятой, если это имеет смысл.

Процедуры - это основные строительные блоки программ Icon. Хотя они используют именование Pascal, они работают больше как функции C и могут возвращать значения; здесь нет функция ключевое слово в Icon.

 процедура сделай что-нибудь(строка)   записывать(строка) конец

Целенаправленное исполнение

Одна из ключевых концепций Icon заключается в том, что управляющие структуры основаны на «успехе» или «неудаче» выражений, а не на логической логике, как в большинстве других языков программирования. Эта функция происходит непосредственно от SNOBOL, в котором любая операция сопоставления с образцом и / или замены может сопровождаться условиями успеха и / или неудачи, в которых указывается метка оператора, на которую необходимо выполнить переход при требуемом условии. В рамках целевой модели ветвления простое сравнение, например если a не означает, «если операции справа оцениваются как истинные», как это было бы в большинстве языков; вместо этого это означает что-то вроде "если операции справа преуспевать". В этом случае оператор <завершается успешно, если сравнение истинно, поэтому конечный результат будет таким же. Кроме того, оператор <возвращает свой второй аргумент в случае успеха, допуская такие вещи, как если a , распространенный тип сравнения, который в большинстве языков должен быть записан как соединение двух неравенств, например если (a .

Icon использует успех или неудачу для всего управления потоком, поэтому этот простой код:

если а := читать() тогда записывать(а)

скопирует одну строку стандартный ввод на стандартный вывод. Он будет работать, даже если read () вызовет ошибку, например, если файл не существует. В этом случае заявление a: = читать () выйдет из строя, а писать просто не назовется.

Успех и неудача передаются «наверх» через функции, что означает, что неудача внутри вложенная функция также вызовет сбой вызывающих его функций. Например, вот программа, которая копирует весь файл:

пока записывать(читать())

Когда команда read () дает сбой, например, в конце файла, сбой будет передан вверх по цепочке вызовов, и write () также завершится с ошибкой. В то время как структура управления останавливается на неудаче. Аналогичный пример, написанный на псевдокод (с использованием синтаксиса, близкого к Ява ):

 пытаться {   пока ((а = читать()) != EOF) {     записывать(а);   } } ловить (Исключение е) {   // ничего не делаем, выходим из цикла }

В этом случае требуется два сравнения: одно для конца файла (EOF), а другое для всех других ошибок. Поскольку Java не позволяет сравнивать исключения как логические элементы, как в случае с Icon, длинный попробуй поймать вместо этого должен использоваться синтаксис. Блоки try также приводят к снижению производительности, даже если исключение не генерируется, распределенная стоимость этот Icon избегает.

Значок обозначает это понятие как целенаправленное исполнение, имея в виду способ продолжения выполнения до достижения определенной цели. В приведенном выше примере цель - прочитать весь файл; команда чтения завершается успешно, когда информация была прочитана, и терпит неудачу, если нет. Таким образом, цель кодируется непосредственно на языке, а не путем проверки кодов возврата или аналогичных конструкций.

Генераторы

Выражения в Icon часто возвращают одно значение, например, х <5 выполнит оценку и завершится успешно, если значение x меньше 5, или потерпит неудачу. Однако многие выражения не немедленно вернуть успех или неудачу, возвращая тем временем значения. Это приводит примеры с каждый и к; каждый причины к чтобы продолжать возвращать значения, пока не произойдет сбой.

Это ключевая концепция Icon, известная как генераторы. Генераторы управляют большей частью функциональных возможностей цикла в языке, но без необходимости в явном цикле, сравнивающем значения на каждой итерации.

Выражаясь языком Icon, оценка выражения или функции дает последовательность результатов. Результирующая последовательность содержит все возможные значения, которые могут быть сгенерированы выражением или функцией. Когда последовательность результатов исчерпана, выражение или функция не выполняется. Итерация по последовательности результатов достигается либо неявно с помощью целевой оценки Icon, либо явно с помощью каждый пункт.

Icon включает в себя несколько генераторов-строителей. В генератор синтаксис позволяет последовательно сгенерировать серию элементов, пока один из них не выйдет из строя:

 1 | "Привет" | Икс < 5

может генерировать «1», «привет» и «5», если x меньше 5. Генераторы во многих случаях могут читаться как «или», например:

 если у < (Икс | 5) тогда записывать("y =", у)

запишет значение y, если оно меньше x или же 5. Внутренне Icon проверяет каждое значение слева направо, пока одно из них не будет успешным или список не опустеет, и возвращает ошибку. Функции не будут вызываться, если оценка их параметров не будет успешной, поэтому этот пример можно сократить до:

 записывать("y =", (Икс | 5) > у)

Другой простой генератор - это к, который генерирует списки целых чисел; каждая запись (от 1 до 10) позвоню записывать() десять раз. В взрыва синтаксис генерирует каждый элемент списка; каждая запись (! aString) выведет каждый символ aString в новую строку.

Эта концепция очень эффективна для строковых операций. В большинстве языков есть функция, известная как найти или же индекс который возвращает расположение одной строки в другой. Например:

 s = «Весь мир - сцена. И все мужчины и женщины - просто игроки»; я = индекс("the", s)

Этот код вернет 4, позицию первого вхождения слова «the» (при условии, что индексы начинаются с 0). Чтобы получить следующий экземпляр "the", необходимо использовать альтернативную форму,

 я = индекс("the", s, 5)

5 в конце говорит, что он должен смотреть с позиции 5 и далее. Итак, чтобы извлечь все вхождения «the», необходимо использовать цикл:

 s = «Весь мир - сцена. И все мужчины и женщины - просто игроки»; я = индекс("the", s) пока я != -1 {   записывать(я);   я =  индекс("the", s, я+1); }

Под значком найти Функция является генератором и будет возвращать следующий экземпляр строки каждый раз, когда она возобновляется, прежде чем завершится ошибкой, когда она достигнет конца строки. Такой же код можно написать:

 s := «Весь мир - сцена. И все мужчины и женщины - просто игроки» каждый записывать(найти("the", s))

найти будет возвращать индекс следующего экземпляра "the" каждый раз, когда он возобновляется каждый, в конечном итоге достигнув конца строки и потерпев неудачу.

Конечно, бывают случаи, когда нужно найти строку после некоторой точки ввода, например, при сканировании текстового файла, содержащего данные в нескольких столбцах. Здесь также работает целевое исполнение:

 записывать(5 < найти("the", s))

Позиция будет возвращена, только если "the" появится после позиции 5; в противном случае сравнение не удастся. Успешные сравнения возвращают результат справа, поэтому важно поместить результат сравнения в правую часть сравнения. Если бы было написано:

 записывать(найти("the", s) > 5)

тогда вместо результата найти.

Icon добавляет несколько структур управления для циклического прохождения генераторов. В каждый оператор похож на пока, перебирая каждый элемент, возвращаемый генератором, и завершается в случае сбоя:

  каждый k := я к j делать   записывать(некоторая функция(k))

пока переоценивает первый результат, тогда как каждый дает все результаты. каждый синтаксис фактически вводит значения в функцию аналогично блокам в Болтовня. Например, приведенный выше цикл можно переписать так:

 каждый записывать(некоторая функция(я к j))

Генераторы можно определить как процедуры, использующие приостановить ключевое слово:

 процедура findOnlyOdd(шаблон, Струна)   каждый я := найти(шаблон, Струна) делать     если я % 2 = 1 тогда приостановить я конец

Этот пример повторяется Струна используя find для поиска шаблон. Когда он найден, а позиция нечетная, местоположение возвращается из функции с приостановить. В отличие от возвращаться, приостановить запоминает состояние генератора, позволяя ему продолжить с того места, где он остановился, на следующей итерации.

Струны

Icon имеет функции, упрощающие работу со строками. В сканирование система многократно вызывает функции со строкой:

s ? записывать(найти("the"))

это краткая форма примеров, показанных ранее. В этом случае предмет из найти Функция помещается вне параметров перед вопросительным знаком. Сигнатуры функции значка идентифицируют параметр объекта, чтобы его можно было поднять таким образом.

Подстроки можно извлечь из строки, используя спецификацию диапазона в скобках. Спецификация диапазона может возвращать точку на один символ или фрагмент строки. Строки можно индексировать как справа, так и слева. Позиции в строке определяются как между персонажи 1А2B3C4 и может быть указан справа −3А−2B−1C0

Например,

 «Википедия»[1]     ==> "W" «Википедия»[3]     ==> "к" «Википедия»[0]     ==> "а" «Википедия»[1:3]   ==> "Wi" «Википедия»[-2:0]  ==> "я" «Википедия»[2+:3]  ==> "iki"

Где в последнем примере показано использование длины вместо конечной позиции

Спецификацию нижних индексов можно использовать как lvalue внутри выражения. Это можно использовать для вставки строк в другую строку или удаления частей строки. Например,

    s := "abc"    s[2] := "123"    s сейчас же имеет а ценить из "a123c"    s := "abcdefg"    s[3:5] := "ABCD"    s сейчас же имеет а ценить из "abABCDefg"    s := "abcdefg"    s[3:5] := ""    s сейчас же имеет а ценить из "abefg"

Индексы нижнего индекса значка находятся между элементами. Для строки s: = "ABCDEFG" индексы следующие: 1А2B3C4D5E6F7грамм8. Срез s [3: 5] - это строка между индексами 3 и 5, которая является строкой «CD».

Другие конструкции

Icon также имеет синтаксис для построения списков (или массивы):

кошка := ["кексы", "полосатый", 2002, 8]

Элементы в списке могут быть любого типа, включая другие структуры. Для создания более крупных списков Icon включаетсписок генератор; {{{1}}} генерирует список, содержащий 10 копий слова.

Как и массивы на других языках, Icon позволяет искать элементы по позиции, например, {{{1}}}. Как и в случае со строками, индексы находятся между элементами, и фрагмент списка можно получить, указав диапазон, например, aCat [2: 4] составляет список ["полосатый", 2002]. В отличие от строк, фрагмент массива не является lvalue.

В взрыва-синтаксис перечисляет диапазон. Например, каждая запись (! aCat) распечатает четыре строки, каждая с одним элементом.

Значок включает в себя функции, подобные стеку, толкать и поп чтобы позволить массивам формировать базы стеков и очередей.

Icon также включает функции для наборов и ассоциативных массивов с столы:

 символы := стол(0) символы["там"] := 1 символы["здесь"] := 2

Этот код создает таблицу, в которой в качестве значения по умолчанию для любого неизвестного ключа будет использоваться ноль. Затем он добавляет в него два элемента с ключами «там» и «здесь» и значениями 1 и 2.

Сканирование строк

Одна из мощных функций Icon - сканирование строк. Оператор строки сканирования, ?, сохраняет текущую среду сканирования строк и создает новую среду сканирования строк. Среда сканирования строк состоит из двух ключевых слов: &предмет и & pos, где & subject - сканируемая строка, а & pos - курсор или текущая позиция в строке темы.

Например,

  s := "это строка"  s ? записывать("subject = [",&предмет,"] pos = [",& pos,"]")

произвел бы

предмет=[это является а нить] позиция=[1]

Для перемещения по сканируемой строке можно использовать встроенные и определяемые пользователем функции. Многие из встроенных функций по умолчанию будут & subject и & pos (например, найти функция). Следующее, например, запишет все «слова», разделенные пробелами, в строку.

  s := "это строка"  s ? {                               # Установить среду сканирования строк      пока нет позиция(0) делать  {          # Тест на конец строки          вкладка(много(' '))              # Пропустить любые пробелы          слово := вкладка(вплоть до(' ') | 0)  # следующее слово до следующего пробела -или- до конца строки          записывать(слово)                 # напишите слово      }  }

Более сложный пример демонстрирует интеграцию генераторов и сканирования строк в языке.

 процедура главный()     s := «Пн, 8 декабря»     s ? записывать(Мдате() | "недействительная дата") конец # Определить функцию сопоставления, которая возвращает # строка, соответствующая дню месяц dayofmonth процедура Мдате() # Определить некоторые начальные значения статический даты статический дней исходный {        дней := [«Пн»,"Вт","Мы бы","Thr",«Пт»,"Сидел","Солнце"]        даты := ["Ян",«Фев»,"Мар",«Апр»,"Май",«Джун»,                  "Июл",«Авг»,«Сен»,«Октябрь»,«Ноя»,«Декабрь»] } каждый приостановить   (Retval <-  вкладка(матч(!дней)) ||     # Матч в день                             =" " ||                  # Далее следует пробел                             вкладка(матч(!даты)) ||    # Затем следует месяц                             =" " ||                  # Далее следует пробел                             цифры(2)           # За которым следует не менее 2 цифр                 ) &                 (=" " | позиция(0) ) &                   # Либо пробел, либо конец строки                 Retval                               # И наконец возвращаем строку конец # Функция сопоставления, которая возвращает строку из n цифр процедура цифры(п)     приостановить (v := вкладка(много(& цифры)) & *v <= п) & v конец

Идиома expr1 & выражение2 & выражение3 возвращает значение последнего выражения.

Смотрите также

Рекомендации

Окончательная работа Язык программирования иконок (третье издание) Гризвольда и Грисволда, ISBN  1-57398-001-3. Это не издается, но может быть скачано как PDF.

Icon также имеет ко-выражения, обеспечивающие нелокальные выходы для выполнения программы. Видеть Язык программирования иконок а также статью Шамима Мохамеда Ко-выражения в Icon.

внешняя ссылка