Сайт о языке программирования Сuprum Lang



Первичная информация о Cuprum Lang

Этот экспериментальный язык программирования начал развиваться

с марта 2018 года как язык программирования для анимации в программе Blender.

Это очень простой интерпретатор с встроенным отладчиком

написанный на языке высокого уровня C#.


Почему такое название? В таблице Менделеева элемент под

номером 29 имеет обозначение как CU или медь.

По латыни Cuprum.


Язык имеет три типа переменных int, decimal, string.
Все переменные глобальные.
В языке невозможно задавать свои переменные.
Возможно в будущем можно будет добавлять свои названия
переменных,но пока достаточно встроенных для всех типов
специальных задач.


Этот язык это фактически смесь ассемблера и языка C
с большим множеством встроенных функций.

Существуют уже заранее определенные переменные
и их как оказалось вполне достаточно для создания
простых специализированных программ.

Это буквы латинского алфавита a, b, c, d,...z.
для типа данных decimal (плавающая точка).

Для переменной типа int существует диапазон
переменных от i0 до i1001.

Для переменной типа decimal существует диапазон
переменных от d0 до d1001.

Для переменной типа string существует диапазон
переменных от s0 до s1001.


Язык можно использовать как калькулятор.
Максимальная точность вывода 29 знаков.



Самые простые программы выглядят так.

print Hello, world!
print 123


a = 1
b = 2
a = a+b
print a


//Работа со строчками
s0 = Hello,
s0 += world !
print s0


a = 1 + 3 - sqrt(sin(2))
b = 2.001
a = a + b/3
print a


d90 = 123
a = 1
b = 2
a += b * sin(b) + sqrt(d90)
print a


//Генератор псевдослучайных чисел
a = rnd(1.01 , 40)
print a


Функция или подпрограмма задается очень просто.
Это точка входа с уникальным именем и обязательно
оканчивающаяся на двоеточие и заканчивающееся
ключевым словом Ret или Return

Функция вызывается ключевым слово Сall
Функцию можно вызывать по условиям Сall a > b link
В данном случае работает это так.
Если a больше b тогда переходим на подпрограмму link.

Важный момент!
В условиях перехода можно указывать только 2 переменные или
математическое выражение без пробелов.

Есть еще одно свойство инструкции call

call a link
call a+b+c link

Если переменная a или математическое выражение больше нуля, то осуществляется переход на link
Математическое выражение необходимо писать без пробелов.

call a link
call a != b link
call a+1 > b+2 link

link:
a += 2
ret

privet_1:
b += 1
ret

privet_2:
d += 1
return


Точка входа задается ключевыми словами main: и start:
Во всех точках входа двоеточие обязательно.

Ключевые слова main: и start: можно не указывать если в этом нет необходимости.

link:
a += 2
ret


privet_1:
b += 1
ret


privet_2:
d += 1
return


main:
call privet_1
call privet_2
call a > b link
call a+1 < b+2 link
print d

Условные и безусловные переходы.

jmp link
jmp a link
jmp a+b+c link
jmp a == 3 link_2

goto link
goto a link
goto a+b+c link
goto a == 3 link_2

jmp и goto это абсолютно одинаковые инструкции.
Важный момент!
В условиях перехода можно указывать только 2 переменные
или математическое выражение без пробелов.

Есть еще одно свойство инструкции jmp,goto

jmp a link
jmp a+b+c link

goto a link
goto a+b+c link

Если переменная a или математическое выражение больше нуля, то осуществляется переход на link
Математическое выражение необходимо писать без пробелов.

Условия if и else.

