Содержание


Язык программирования Nimrod

Часть 2. Лексические элементы языка и основные типы данных

Comments

Серия контента:

Этот контент является частью # из серии # статей: Язык программирования Nimrod

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Язык программирования Nimrod

Следите за выходом новых статей этой серии.

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

Nimrod, как и другие языки программирования, для построения исходного кода программ использует разнообразные лексические элементы: ключевые слова языка, идентификаторы, операторы, строковые и символьные литералы, комментарии, некоторые знаки препинания. Следует также сразу отметить, что Nimrod поддерживает только кодировку UTF-8 (и соответственно её подмножество ASCII) при создании файлов исходного кода. Другие кодировки не поддерживаются.

1. Предварительные замечания

В большинстве языков программирования, и Nimrod не является исключением, переменная служит обозначением или именем для определённой ячейки памяти или непрерывной последовательности ячеек памяти. Особенностью Nimrod является то, что типы данных переменной и соответствующей области памяти не всегда могут совпадать. Тип данных переменной обозначается термином "статический тип" (static type), а тип данных области памяти имеет название "динамический тип" (dynamic type). Если статический тип не совпадает с динамическим типом, то он является супертипом или подтипом этого динамического типа.

Выражение (expression) производит вычисления, результатом которых может быть значение (value) или область памяти (location). Выражение, при вычислении выдающее область памяти, классифицируется как l-значение (l-value), то есть значение, которое может находиться в левой части любого вычисляемого выражения. Каждое l-значение может указывать либо на саму область памяти, либо на содержащееся в ней значение, в зависимости от текущего контекста. Выражения, значения которых могут быть определены статически, называются константными выражениями или просто константами. Очевидно, что константы не могут быть l-значениями ни при каких условиях.

Идентификатор (identifier) - это символ, объявленный как имя переменной, процедуры, типа данных и т.п. Объявляемые в программе идентификаторы имеют собственную область видимости, то есть фрагмент программы, в которой применимо то или иное конкретное объявление. Следует обратить внимание на то, что области видимости могут быть вложенными, и семантическое значение идентификатора определяется наименьшей областью видимости, в которой он был определён.

Nimrod является языком, нечувствительным к регистру символов, более того, он игнорирует символы подчёркивания в идентификаторах. Таким образом, big_red_button и BigRedButton представляют собой один и тот же идентификатор. По утверждению автора языка эта особенность позволяет использовать исходные коды других программистов, не заботясь о приведении в соответствие стилей именования переменных, а кроме того, освобождает от необходимости запоминать точное написание идентификаторов (RPChandler, RpcHandler и RPC_handler в любом случае будут интерпретированы одинаково). Вообще говоря, рекомендуется использовать для идентификаторов так называемый стиль CamelCase (RpcHandler, BigRedButton) и полностью отказаться от символов подчёркивания.

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

2. Строковые и символьные литералы

Строковые литералы записываются в двойных кавычках:

"Для продолжения нажмите любую клавишу"

В обычных строковых литералах могут содержаться escape-последовательности, перечисленные в листинге 1.

Листинг 1. Escape-последовательности, допустимые в строковых литералах
\n    переход на новую строку
\r,\c возврат к началу текущей строки
\t    символ горизонтальной табуляции
\v    символ вертикальной табуляции
\\    обратный слэш
\"    двойная кавычка
\'    апостроф
\0-9  непрерывная последовательность десятеричных цифр, представляющих числовое значение
\a    звуковой сигнал
\b    удаление предыдущего символа
\e    сам символ Escape [ESC]
\xHH  шестнадцатеричное числовое значение HH 
(обязательно должны быть указаны только две шестнадцатеричные цифры)

Строки в Nimrod могут содержать любые числовые (в том числе и 8-битовые) значения, даже нулевые (\0), но при этом следует иметь в виду, что при выполнении некоторых операций первое же встретившееся нулевое значение может быть интерпретировано, как символ завершения строки.

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

Таким образом, строку

"Надпись сообщает:\n\"Для продолжения нажмите любую клавишу\""

можно было бы записать и так:

"""Надпись сообщает:
"Для продолжения нажмите любую клавишу""""

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

Кроме перечисленных выше, в Nimrod существуют ещё и так называемые необрабатываемые строковые литералы (raw string literals). Для них указывается префикс r (или R) перед открывающей двойной кавычкой. В необрабатываемых строках не интерпретируются escape-последовательности, то есть такие строки при любых операциях всегда остаются в своём исходном виде. Это особенно полезно при работе с регулярными выражениями или при обращении к файлам, расположенным на Windows-системах, например:

