апреля 06, 2011

Локальные переменные

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

Простые локальные переменные (типы int, uint, bool, ptr) объявляются так
(внутри команды):
| l1 l2 ... ln|
Они сразу снимают со стека начальные значения, к примеру после
1 2 3 | i j k|
в i окажется значение 1, в j окажется значение 2, в k окажется значение 3.

Чтение/запись переменных стилизовано под классический фортовский стиль. Если
name — название локальной переменной, то для неё определяются следующие команды


  1. name@ — прочитать значение переменной, положить его на стек
  2. name! — записать в name значение со стека


Помимо этих двух примитивных операций, определяются следующие сахарные:

  1. name1+ — увеличить значение name на 1
  2. name1- — уменьшить значение name на 1
  3. name++ — положить значение name на стек и увеличить name на 1
  4. ++name — увеличить name на 1 и положить результат на стек
  5. name-- — положить значение name на стек и уменьшить name на 1
  6. --name — уменьшить name на 1 и положить результат на стек
  7. name+ — прибавить name к вершине стека
  8. name- — вычесть name из вершины стека
  9. name* — умножить вершину стека на name
  10. name+! — прибавить к переменной name значение с вершины стека
  11. name-! — вычесть из вершины стека name и положить результат в name
  12. 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 ;


Комментариев нет:

Отправить комментарий

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru