Условные конструкции и булевские величины
Условные конструкции и булевские величины
Простота и лаконичность Смолтока особенно четко проявляется в том, что в этом языке отсутствуют такие необходимые, на первый взгляд, операторы, как условные и циклические. Оказывается, эти операторы и в самом деле излишни. Дело не в том, что они не нужны, а в том, что их можно сконструировать самостоятельно. Начнем с условных операторов.
а) Без сравнения объектов в Смолтоке, конечно, не обойтись. Конструкции вида
3 > 4
#(1 2 3 )= #(1 2 3)
'привет' >'пока'
5=2+3
используются в программисткой практике повсюду. Результатом выполнения этих операция являются либо истина, либо ложь.
б) Условные выражения служат для обработки результатов сравнения.
Условная конструкция имеет вид:
< условие >
если условие истинно: [ <блок выражений> ]
если условие ложно: [ <блок выражений> ]
На языке ООП эта конструкция записывается таким образом:
<объект-адресат класса True (Истина) или False (Ложь)>
ifTrue: <объект-параметр>
ifFalse: <объект-параметр>
В данном случае <объект-параметр> представляет собой блок сообщений (напомним, что блок сообщений - это группа сообщений, заключенная в квадратные скобки).
Естественно, возможны и следующие конструкции:
< условие > ifTrue: [ <группа сообщений> ].
< условие > ifFalse: [ <группа сообщений> ].
Для реализации этих конструкций существует класс булевских величин Boolean. Класс Boolean реализует значения истинности. Он имеет два подкласса: класс True и класс False. Значение true является единственным экземпляром класса True, а false – единственным экземпляром класса False. Эти конструкции введены для обеспечения возможности описания условных операторов и условных конструкций:
Классы Boolean, True и False являются надстраиваемыми (или конструированными) классами. Поэтому весьма полезно продемонстрировать их внутреннее устройство, которое столь просто, что далее можно обойтись без комментариев (еще один пример того, что хорошие объектно-ориентированные программы должны быть легко читаемыми).
Класс Boolean (Логический)
class name Boolean
superclass Object
class methods
" Оба следующих метода выдают ошибку: создание новых логических значений невозможно, так как значения 'истина' и 'ложь' уникальны"
new
^self неправильноеСообщение
new: intVal
^self неправильноеСообщение
instance methods
занестиВ: экзПоток
"Добавить последовательность символов приемника к
заданному потоку, из которого приемник может быть создан заново"
self печататьНа: экзПоток
малаяКопия
"Выдает копию приемника, разделяющую с ним переменные экземпляра. Так как есть только одно значение 'истина' и одно значение 'ложь', выдается приемник"
^self
печататьНа: экзПоток
"Добавить представление приемника в символьном виде к заданному потоку"
экзПоток поместитьВсеПоследующие:
(self ifTrue: ['истина'] ifFalse:['ложь'])
полнаяКопия
"Выдает копию приемника с малыми копиями каждой переменной экземпляра. Так как есть только одно значение 'истина' и одно значение 'ложь', выдается приемник"
^self
Класс True (Истина)
class name True
superclass Boolean
-- class methods отсутствуют
instance methods
& boolInstance
^boolInstance
| boolInstance
^true
ifTrue: Block
^Block value
ifTrue: Block1 ifFalse: Block2
^Block1 value
ifFalse: Block
^nil
ifFalse: Block1 ifTrue: Block2
^Block2 value
and: Block – И с блоком
^Block value
or: Block -- ИЛИ с блоком
^true
xor: boolInstance -- исключающее или
^boolInstance not
not
^false
equal: boolInstance -- эквивалентность приемника и аргумента
^boolInstance
Класс False (Ложь)
class name False
superclass Boolean
-- class methods отсутствуют
instance methods
& boolInstance
^false
| boolInstance
^boolInstance
ifTrue: Block
^nil
ifTrue: Block1 ifFalse: Block2
^Block2 value
ifFalse: Block
^Block value
ifFalse: Block1 ifTrue: Block2
^Block1 value
and: Block -- И с блоком
^false
or: Block -- ИЛИ с блоком
^Block value
xor: boolInstance -- исключающее ИЛИ
^boolInstance
not
^true
equal: boolInstance -- эквивалентность приемника и аргумента
^boolInstance not
Например:
| maximum a b |
a:= 5 Sqr.
b:= Factorial.
a>b
ifTrue: [maximum:= a]
ifFalse :[maximum:= b].
^maximum
Создадим на основе данной программы метод с именем 'max'. Для начала определимся со спецификацией.
1. Объект-адресат - это целое число. Следовательно, данный метод будет принадлежать классу целых чисел.
2. Объект-параметр - тоже целое число.
3. Результат - это тоже целое число.
Значит, сообщение будет выглядеть следующим образом:
<экзЦелоеЧислоМакс> := <экзЦелоеЧислоA> maximum: <экзЦелоеЧислоB>
В Смолтоке любой метод имеет следующий вид:
имяСообщения
" комментарии "
| временные переменные |
выражения
В нашем случае:
max: arg -- имя метода с параметром
"вычисление максимума( a^2, b!)"
| a b maximum |
a:= self Sqr. -- псевдопеременная 'self' -
-- значение объекта-адресата
b:= arg Factorial.
a>b
ifTrue: [maximum:= a]
ifFalse: [maximum:= b].
^maximum
Теперь можно добавить данный метод в класс Integer (суперкласс Number - Величина). Примеры использования метода:
5 max: 4
10 max: 7
и т.п.