My favorites | Sign in
Project Home Downloads Wiki Issues Source
Search
for
language_manual_ru  
Описание зыка Scato
Featured
Updated Sep 15, 2009 by a.michu...@gmail.com

Описание языка 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.

Примеры:

  • 0, 0, 0 - чёрный цвет
  • 1, 1, 1 - белый
  • 1, 0, 0 - красный
  • 0, .2, 0 - тёмно-зелёный
  • 1, 1, 0 - жёлтый

Вы можете задавать цвет линии

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

Условия и циклы

Условные выражения

Выражения проверки условий состоят из трёх слов: первое и третье - переменные или числа, которые необходимо сравнить; между ними (второе слово) - операция сравнения.

Для операций приняты следующие обозначения:

  • lt - "строго меньше"
  • le - "меньше либо равно"
  • eq - "в точности равно"
  • ne - "не равно"
  • ge - "больше либо равно"
  • gt - "строго больше"

Далее операция сравнения будет обозначаться для краткости, как 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 поддерживает отладку программ. Вы можете выполнять программу шаг за шагом и видеть в строке состояния, что происходит на каждом шагу. Вы так же можете в любой момент просмотреть значения всех переменных и все параметры черепашки. Так вы можете легко находит ошибки и детально изучать работу примеров.


Sign in to add a comment
Powered by Google Project Hosting