## 3. Инструкция по Script-Fu

В этом руководстве вы опишем базовые понятия Scheme, необходимые для использования Script-Fu, и создадим небольшой сценарий, который можно будет добавить в список сценариев GIMP. Этот сценарий запрашивает у пользователя какой-нибудь текст и создаёт новое изображение, по размеру точно подходящее под текст. Затем мы улучшим сценарий и добавим рамку вокруг текста, после чего, наконец, мы дадим полезные советы по изучению Script-Fu.

| Примечание
Этот раздел был адаптирован из инструкции, написанной для руководство пользователя GIMP 1 Майком Терри (Mike Terry).

### 3.1. Первое знакомство с Scheme

#### 3.1.1. Начало работы с Scheme

Scheme — это диалект семейства языков программирования Lisp. GIMP использует TinyScheme, который представляет собой облегчённый интерпретатор подмножества так называемого стандарта R5RS.

Первое, что нужно усвоить:

> Каждый оператор в Scheme заключается в скобки ().

Второе, что нужно знать:

> Название функции или оператора — первое слово в скобках, все последующие — параметры функции.

Однако не всё, что заключено в скобках — функция. Это могут быть элементы списка, но об этом позже. Такая нотация называется префиксной, потому что функция указывается в самом начале. Если вы знакомы с постфиксной нотацией, или у вас есть калькулятор с обратной польской нотацией (как многие калькуляторы HP), у вас не будет проблем в создании выражений в Scheme.

Третье, что нужно понимать:

> Математические операторы тоже считаются функциями, и поэтому тоже указываются в самом начале выражения.

Это логично следует из определения префиксной нотации, упомянутой выше.

#### 3.1.2. Пример префиксной, инфиксной и постфиксной нотаций

Вот несколько примеров, показывающие разницу между префиксной, инфиксной и постфиксной нотациями. Мы сложим 1 и 23.

- Префиксная нотация: `+ 1 23` (так хочет Scheme)

- Инфиксная нотация: `1 + 23` (как пишется в повседневной жизни)

- Постфиксная нотация: `1 23 +` (как работают многие калькуляторы HP)

#### 3.1.3. Практика в Scheme

В GIMP выберите пункт главного меню Фильтры → Разработка → Script-Fu → Консоль Script-Fu. Запустится окно консоли Script-Fu, позволяющее интерактивно работать в Scheme.

#### 3.1.4. Окно консоли Script-Fu

Внизу окна есть поле ввода для команд. Здесь мы будем тестировать наши команды на Scheme. Сначала сложим два числа:

    (+ 3 5)

Введите эту строку в поле ввода и нажмите Enter. В центральном окне покажется результат 8.

Рисунок 13.1. Использование консоли Script-Fu

Функция «+» может принимать несколько аргументов, поэтому можно добавить более одного числа:

    (+ 3 5 6)

Это даст ожидаемый результат 14.

Пока всё хорошо — мы вводим оператор на Scheme, и он тут-же выполняется в консоли. Теперь несколько предостережений…

#### 3.1.5. Следите за дополнительными скобками

Например, при введении сложного математического выражения, мы автоматически хотим отделит части выражения скобками для лучшего понимания. На Scheme нужно быть аккуратным и добавлять скобки правильно. Допустим, мы хотим добавить 3 к результату сложения 5 и 6:

    3 + (5 + 6) + 7 = ?

Зная, что оператор + принимает список параметров, существует соблазн написать следующее:

    (+ 3 (5 6) 7)

Однако это неправильно. Нужно помнить, что каждый оператор начинается и заканчивается скобкой, поэтому Scheme попытается в выше приведённом примере найти функцию «5» во второй группе скобок, вместо сложения двух чисел в скобках.

Правильно утверждение выше пишется так:

    (+ 3 (+ 5 6) 7)

#### 3.1.6. Следите за пробелами

Если вы знакомы с другими программными языками, например C/C++, Perl или Java, то знаете, что пробелы не обязательны вокруг математических операторов для правильности выражения:

            3+5, 3 +5, 3+ 5

Все эти выражения принимаются компиляторами C/C++, Perl и Java. Однако в Scheme это не так. Пробел обязателен после названия функции или оператора для правильной интерпретации выражения компилятором Scheme.

Попрактикуйтесь с простыми математическими уравнениями в консоли Script-Fu, пока не привыкните к этим базовым понятиям.

2.4. Виды Script-Fu |  | 3.2. Переменные и функции

Report a bug in GIMP Сообщите об ошибке в нашем баг-трекере