Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Базовый синтаксис [ править ]

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

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

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

 процедура  doSomething ( aString )  write ( aString )  end

Целенаправленное исполнение [ править ]

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

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

если  a  : =  read (),  то  напишите ( a )

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

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

во время  записи ( чтение ())

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

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

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

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

Генераторы [ править ]

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

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

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

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

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

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

 если  y  <  ( x  |  5 ),  то  напишите ( "y =" ,  y )

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

 напишите ( "y =" ,  ( x  |  5 )  >  y )

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

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

 s  =  "Весь мир - сцена. И все мужчины и женщины просто игроки" ;  я  =  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 ))

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

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

тогда вместо результата поиска будет написано «5» .

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

 каждый  к  : =  I  к  J  делать  записи ( SomeFunction ( к ))

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

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

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

 процедура  findOnlyOdd ( pattern ,  theString )  каждый  i  : =  find ( pattern ,  theString )  do  if  i  %  2  =  1  then  suspend  i  end

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

Строки [ править ]

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

с  ?  написать ( найти ( "the" ))

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

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

Например,

 "Википедия" [ 1 ]  ==>  "W"  "Википедия" [ 3 ]  ==>  "k"  "Википедия" [ 0 ]  ==>  "a"  "Википедия" [ 1 : 3 ]  ==>  "Wi"  "Википедия" [ - 2 : 0 ]  ==>  "ia"  "Википедия" [ 2 + : 3 ]  ==>  "iki"

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

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

 s  : =  "ABC"  с [ 2 ]  : =  "123"  ы  Теперь  есть  на  значение  из  "a123c"  s  : =  "ABCDEFG"  с [ 3 : 5 ]  : =  "ABCD"  ы  Теперь  имеет  на  значение  из  "abABCDefg"  s  : =  "ABCDEFG"  с [ 3 : 5 ]  : =  ""  ы  Теперь  есть  на  значение  из  "abefg"

Индексы нижнего индекса значка находятся между элементами. Для строки s: = "ABCDEFG" индексы следующие: 1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 . Срез s [3: 5] - это строка между индексами 3 и 5, которая является строкой «CD».

Другие конструкции [ править ]

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

aCat  : =  [ "маффины" ,  "полосатый" ,  2002 г. ,  стр. 8 ]

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

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

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

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

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

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

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

Сканирование строк [ править ]

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

Например,

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

произвел бы

при условии = [ это  является  строка ] позы = [ 1 ]  

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

 s  : =  "это строка"  s  ?  {  # Создания среды строки сканирования ,  а  не  позиция ( 0 )  делать  {  # Проверка конца строки  вкладки ( много ( «» ))  # Пропустить любые заготовки  слова  : =  вкладка ( Шифрование до ( «» )  |  0 )  # следующего слова до следующего пробела -или- конец строки  write ( word )  # записать слово  }  }

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

 procedure  main ()  s  : =  "Пн, 8 декабря"  s  ?  write ( Mdate ()  |  "not a valid date" )  end  # Определить функцию сопоставления, которая возвращает  # строку, которая соответствует дню месяц dayofmonth  procedure  Mdate ()  # Определите некоторые начальные значения  статические  даты  static  days  initial  {  days  : =  [ " Пн » , « вт » , « ср » , « чт » , « пт » , « сб » ,"Солнце"]  даты  : =  [ «Янв» , «Фев» , «Мар» , «Апр» , «Май» , «Июнь» ,  «Июль» , «Август» , «Сен» , «Октябрь» , «Ноябрь» , « Дек " ]  }  каждую  приостановку  ( retval  <-  tab ( match ( ! Days ))  ||  # Match a day  = " " ||  # Далее следует пустая  вкладка ( совпадение ( !даты ))  ||  # Далее следует месяц  = ""  ||  # За которым следует пробел  matchdigits ( 2 )  # За ними следуют как минимум 2 цифры  )  &  ( = ""  |  pos ( 0 )  )  &  # Либо пробел, либо конец строки  retval  # И, наконец, возвращает  конец  строки # Функция сопоставления который возвращает строку из n цифр  процедура  matchdigits ( n )  suspend  ( v  : =  tab ( many (& цифры ))  &  * v  <=  n )  &  v  конец

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

См. Также [ править ]

  • CLU (язык программирования) Барбары Лисков
  • Сопрограмма

Ссылки [ править ]

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

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

Внешние ссылки [ править ]

  • Домашняя страница значка
  • Устное историческое интервью со Стивеном Уэмплером , Институт Чарльза Бэббиджа , Университет Миннесоты. Уэмплер обсуждает свою работу по разработке языка программирования Icon в конце 1970-х годов в Университете Аризоны под руководством Ральфа Грисволда .
  • Устное интервью истории с Робертом Голдбергом , Институт Чарльза Бэббиджа , Университет Миннесоты. Голдберг обсуждает свое взаимодействие с Ральфом Грисволдом во время работы над языком программирования Icon в классе в Иллинойском технологическом институте .
  • Устное историческое интервью с Кеннетом Уокером , Институт Чарльза Бэббиджа , Университет Миннесоты. Уокер описывает рабочую среду проекта Icon, свое взаимодействие с Ральфом Грисволдом и свою собственную работу над компилятором Icon.
  • Страница языка программирования Icon на сайте проекта задач сравнительного программирования Rosetta Code