Введение, или краткий обзор — различия между версиями
(→Расширение классов) |
(→Ðолее ÑложнÑй пÑимеÑ) |
||
Строка 27: | Строка 27: | ||
Если бы мы, скажем, писали программу, генерирующую текстуру — никакой функции <tt>main()</tt> в ней не было бы. Набор экспортируемых ей функций полностью определялся бы требованиями генератора текстур, которые описаны в соответствующей документации. --> | Если бы мы, скажем, писали программу, генерирующую текстуру — никакой функции <tt>main()</tt> в ней не было бы. Набор экспортируемых ей функций полностью определялся бы требованиями генератора текстур, которые описаны в соответствующей документации. --> | ||
− | + | This is way more helpful than aynhting else I've looked at. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
== Использование блоков == | == Использование блоков == |
Версия 03:20, 2 сентября 2011
Содержание |
(Введение...)
Здравствуй, мир!
Классический пример программы, выводящей строку "Hello, world!" на экран, на языке K++ выглядит следующим образом:
<source lang="kpp" line="1"> package hello_world;
export function void main() {
print("Hello, world!\n");
} </source>
- 1
- Как уже отмечалось ранее, в K++ любая программа или библиотека является модулем. Ключевое слово package используется для объявления имени модуля, в который должна быть скомпилирована программа.
- 3-5
- Наконец, объявляется функция main(), которая вызывает системную функцию print() стандартной библиотеки, передав ей строку "Hello, world!\n" в качестве параметра. Пара символов \n является специальной последовательностью, которая в момент компиляции преобразуется в символ перевода строки.
- Ключевое слово export говорит о том, что имя функции не следует декорировать. Декорирование имен применяется для того, чтобы дать возможность перегружать функции с одинаковыми именами, но разными списками параметров (или параметрами разных типов), а так же для реализации пространств имен.
This is way more helpful than aynhting else I've looked at.
Использование блоков
Подобно языку Ruby, в K++ реализован механизм передачи в качестве параметра функции некоторого связанного (с вызовом) блока кода. Функция затем может вызвать этот блок один или более раз, и воспользоваться результатом, который он возвращает.
Выглядит это следующим образом:
<source lang="kpp" line="1"> package block_demo;
function void times(int i, block b) {
for (var n = 0; n < i; n++) b(n);
}
export function void main() {
times(3) { |i| print((i to string) + " "); }; print("\n");
} </source>
Результат выполнения программы:
0 1 2
Данный пример также демонстрирует объявление параметров функции: это делается в стиле языка C. Впрочем, тип параметра функции можно опустить — в этом случае будет сгенерирован динамический код.
- 4
- Обратите внимание на то, что управляющая переменная создается непосредственно по месту использования, то есть в цикле for. Такой подход является предпочтительным по сравнению с подходом, при котором управляющая переменная создается за пределами цикла. Почему это так, будет сказано в отдельном разделе, посвященном циклам.
- 10
- В функции main() используется специальный синтаксис для вызова функции times(): тело блока идет сразу после оператора вызова функции. Такой синтаксис работает только в том случае, если параметр—блок объявлен последним.
Можно было бы переписать эту конструкцию так:
<source lang="kpp"> var b = { |i| print((i to string) + " "); }; times(3,b); </source>
Параметры блока могут быть перечислены между символами "|" через запятую. В данном случае блок принимает один параметр — номер итерации.
Расширение классов
Приведенный выше пример можно переписать следующим образом:
<source lang="kpp" line="1"> package extend_demo;
extend int {
public const function void times(block b) { for (var n = 0; n < this; n++) b(n); }
}
export function void main() {
3.times() { |i| print((i to string) + " "); }; print("\n");
} </source>
- 3-8
- Оператор extend расширяет функционал класса — в данном случае класса int. Его использование аналогично объявлению класса, но объявленные внутри поля, методы и операторы будут добавлены к уже существующему классу.
- Таким образом, к классу int, объявленному в стандартной библиотеке, добавляется метод times(), вызывающий связанный блок количество раз, равное текущему числу (не забываем: мы добавляем метод в класс int, который отвечает за хранение числа).
- 11
- После такого объявления, в функции main() мы используем уже метод times() класса int: конструкция 3.times() означает создание объекта 3 класса int и вызов у этого объекта метода times().
Примечание: Расширение будет работать во всем модуле, а так же во всех модулях, которые импортируют данный модуль.