language_manual_ru
Описание зыка Scato
Описание языка Scato¶Среда выполнения¶Система координат¶Все координаты задаются в текущей системе координат. Операции преобразования системы координат изменяют текущую систему координат. Это изменения могут быть отменены с помощью операций работы с контекстом. Начальное положение системы координат таково: ^ Y | (0, 1) +------+ (1, 1) | | | поле | | | X (0, 0) +------+---> (1, 0) Переменные¶В качестве аргументов любыe арифметическиe операции могут использовать как числа, так и именованные переменные. Процедуры¶Части кода могут быть организованы в именованные процедуры и вызываться многократно из разных частей программы по имени. Контекст¶Контекст состоит из информации о текущей системе координат, толщине и цвете линии, а так же набора определённых именованных переменных. Разные аспекты контекста можно локализовать. То есть, объявить, что определённая часть программы выполняется в локализованном контексте. Все изменения контекста (перемещения, изменения цветов и значений переменных), произведённые в локализованной части, не будут влиять на контекст выполнения вне зоны локализации. Локализовать можно только перемещения, или только значения переменных, или и то и другое. Лексика и синтаксис¶Элементарные выражения¶Программа состоит из слов (token), разделённых пробелами. Любые пробельные символы (пробелы, табуляции, переводы строки) в любом количестве эквивалентны и обозначают просто разделитель между словами. В программе допустимы комментарии -- текст от первого символа '#' до конца строки игнорируется. Слова составляют выражения (statment). Пример программы: # first statment jump .1 .1 # tortoise jump without drawing # second statment draw .8 # and now tortoise go strite from .8 # point (.1, .1) to point (.9, .9) # and draw Составные выражения. Блоки¶Выражения могут быть сгруппированы в блоки. Блок является выражением и может быть использован везде, где требуется выражение. Например, следующее выражение вычерчивает линию: draw .1 .1 Выражение iterate повторяет заданное выражение пять раз: iterate 5 draw .1 .1 Если мы хотим повторить пять раз пару выражений, то нам надо сгруппировать их. Тем самым, мы превратим пару выражений в одной (сгруппированное) и сможем передать iterate именно пару: iterate 5 # "повторить пять раз следующее выражение" begin # "выражение началось" draw .1 .1 # \__ тело выражения jump .1 .1 # / end # "выражение закончилось" Обратите внимание, что если мы опустим группирующие begin и end, то смысл изменится: iterate 5 # "повторить пять раз следующее выражение" draw .1 .1 # draw будет повторено пять раз... jump .1 .1 # ...а затем будет выполнен jump # jump -- это уже следующее, после iterate, выражение Семантика¶Графические операции¶В качестве аргументов всех графических операций могут выступать, как обычные числа, так и именованные переменные. Значения могут быть как положительными, так и отрицательными. Перемещения¶Координаты всех перемещений задаются в текущей системе координат. Операций перемещения всего две: draw X Y jump X Y Jump перемещает черепашку, а draw перемещает и рисует прямую линию между начальной и конечной точками. Преобразования системы координат¶Систему координат можно масштабировать и поворачивать. scale K right A left A Углы A задаются в градусах. А коэффициент масштабирования K показывает во сколько раз должен увеличиться единичный отрезок. Так, если вы задали K равным 0.5, то единичный отрезок уменьшится и всё, что вы будете рисовать далее, будет меньше в два раза. Допускаются так же произвольные аффинные преобразования (для экспертов). Для этого предусмотрено три операции: affinescale KX KY affinerotate AX AY affinematrix XX XY YX YY Первая позволяет независимо масштабировать оси, вторая -- поворачивать, третья позволяет задать новые координаты осей. | Обратите внимание, что после аффинных преобразований, все действия по-прежнему происходят в текущей системе координат, то есть в искажённой системе координат. Искажаться будет всё, расстояния, углы, масштабы. | Толщина линии¶Толщина линии задаётся в единицах текущей системы координат. То есть обычно толщина линии значительно меньше единицы. width W При масштабировании, толщина линии претерпевает аналогичные изменения. Цвет¶Цвет задаётся тремя числами-компонентами: красной, зелёной и синей. Значение каждой компоненты лежит в интервале от 0 до 1. Примеры:
Вы можете задавать цвет линии color R G B и цвет фона bgcolor R G B Кроме того, цвета можно смешивать. Оператор mixcolor подмешивает долю K цвета R, G, B. mixcolor R G B K Операции с переменными¶Везде, где может фигурировать число, можно подставлять и переменную. Все операторы для работы с переменными можно разделить на три группы. Операторы присвоения¶Если переменная не существует, то оператор присвоения создаст её. К операторам присвоения относятся: set VAR VAR-OR-VAL # VAR := VAR-OR-VAL sin VAR VAR-OR-VAL # VAR := sin(VAR-OR-VAL) cos VAR VAR-OR-VAL # VAR := cos(VAR-OR-VAL) exp VAR VAR-OR-VAL # VAR := exp(VAR-OR-VAL) log VAR VAR-OR-VAL # VAR := log(VAR-OR-VAL) sqrt VAR VAR-OR-VAL # VAR := sqrt(VAR-OR-VAL) Операторы, изменяющие значение¶Эти операторы изменяют значение уже существующих переменных. add VAR VAR-OR-VAL # VAR := VAR + VAR-OR-VAL sub VAR VAR-OR-VAL # VAR := VAR - VAR-OR-VAL mul VAR VAR-OR-VAL # VAR := VAR * VAR-OR-VAL div VAR VAR-OR-VAL # VAR := VAR / VAR-OR-VAL mod VAR VAR-OR-VAL # VAR := VAR % VAR-OR-VAL pow VAR VAR-OR-VAL # VAR := VAR ** VAR-OR-VAL (возведение в степень) Операторы корректирующие значение¶Эти операторы так же работают с уже существующими переменными, но не требуют для своей работы никаких дополнительных параметров. incr VAR # VAR := VAR + 1 decr VAR # VAR := VAR - 1 neg VAR # VAR := - VAR abs VAR # VAR := | VAR | (модуль) Естественно, в качестве значения может фигурировать не число, а другая переменная. Например: set a 2 # a = 2 set b a # b = 2 mul a b # a = 2 * 2 = 4 Условия и циклы¶Условные выражения¶Выражения проверки условий состоят из трёх слов: первое и третье - переменные или числа, которые необходимо сравнить; между ними (второе слово) - операция сравнения. Для операций приняты следующие обозначения:
Далее операция сравнения будет обозначаться для краткости, как COMP. Выражения будем обозначать STAT. Ветвление¶Условный оператор if позволяет выполнить те или иные действия в зависимости от условий. Если условие истинно, то выполняется выражение, идущее после then; в противном случае выполняется ветка else или не выполняется ничего. if COMP then STAT if COMP then STAT1 else STAT2 Например: # если a меньше b, то рисуй линию if a lt b then draw 1 0 # если x больше либо равен 4, то установить # белый цвет линии; в противном случае, выполнить # блок из двух операторов draw if x ge 4 then color 1 1 1 else begin draw 1 0 draw 0 1 end Циклы с условием¶Цикл repeat повторяет блок STAT до тех пор, пока выполняется условие COMP. repeat STAT until COMP Причём условие проверяется после выполнения выражения. Пример: set n 6 repeat begin draw .1 .1 decr n end until n gt 0 Тело цикла будет выполняться до тех пор, пока n больше нуля. При этом в каждом проходе n уменьшается на единицу. Похожим образом работает цикл while, но он сначала проверяет условие, а потом выполняет тело. while COMP STAT
Безусловные циклы¶Цикл iterate повторяет операцию указанное число раз. iterate N STAT Например: iterate 3 begin draw .5 0 left 60 end Здесь мы трижды выполняем пару операторов, находящихся в блоке begin/end. Работа с контекстом¶Контекст состоит из двух компонентов:
Каждую из этих составляющих можно сохранить, а потом восстановить в первоначальном состоянии. Для этого есть три оператора: local STAT # сохраняет весь контекст save STAT # сохраняет только значения переменных transform STAT # сохраняет только состояние черепашки Благодаря этим операторам, изменения контекста, происходящие внутри STAT, теряют свою силу по завершении STAT. Например: jump .5 .5 # мы переместили черепашку в центр поля local draw 0 .3 # мы прочертили линию и в результате должны # были бы сдвинуться с точку (.5 .8), но # благодаря local, контекст был восстановлен и # сейчас черепашка снова в центре поля transform begin # применяем transform к нескольким операциям draw .2 0 # рисуем и смещаемся left 40 # поворачиваемся draw .2 0 # снова рисуем и смещаемся end # блок закончился и все # трансформации теряют силу: черепашка # снова оказывается не-повёрнутой и расположенной # в центре поля Подпрограммы¶Вы можете создавать именованные процедуры, а потом вызывать иx по именам procedure NAME STAT # создать процедуру call NAME # вызывать процедуру Пример: procedure draw_and_rotate begin draw .2 0 # рисуем jump -.2 0 # возвращаемся left 30 # поворачиваемся end jump .5 .5 # идём в центр поля # и рисуем пять лучиков call draw_and_rotate call draw_and_rotate call draw_and_rotate call draw_and_rotate call draw_and_rotate Более грамотно этот пример можно переформулировать с использованием контекстов (чтобы не возвращаться в исходную точку) и циклов (чтобы не повторять вызовы): procedure draw_and_rotate begin local draw .2 0 # рисуем left 30 # поворачиваемся end jump .5 .5 # идём в центр поля # и рисуем пять лучиков iterate 5 call draw_and_rotate Процедуры позволяют использовать рекурсию.
Разное¶Оператор nop не имеет параметров и не делает ничего nop Его удобно использовать там, где обязательно нужен оператор, но вы пока не хотите ничего делать. Например, вы пока отлаживаете ветку else условного оператора, и вам нужно, чтобы ветка then не делала ничего. Вы можете этого добиться, используя nop: if a lt b then nop else begin ... end Где ещё искать информацию?¶Сама программа Scato имеет два свойства, призванных помочь начинающему пользователю. Во-первых, это богатая коллекция примеров, которые разбиты на две группы: простые -- обучающие, и более сложные. Во-вторых, Scato поддерживает отладку программ. Вы можете выполнять программу шаг за шагом и видеть в строке состояния, что происходит на каждом шагу. Вы так же можете в любой момент просмотреть значения всех переменных и все параметры черепашки. Так вы можете легко находит ошибки и детально изучать работу примеров. |