var fn = openFile(r"C:\all_docs\texts\names.txt")

В данном примере строковый литерал передаётся в процедуру openFile без изменений, "как есть", благодаря применению r-формата записи. В обычной строке были бы обнаружены escape-последовательности \a, \t, \n и интерпретированы как звуковой сигнал, символ табуляции и переход на новую строку соответственно, что совершенно неприемлемо в рассматриваемом случае. Разумеется, задачу можно решить и с помощью обычной строки:

var fn = openFile("C:\\all_docs\\texts\\names.txt")

но в r-форме такие строки смотрятся более естественным образом и легче читаются.

Если в необрабатываемом строковом литерале должны содержаться символы кавычек, то они просто дублируются:

r"Статья ""Расходы""" => Статья "Расходы"

Символьные литералы записываются в одиночных кавычках и могут содержать обычные алфавитные, цифровые символы и те же самые escape-последовательности, которые были перечислены для строк, с одним исключением: escape-последовательность \n не разрешается записывать как символ, поскольку она может состоять из более, чем одного символа (например, из пары символов CR+LF). Причём в терминологии языка Nimrod "символ" означает не Unicode-символ, а байт. Такое решение принято по соображениям повышения эффективности.

3. Числовые значения

Числовые литералы записываются также, как в большинстве других языков программирования, но в Nimrod предусмотрено небольшое расширение: в длинные числа для удобства чтения можно включать символы подчёркивания: 1_000_000_000. Числовые литералы, содержащие десятичную точку или символ 'e'('E'), считаются числами с плавающей точкой. Шестнадцатеричные литералы предваряются префиксом 0x (0xA5F0), бинарные - префиксом 0b (0b11010101), а восьмеричные - префиксом 0o (0o177777). Один символ "нуль" в начале числа не является признаком восьмеричного числа и просто игнорируется.

4. Ключевое слово var

С помощью ключевого слова var объявляются новые локальные или глобальные переменные:

var base, count: int

Можно размещать объявления переменных на отдельных строках, следующих после строки с ключевым словом var, создавая таким образом специальные блоки объявления переменных. Каждая строка с объявлением переменных должна содержать начальные отступы (пробелы) в соответствии с грамматическими правилами Nimrod, как показано в листинге 2.

Листинг 2. Блок объявления переменных
var
  base, count: int
  name, title, dept: string
  distance, angle: float

5. Оператор присваивания

Оператор присваивания, обозначаемый знаком равенства (=), выполняет операцию присваивания нового значения переменной (или, если говорить в более обобщённом смысле, ячейке или группе ячеек памяти):

var name = "Сергей"
name = "Александр"

При объявлении новой переменной name ей сразу присваивается значение, затем в следующей строке этой переменной присваивается новое значение.

Оператор присваивания нельзя перегрузить, заместить или запретить, хотя в следующих версиях языка эти возможности будут рассматриваться.

6. Константы

Константами называются символы, связанные с определённым значением, которое не может быть изменено. При объявлении константы ей должно быть присвоено значение, вычисляемое во время компиляции:

const title = "Глава"

Константы могут определяться блоками также, как рассмотренные выше обычные переменные. Запись блоков констант подчиняется аналогичным грамматическим требованиям, как показано в листинге 3.

Листинг 3. Определение констант
const
  base = 20
  step = 5
  start = base + step

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

7. Ключевое слово let

Ключевое слово let позволяет создавать новые переменные аналогично ключевому слову var, но в данном случае созданные символы становятся переменными с возможностью только однократного присваивания, и после инициализации изменять их значение уже нельзя. Если создать переменную

let name = "Игорь"

то следующее присваивание будет недопустимым и приведёт к ошибке:

name = "Андрей"

Различие между let и const заключается в следующем: let создаёт и инициализирует переменную, которой нельзя присвоить другое значение, а const буквально означает "вычислить значение во время компиляции и поместить его в секцию данных (data section)". Таким образом, выражение

const input = readLine(stdin)

является некорректным, а выражение

let input = readLine(stdin)

будет нормально работать.

Заключение

В данной статье рассматривались лексические элементы и основные типы данных (в общих чертах) языка программирования Nimrod.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Linux
ArticleID=855832
ArticleTitle=Язык программирования Nimrod: Часть 2. Лексические элементы языка и основные типы данных
publish-date=01222013