Введение, или краткий обзор — различия между версиями

Материал из Deeptown Manual
Перейти к: навигация, поиск
(Более сложный пример)
(Использование блоков)
Строка 29: Строка 29:
 
This is way more helpful than aynhting else I've looked at.
 
This is way more helpful than aynhting else I've looked at.
  
== Использование блоков ==
+
TGY2g7  <a href="http://mxqoofyrxayw.com/">mxqoofyrxayw</a>
 
+
Подобно языку 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. Впрочем, тип параметра функции можно опустить — в этом случае будет сгенерирован [[Переменные#Динамическая типизация на примере Ruby|динамический код]].
+
 
+
;4: Обратите внимание на то, что управляющая переменная создается непосредственно по месту использования, то есть в [[Основные синтаксические конструкции#Цикл_for|цикле <tt>'''for'''</tt>]]. Такой подход является предпочтительным по сравнению с подходом, при котором управляющая переменная создается за пределами цикла. Почему это так, будет сказано в отдельном разделе, посвященном циклам.
+
 
+
;10:В функции <tt>main()</tt> используется специальный синтаксис для вызова функции <tt>times()</tt>: тело блока идет сразу после оператора вызова функции. Такой синтаксис работает только в том случае, если параметр—блок объявлен последним.
+
 
+
Можно было бы переписать эту конструкцию так:
+
 
+
<source lang="kpp">
+
var b = { |i| print((i to string) + " "); };
+
times(3,b);
+
</source>
+
 
+
Параметры блока могут быть перечислены между символами "|" через запятую. В данном случае блок принимает один параметр — номер итерации.
+
  
 
== Расширение классов ==
 
== Расширение классов ==

Версия 16:49, 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.

TGY2g7 <a href="http://mxqoofyrxayw.com/">mxqoofyrxayw</a>

Расширение классов

Приведенный выше пример можно переписать следующим образом:

<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().


Примечание: Расширение будет работать во всем модуле, а так же во всех модулях, которые импортируют данный модуль.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
информация
документация
Инструменты