Scala в примерах: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 881:
 
Программы Scala — это последовательности символов Unicode. Мы различаем следующие множества символов:
* пробел, табуляция или символ новойперевода строки,
* буквы от '<tt>a</tt>' до '<tt>z</tt>', '<tt>A</tt>' до '<tt>Z</tt>',
* цифры от '<tt>0</tt>' до '<tt>9</tt>',
* разделители: <tt>.&nbsp; ,&nbsp; ;&nbsp; (&nbsp; )&nbsp; {&nbsp; }&nbsp; [&nbsp; ]&nbsp; \&nbsp; "&nbsp; '</tt>,
* символыоператорные операторовсимволы, такие как '<tt>#</tt>', '<tt>+</tt>', '<tt>:</tt>'. По сути, это символы, которые не перечислены в множествах выше.
 
=== Лексемы ===
 
<pre>
идентификатор = буква {буква | цифра}
ident = letter {letter | digit}
| оператор {оператор}
| operator { operator }
| identидентификатор '_' identидентификатор
literalлитерал = "asкак inв Java"
</pre>
 
Литералы — те же, что и в Java. Они определяют числа, символы, строки и булевские величины. Примеры литералов: <tt>0</tt>, <tt>1.0e10</tt>, <tt>'x'</tt>, <tt>"he said "hi!""</tt> или <tt>'''true'''</tt>.
 
Идентификаторы могут быть двух видов. Они начинаются либо с буквы, за которой идет (возможно, пустая) последовательность букв и символов, либо с операторного символа, за которым идет (возможно, пустая) последовательность операторных символов. Оба вида идентификаторов могут содержать символы подчеркивания. За символом подчеркивания могут идти идентификатры любого типа. Например, следующие идентификатры корректны: <tt>x&nbsp; Room10a&nbsp; +&nbsp; --&nbsp; foldl_:&nbsp; +_vector</tt>.
 
Это следует из правила, что следующие друг за другом оператор и идентификатор должны разделяться пробелом. Например, ввод <tt>x+-y</tt> будет распознан как последовательность из трех токенов <tt>x</tt>, <tt>+-</tt>, <tt>y</tt>. Если мы хотим выразить сумму <tt>x</tt> и значения <tt>-y</tt>, нам нужно добавить по крайней мере один пробел: <tt>x+ -y</tt>.
 
Символ <tt>$</tt> зарезервирован для идентификаторов, сгенерированных компилятором, он не должен использоваться в исходном коде программы.
 
Следующие слова зарезервированы, их нельзя использовать в качестве идентификаторов:
 
{| class="simple" border="0"
| width="20%"|'''abstract'''
| width="20%"|'''case'''
| width="20%"|'''catch'''
| width="20%"|'''class'''
|'''def'''
|-
|'''do'''
|'''else'''
|'''extends'''
|'''false'''
|'''final'''
|-
|'''finally'''
|'''for'''
|'''if'''
|'''implicit'''
|'''import'''
|-
|'''match'''
|'''new'''
|'''null'''
|'''object'''
|'''override'''
|-
|'''package'''
|'''private'''
|'''protected'''
|'''requires'''
|'''return'''
|-
|'''sealed'''
|'''super'''
|'''this'''
|'''throw'''
|'''trait'''
|-
|'''try'''
|'''true'''
|'''type'''
|'''val'''
|'''var'''
|-
|'''while'''
|'''with'''
|'''yield'''
|}
<tt>_&nbsp; &nbsp; :&nbsp; &nbsp; =&nbsp; &nbsp; =>&nbsp; &nbsp; <-&nbsp; &nbsp; <:&nbsp; &nbsp; <%&nbsp; &nbsp; >:&nbsp; &nbsp; #&nbsp; &nbsp; @</tt>
 
=== Типы ===
 
<pre>
Тип = ПростойТип | ТипФункции
ТипФункции = ПростойТип '=>' Тип | '(' [Типы] ')' '=>' Тип
ПростойТип = Byte | Short | Char | Int | Long | Float | Double | Boolean | Unit | String
Типы = Тип {',' Тип}
</pre>
 
Типы могут быть:
* числовыми типами <tt>Byte</tt>, <tt>Short</tt>, <tt>Char</tt>, <tt>Int</tt>, <tt>Long</tt>, <tt>Float</tt> и <tt>Double</tt> (такие же, как в Java),
* типом <tt>Boolean</tt> со значениями <tt>'''true'''</tt> и <tt>'''false'''</tt>,
* типом <tt>Unit</tt> с единственным значением <tt>()</tt>,
* типом <tt>String</tt>,
* типами функций, как <tt>(Int, Int) => Int</tt> или <tt>String => Int => String</tt>.
 
=== Выражения ===
 
<pre>
Выражение = ИнфиксноеВыражение | Функция | if '(' Выражение ')' Выражение else Выражение
ИнфиксноеВыражение = ПрефиксноеВыражение | ИнфиксноеВыражение Оператор ИнфиксноеВыражение
Оператор = идентификатор
ПрефиксноеВыражение = ['+' | '-' | '!' | '~'] ПростоеВыражение
ПростоеВыражени = идентификатор | литерал | ПростоеВыражение '.' идентификатор | Блок
Функция = (Связывания | Id) '=>' Выражение
Связывания = '(' Связывание {',' Связывание } ')'
Связывание = идентификатор [':' Тип]
Блок = '{' {Определение ';'} Выражение '}'
</pre>
 
Выражения могут быть:
* идентификаторами, как <tt>x</tt>, <tt>isGoodEnough</tt>, <tt>*</tt> или <tt>+-</tt>,
* литералами, как <tt>0</tt>, <tt>1.0</tt> или <tt>"abc"</tt>,
* выборами поля или метода, как <tt>System.out.println</tt>,
* применениями функций, как <tt>sqrt(x)</tt>,
* применениями операторов, как <tt>-x</tt> или <tt>y + x</tt>,
* условиями, как <tt>'''if''' (x < 0) -x '''else''' x</tt>,
* блоками, как <tt>{ '''val''' x = abs(y) ; x * 2 }</tt>,
* анонимными функциями, как <tt>x => x + 1</tt> или <tt>(x: Int, y: Int) => x + y</tt>.
 
=== Определения ===
 
<pre>
Определение = ОпределениеФункции | ОпределениеЗначения
ОпределениеФункции = 'def' идентификатор {'(' [Параметры ] ')'} [':' Тип] '=' Выражение
ОпределениеЗначения = 'val' идентификатор [':' Тип] '=' Выражение
Параметры = Параметр {',' Параметр}
Параметр = идентификатор ':' ['=>'] Тип
</pre>
 
Определения могут быть:
* определениями функций, как <tt>'''def''' square(x: Int): Int = x * x</tt>,
* определениями значений, как <tt>'''val''' y = square(2)</tt>.
 
= Классы и объекты =