Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / КМод / simulSqueak.pdf
Скачиваний:
133
Добавлен:
23.02.2015
Размер:
1.24 Mб
Скачать

2.2 Синтаксис языка Smalltalk

Описание синтаксиса языка Smalltalk [2] приводится в стандартной нота­ ции Бэкуса-Наура с использованием следующих метасимволов:

<>

– скобки для обозначения понятия или символа;

|

– разделитель альтернативных вариантов определения;

{ }

– обязательный фрагмент или группа;

[ ]

– факультативный фрагмент или группа;

...

– предыдущее понятие можно повторить любое число раз.

<Цифра> ::= 0|1|2|3|4|5|6|7|8|9 <Последовательность цифр> ::= <Цифра> ...

<Числовое значение> ::= [<Последовательность цифр> r ]

[–] <Последовательность цифр> [.<Последовательность цифр>] е [ – ] <Последовательность цифр>

<Буква> ::= A | ... | Z | a | ... | z

<Специальный знак> ::= +| / | \ | * | ~ | < | > | = | @ | % | ¦ | & | ? | ! <Символ> ::= <Цифра> | <Буква> | <Специальный знак> |

[ | ] | { | } | ( | ) | ^ | , | ; | $ | ! | # | : <Идентификатор> ::= <Буква> [ <Буква> | <Цифра>] ...

<Слово> ::= <Идентификатор> | <Бинарный селектор> | <Ключевое слово> ...

<Словная константа> ::= # <Слово> <Символьная константа> ::= $<Символ> | ' | "

<Последовательность символов> ::= ' [<Символ> | ' ' | " ]... ' <Комментарий> ::= " [<Символ> | " " | ' ]... "

<Массив> ::= ([<Числовое значение> | <Слово> | <Последовательность символов> | <Символьная константа> | <Массив>]...)

<Константа массива> ::= # <Массив> <Константа>::= <Числовое значение> | <Словная константа> | <Символь­

ная константа> | <Последовательность символов> | <Константа массива>

<Переменная> ::= <Идентификатор> <Унарный селектор> ::= <Идентификатор>

<Бинарный селектор> ::= – | <Специальный знак> [<Специальный знак>] <Ключевое слово> ::= <Идентификатор> :

<Первичная форма> ::= <Переменная> | <Константа> | <Блок> | (<Форма>) <Описание унарного объекта> ::= <Первичная форма> | <Унарная форма> <Описание бинарного объекта> ::= <Описание унарного объекта> | <Би­

нарная форма> <Унарная форма> ::= <Описание унарного объекта> <Унарный селектор>

14

<Бинарная форма> ::= <Описание бинарного объекта> <Бинарный селек­ тор> <Описание унарного объекта>

<Форма с ключевыми словами> ::= <Описание бинарного объекта> {<Пер­ вичная форма> <Описание бинарного объекта>}...

<Форма сообщения> ::= <Унарная форма> | <Бинарная форма> | <Форма с ключевыми словами>

<Форма сцепленных сообщений> ::= <Форма сообщения> { ; <Унарный селектор> | <Бинарный селектор> <Описание унарного объекта> | {<Ключевое слово> <Описание бинарного объекта>}...}...

<Форма> ::= [ <Переменная> := ]... {<Первичная форма> | <Форма сообще­ ния> | <Форма сцепленных сообщений>}

<Текст> ::= [^ <Форма> | <Форма> ]... | <Текст> [ , <Текст> ]...

<Блок> ::= < [ > [ {: <Переменная> } ... <|> ][ <Текст> ] < ] > <Временные переменные> ::= <|> <Переменная> ... <|> <Схема сообщения> ::= <Унарный селектор> | <Бинарный селектор>

<Переменная> | {<Ключевое слово> <Переменная>}...

<Метод> ::= <Схема сообщения> [<Временные переменные>] <Текст>

В вышеприведенных примерах программ разобраны случаи использования условных конструкций и простого цикла. В этих и других конструкциях языка Smalltalk широко используются блоки. Для этого условный оператор и оператор цикла можно определить как методы, использующие так называемый оператор блока. Если оператор блока находится внутри программы, то создается экзем­ пляр класса BlockContext, и в нем накапливается вся необходимая информа­ ция для работы блока, однако оценка содержимого оператора блока при этом не выполняется. Чтобы она выполнилась, экземпляру класса Context необходимо послать сообщение value.

Оператором управления, реализуемым с помощью оператора блока, яв­ ляется и оператор while. Для двух целых чисел x, y он может быть реализован следующим образом:

| m x y | x := 5. y := 3. m := 0.

[x > 0] whileTrue: [m := m + y, x := x – 1].

Здесь оператору блока [x > 0] посылается сообщение whileTrue: [m := m + y, x := x – 1]. Вначале вычисляется значение получателя. Если оно равно false, то выполнение прекращается. Если оно равно true, то вначале вычисляется значение параметра whileTrue и затем вычисляется

15

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

whileTrue: block self value ifTrue:

[block value.

self whileTrue: block].

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

| sum | sum := 0.

2 to: 100 by: 2 do: [ :each | sum := sum + each ].

Здесь to: stop by: step do: aBlock является методом класса Number, который оценивает блок для всего заданного интервалом и шагом множества чисел. Оператор блока содержит параметр :each, последователь­ но принимающий значения из указанного множества.

2.3 Описание классов объектов

Описание класса объектов включает заголовок вида:

<имя суперкласса> subclass: < имя класса>

instanceVariableNames:

'<список имен переменных экземпляра>'

classVariableNames:

'<список имен переменных класса>'

poolDictionaries:

'<список общих словарей>'

category:

'имя категории'

и совокупности описаний методов класса и методов экземпляра. Напомним, что методы класса вызываются посылкой сообщения имени класса, а методы экзем­ пляра – посылкой сообщения объекту (экземпляру) класса. Например, описание класса автобусов может иметь вид:

Object subclass: #AutoBus instanceVariableNames:

'speed path timeCtrl timePre ' classVariableNames:

'TotalCount ' poolDictionaries: '' category: 'Samples'

16

Здесь Object – имя родительского класса, #AutoBus – имя нового клас­ са как константа типа слово.

Структура описания метода имеет следующий вид:

<схема сообщения> " комментарий "

| список временных переменных метода | <оператор>

. . . . . . . . . .

<оператор>

Схема сообщения содержит имя метода и необходимые параметры. Если параметров нет, то используется унарный селектор – имя метода, если параметр один или больше одного, то перечень ключевых слов (смотри описание синтак­ сиса). В любом случае первое слово всегда определяет имя метода. Например, порождение нового экземпляра автобуса и учет их общего количества может выполняться методом класса

new

"Создание и инициализация нового экземпляра автобуса" super new initialize.

TotalCount := TotalCount + 1

Инициализация переменных только что созданного автобуса выполняется мето­ дом экземпляра

initialize

"Установка переменных экземпляра" path:=0.

speed:=0.

timePre:=0.

timeCtrl:=0

Выпуск экземпляра на линию можно смоделировать методом экземпляра

start: aSpeed

"Выпустить на линию автобус со скоростью aSpeed в текущий момент времени, задаваемый глобальной пере­ менной SysTime "

speed := aSpeed. timePre := SysTime. timeCtrl := SysTime

17