Фигурная скобка { должна находится на одной строке в условии.

if d > z {
   z = z + sqrt(d)
}

Инструкция else должна находится строго за иструкцией if.
Разрыв не допускается.

Фигурная скобка { должна находится на одной строке с else
Вложенность может быть любой.

if d > z {
     d++
     print d
}
else {
    z--
    print z
}


//Если переменная d больше нуля,тогда условие выполняется
if d {
     d++
     print d
}
else {
    z--
    print z
}


//Если математическое выражение a+b+c больше нуля, тогда условие выполняется
if a+b+c {
     d++
     print d
}
else {
    z--
    print z
}

Инструкции while, break, continue

Фигурная скобка { должна находится на одной строке с while

while d > a {
      a ++
}

while d != a {
      a ++
      if( a == 10) {
         break
      }
}

while d < a {
      a ++
      break a == 10
}

while d == a {
      a ++
      continue a == 10
}


//Если a больше нуля, тогда условие выполняется
while a {
      a ++
      continue a == 10
}


//Если математическое выражение a+b+c больше нуля, тогда условие выполняется
while a+b+c {
      a ++
      continue a == 10
}


Break и Сontinue можно использовать с условиями в While

Выход из цикла также можно завершить инструкцией jmp из любой вложенности

while d > a {
      a ++
      jmp a >= 10 link_exit
}

link_exit:
//Завершение программы
exit


Ключевое слово языка include или #include

В текстовых файлах можно размещать только названия строк с данными,
чтобы на занимать место в окне программы.

//Эти данные находятся в файле key.txt
s0 = 1,2,3,4,3,4,3,4,5,6;
s10 = 10,20,30,40,30,40,30,40,50,60;

Строка обязательно должна оканчиваться на точку с запятой,
если она находится в текстовом файле.
В самой программе при редактирование кода это необязательно.

//В программе пишем так.
include key.txt
print s10


Организация циклов с помощью инструкции Loop

Встроенная переменная fc является счетчиком с типом данных int.
В ней задается количество итераций цикла.
При достижении команды loop из переменной fc вычитается число 1.
Как только переменная fc станет меньше нуля или равной нулю,
работа цикла прекратится.


//Выполнить цикл 10 раз
fc = 10
cycles:
  a ++
loop cycles

print a

Циклы можно задавать с условиями.
Если переменная a будет равна 3, тогда работа цикла прекратится досрочно.

//Выполнить цикл
fc = 10000
cycles:
a ++
loop a == 3 cycles

print a

Важный момент!
В условиях цикла можно указывать только 2 переменные или математическое выражение без пробелов.

Есть еще одно свойство инструкции loop

loop a link
loop a+b+c link

Если переменная a или математическое выражение больше нуля, то осуществляется переход на link
Математическое выражение необходимо писать без пробелов.


Выполнение математического выражения по условию

Например если d больше 10, тогда выполняется математическое выражение a = f + d10

km d > 10 a = f + d10
km d > 11 g = f + d1+ sin(d10)


Логические операции AND,OR,NOT,CMP,BETWEEN

AND - Если 2 математических выражения истинны, тогда в переменную d будет записано число 1.
Если выражения не истинны, тогда будет записан 0.
В данном случае print напечатает 1.

d = and(2 == 2,5 > 2*2)
print d


OR - Если хотя бы одно математическое выражение истинно, тогда в переменную d будет записано число 1.
Если оба выражения не истинны, тогда будет записан 0.
В данном случае print напечатает 1.

d = or(2 == 2, 5 > 2)
print d


NOT - Если математическое выражение истинно, тогда в переменную d будет записано число 0.
Если выражение не истинно, тогда будет записан 1.
В данном случае print напечатает 1.

d = not(2 == 2)
print d

CMP - Если условие истинно, тогда в переменную d будет записано число 1.
Если условие не истинно, тогда будет записан 0.
В данном случае print напечатает 1.

d = cmp(3 != 2)
print d


BETWEEN - Если переменная b находится в диапазоне между двумя перемеными a и c, тогда в переменную d будет записано число 1.
Если условие не истинно, тогда будет записан 0.

a = 0
b = 5
c = 10
d = between(a,b,c)
print d
В данном случае print напечатает 1.

d = between(2,-2,10)
print d
В данном случае print напечатает 0.




Присвоение строк по условию.

Когда не были реализованы if c фигурными скобочками, ключи присваивались так.
Так даже проще без фигурных скобочек.

Цифры это ключи, а s90, s91, s91 это встроенные переменные.
s90 = 1, 2, 3, 4, 5
s91 = 11, 22, 31, 42, 52
s92 = 131, 322, 231, 242, 252

Здесь происходит присвоение строк.
Например если d равно 10, тогда строка s0 будет равна строке s90.

ks d == 10 s0 = s90
ks d == 11 s0 = s91
ks d == 12 s0 = s92

На обычном языке программирования кода будет больше на порядки


Встроенные функции для анимации.

В переменную names заносятся имена контроллеров.
Встроенная функция sigmoid или sigmoid_protect задает как объекты будут двигаться,
их характер движения.

Пример.
sigmoid(0.6,24) или sigmoid_protect(0.6,24)

Числовое значение 0.6 задает характер движения.
Значение 24 это количество кадров в движении.
При значении 10 движение резкое.
При значение 0.6 движение плавное.
Чем больше число, тем жестче движение.
Движение объекта идет по Сигмоиде.

Сигмоида — это гладкая монотонная возрастающая нелинейная функция,
имеющая форму буквы «S», которая часто применяется для «сглаживания»
значений некоторой величины.

Функция spacing или sp задает спейсинг который был вычислен функциями sigmoid или sigmoid_protect

Функция sigmoid_protect не изменяет начальный и конечный кадр в анимации.

frame - это встроенная переменная для удобного перемещения по тайм лайну в программе Blender.



Пример программы № 1
Анимация движения двух кубов

//С какого кадра начинаем
fs = 100
//На каком кадре заканчиваем
fe = 200
//Ставим защиту если надо,чтобы не
//перетереть ключи большие чем max
max = fe
//0.6 - чем больше число, тем жестче движение
//Без защиты первого и последнего кадра
//s0 = sigmoid(0.6,fe-fs)
//Защита первого и последнего кадра
s0 = sigmoid_protect(0.6,fe-fs)

//Список имен контроллеров
names Cube_1, Cube_2
//Задаем спэйсинг для всех контроллеров
//которые перечислены в names
spacing t fs,s0



Пример программы № 2
//Движение куба 1
fs = frame
fe = fs + 24
s0 = sigmoid_protect(0.6,fe-fs)
names Cube.006
spacing t fs s0


//Движение куба 2
fs = frame
fe = fs + 24
s0 = sigmoid_protect(2.6,fe-fs)
names Cube.039
spacing t fs s0


//Вращение головой персонажа
fs = frame
fe = fs + 24
s0 = sigmoid_protect(6.1,fe-fs)
names Empty.014
spacing r fs s0



Пример программы № 3
//Вращение куба с 100 по 124 кадр с характером вращения 1.
//Характер движения занесен в переменную b.
a = 100
b = 1
s0 = sigmoid_protect(b,24)
names Cube
spacing r a s0




Продолжение следует...



All rights reserved. CuprumLang. 2018-2019. bios.space@gmail.com