Работа с переменными

Создание и использование переменных.

Создание переменной


Стек: ( q - )

Входной поток(код): имя_переменной!

Действие: создается переменная с имененм имя_переменной, ей присваивается значение q (любой объект на вершине стека). Символ ! является постфиксом и означает "записать значение".
Далее значение переменной можно изменить.

Пример: "Hello" hello!

Извлечение значения переменной


Стек: ( - q )

Входной поток(код): имя_переменной@

Интерпретатор: встречая во входном потоке имя_переменной с постфиксом @ ("извлечь значение")

в режиме интерпретации - выкладывает в стек её значение

в режиме компиляции - добавляет к определяемому слову ссылку на wrap-объект, который при исполнении слова выкладывает на вершину стека значение переменной с таким именем.

Примеры


100 a! 150 b! a@ b@ +

100 записали в переменную a, 150 - в переменную b, извлекли и сложили.

(Это лишь пример. Естественно, такой код не имеет смысла для сложения достаточно выполнить эту операцию в стеке - 100 150 +)

Изменение значения переменной


Рассмотрим пример (предположим, что уже выполнено 100 a!):

120 a+

В данном случае постфикс + после названия переменной означает "сложить значение переменной с объектом из стека и записать в эту же переменную". То есть, это аналогично 120 a@ + a!. После интерпретации значение переменной станет 120.

Соответственно, если в стеке ( q - ):
a- вычесть из значения переменной q
a* умножить на q
a/ разделить на q

Удаление переменной


Конструкция:
a\ означает, что переменная будет удалена и станет недоступной.

Сравнение значения переменной


Рассмотрим пример (предположим, что уже выполнено 100 a!):

100 a=

В данном случае постфикс = после названия переменной означает "сравнить значение переменной с объектом из стека на равенство и результат сравнения записать в стек". То есть, это аналогично 100 a@ =. После интерпретации в стек будет записано true.

Соответственно, если в стеке ( q - ):
a# значение переменной не равно q

Интерпретация значения переменной


Рассмотрим пример (предположим, что уже выполнено "2 *" a!):

Тогда в результате интерпретации 100 a^ в стек будет выложено значение 200.

В данном случае постфикс ^ означает интерпретировать значение переменной.

Использование инфиксов


Рассмотрим пример (предположим, что уже выполнено 150 a! 20 b!):

a+b

Аналогично записи a@ b@ +. После интерпретации в стеке 170. (отметим, что такая конструкция пишется слитно, без пробелов)

Соответственно:
a-b это a@ b@ -
a*b это a@ b@ *
a/b это a@ b@ /

Создание переменной с использованием инфикса


Иногда такой способ создания и установки значения перменной является предпочтительным, в частности при разборке параметров запроса в Web-приложении.

a=hello

Аналогично записи "hello" a!. При этом значением переменной всегда является строка, так например a=170 аналогично записи "170" a!.

В случае если строка содержит пробелы, то необходимо строку записывать в кавычках:
a="Hello world!"

Работа с переменными партнера


Если объект Jpho работает совместно с другим объектом Jpho, который для него является партнером, то имеется возможность обратиться к его переменным.

При этом объекты Jpho могут создавать партнерскую цепочку типа:

jpho <- jpho1 <- jpho2 <- jpho3

где jpho есть партнер jpho1, jpho1 есть партнер jpho2 и так далее. Тогда запись:

a@@ - означает извлечь значение переменной в последнем не нулевом партнере.

Аналогично a@! - записать значение в переменную последнего в цепочке партнера.

Надо иметь в виду, что это работает если на стороне последнего в цепочке партнера для записи установлено разрешение, например, словом +varw (по умолчанию), для разрешения чтения, соответственно - +varr (по умолчанию).

Аналогично работают a@+ a@- a@* a@/ a@\ a@= a@#.

* Инфиксы в таких переменных не работают, то есть нельзя написать a@+b@ и нельзя создать переменную с использованием инфикса, типа a@=hello.