Вчера исправил баг в ядре, который мешал в полной мере заработать
локальным переменным.
Простые локальные переменные (типы int, uint, bool, ptr) объявляются так
(внутри команды):
| l1 l2 ... ln|
Они сразу снимают со стека начальные значения, к примеру после
1 2 3 | i j k|
в i окажется значение 1, в j окажется значение 2, в k окажется значение 3.
Чтение/запись переменных стилизовано под классический фортовский стиль. Если
name — название локальной переменной, то для неё определяются следующие команды
- name@ — прочитать значение переменной, положить его на стек
- name! — записать в name значение со стека
Помимо этих двух примитивных операций, определяются следующие сахарные:
- name1+ — увеличить значение name на 1
- name1- — уменьшить значение name на 1
- name++ — положить значение name на стек и увеличить name на 1
- ++name — увеличить name на 1 и положить результат на стек
- name-- — положить значение name на стек и уменьшить name на 1
- --name — уменьшить name на 1 и положить результат на стек
- name+ — прибавить name к вершине стека
- name- — вычесть name из вершины стека
- name* — умножить вершину стека на name
- name+! — прибавить к переменной name значение с вершины стека
- name-! — вычесть из вершины стека name и положить результат в name
- name*! — умножить name на значение с вершины стека
Можно при необходимости добавить собственные операции с локальными переменными,
изменив по стандартной схеме файл, в котором локальные переменные реализованы.
Планируются и другие конструкции локальных переменных (для строк, для классов).
Несколько примеров использования локальных переменных:
// Функция Result = (a + b) * (b + c) * (c + a)
: func | a b c| a@ b+ b@ c+ c@ a+ * * ;
// Команда, печатающая числа от 100 до 1
: test 101 | i| begin --i while i@ . repeat ;
Комментариев нет:
Отправить комментарий