Значок (язык программирования)

редактировать
Значок
Panorama Icon logo Mondadori.png
Парадигма мультипарадигма : структурированный, текст -ориентированный
Разработан Ральфом Грисволдом
Впервые появился1977; 43 года назад (1977 г.)
Стабильный выпуск 9.5.1 / 27 сентября 2018 г.; 2 года назад (27.09.2018)
Дисциплина набора текста динамический
Веб-сайтwww.cs.arizona.edu / icon
Основные реализации
Icon, Jcon
Диалекты
Unicon
Под влиянием
SNOBOL, SL5, ALGOL
Под влиянием
Unicon, Python, Goaldi

Icon - это язык программирования очень высокого уровня с множеством возможностей для управления строками и текстовыми шаблонами. Это связано с SNOBOL и SL5, языками обработки строк. Icon не является объектно-ориентированным, но объектно-ориентированное расширение под названием Idol было разработано в 1996 году, которое в конечном итоге стало Unicon.

Содержание
  • 1 Базовый синтаксис
  • 2 Целенаправленное выполнение
  • 3 Генераторы
  • 4 Строки
  • 5 Другие структуры
  • 6 Сканирование строк
  • 7 См. Также
  • 8 Ссылки
  • 9 Внешние ссылки
Базовый синтаксис

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

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

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

процедура doSomething (aString) write (aString) end
Целенаправленное выполнение

Одна из ключевых концепций Icon заключается в том, что управляющие структуры основаны на «успехе» или «неудаче» выражений, а скорее чем на логической логике, как в большинстве других языков программирования. Эта функция происходит непосредственно от SNOBOL, в котором любая операция сопоставления с образцом и / или замены может сопровождаться условиями успеха и / или неудачи, в которых указывается метка оператора, на которую следует выполнить разветвление при требуемом условии. В рамках целевой модели ветвления простое сравнение, например if a < b does not mean, "if the operations to the right evaluate to true" as they would under most languages; instead, it means something more like, "if the operations to the right succeed". In this case the < operator succeeds if the comparison is true, so the end result is the same. In addition, the < operator returns its second argument if it succeeds, allowing things like if a < b < c, a common type of comparison that in most languages must be written as a conjunction of two inequalities like if (значок < b) (b < c).

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

если a: = read (), то write (a)

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

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

при записи (read ())

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

попробуйте {while ((a = read ())! = EOF) {write (a); }} catch (Exception e) {// ничего не делаем, выходим из цикла}

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

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

Генераторы

Выражения в Icon часто возвращают одно значение, например, x < 5 will evaluate and succeed if the value of x is less than 5, or else fail. However, many expressions do not immediately return success or failure, returning values in the meantime. This drives the examples with every и to; every заставляет продолжать возвращать значения до тех пор, пока не произойдет сбой.

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

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

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

1 | "привет" | x < 5

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

, если y < (x | 5) then write("y=", y)

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

write ("y =", (x | 5)>y)

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

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

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

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

i = indexOf («the», s, 5)

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

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

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

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

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

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

write (5 < find("the", s))

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

write (find ("the", s)>5)

, то вместо результат find.

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

каждые k: = от i до j записывать (someFunction (k))

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

каждая запись (someFunction (i to j))

Могут быть определены генераторы как процесс edures с использованием ключевого слова suspend:

procedure findOnlyOdd (pattern, theString) every i: = find (pattern, theString) do if i% 2 = 1 then suspend i end

В этом примере выполняется цикл по строке с помощью find искать выкройку. Когда он найден, а позиция нечетная, местоположение возвращается из функции с suspend. В отличие от return, suspend запоминает состояние генератора, позволяя ему продолжить с того места, где он остановился, на следующей итерации.

Строки

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

s? write (find ("the"))

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

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

. Например,

"Wikipedia" [1] ==>"W" "Wikipedia "[3] ==>" k "" Википедия "[0] ==>" a "" Википедия "[1: 3] ==>" Wi "" Википедия "[- 2: 0] ==>" ia "" Wikipedia "[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" индексы следующие: 1A2B3C4D5E6F7G8. Срез s [3: 5] - это строка между индексами 3 и 5, которая является строкой «CD».

Другие структуры

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

aCat: = ["muffins", "tabby", 2002, 8]

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

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

. Синтаксис bang перечисляет диапазон. Например, при каждой записи (! ACat) будет выводиться четыре строки, каждая с одним элементом.

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

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

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

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

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

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

Например,

s: = "это строка" s? write ("subject = [", subject, "] pos = [", pos, "]")

выдаст

subject = [это строка] pos = [1]

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

s: = "это строка" s? {# Установить среду сканирования строк, но не pos (0) do {# Проверить конец строки tab (many ('')) # Пропустить любые пробелы word: = tab (upto ('') | 0) # следующее слово до следующего пробела -или- конец строки write (word) # write the word}}

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

procedure main () s: = "Mon Dec 8" s? write (Mdate () | "not a valid date") end # Определить функцию сопоставления, которая возвращает # строку, которая соответствует дню месяц dayofmonth procedure Mdate () # Определите некоторые начальные значения статические даты static days initial {days: = [" Пн »,« Вт »,« Ср »,« Чт »,« Пт »,« Сб »,« Вс »] даты: = [« Янв »,« Фев »,« Мар »,« Апр »,« Май », «Июн», «июл», «август», «сен», «октябрь», «ноя», «декабрь»]} каждую приостановку (retval <- tab(match(!days)) || # Match a day =" " || # Followed by a blank tab(match(!dates)) || # Followed by the month =" " || # Followed by a blank matchdigits(2) # Followed by at least 2 digits) (=" " | pos(0)) # Either a blank or the end of the string retval # And finally return the string end # Matching function that returns a string of n digits procedure matchdigits(n) suspend (v := tab(many(digits)) *v <= n) v end

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

См. также
Ссылки

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

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

Внешние ссылки
В Викиучебнике есть книга по тема: Программирование иконок
Последняя правка сделана 2021-05-23 10:19:27
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте