> For the complete documentation index, see [llms.txt](https://ru.gentee.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ru.gentee.org/stdlib/context.md).

# Контекст

В языке Gentee отсутствуют глобальные переменные. Одним из способов обмена данными является специальный ассоциативный массив строк. Любая функция может безопасно добавлять туда пары ключ-значение или получать значение по ключу. Кроме этого, в контекст встроена возможность подстановки других существующих значений из контекста. Например, если определены пары *"a": "String A"* и *"b": "String B"*, то *"#a# and #b#"* возвратит *"String A and String B"*. Ниже описаны функции и операторы для работы с контекстом.

* [Ctx( str input ) str](/stdlib/context.md#ctx-str-input-str)
* [CtxGet( str key ) str](/stdlib/context.md#ctxget-str-key-str)
* [CtxIs( str key ) bool](/stdlib/context.md#ctxis-str-key-bool)
* [CtxSet( str key, str val ) str](/stdlib/context.md#ctxset-str-key-str-val-str)
* [CtxSet( str key, bool b ) str](/stdlib/context.md#ctxset-str-key-bool-b-str)
* [CtxSet( str key, float f ) str](/stdlib/context.md#ctxset-str-key-float-f-str)
* [CtxSet( str key, int i ) str](/stdlib/context.md#ctxset-str-key-int-i-str)
* [CtxValue( str key ) str](/stdlib/context.md#ctxvalue-str-key-str)

## Операторы

| Оператор           | Результат | Описание                                                                            |
| ------------------ | --------- | ----------------------------------------------------------------------------------- |
| **#** ident        | str       | Тоже самое, что *CtxGet(key)*, где *ident* является ключом контекста.               |
| **##** str         | str       | Тоже самое, что *Ctx(str)*. Указывается любое выражение, которое возвращает строку. |
| ident **#=** str   | str       | Тоже самое, что *CtxSet(str key, str s)*, где *ident* - это ключ контекста.         |
| ident **#=** bool  | str       | Тоже самое, что *CtxSet(str key, bool b)*, где *ident* - это ключ контекста.        |
| ident **#=** float | str       | Тоже самое, что *CtxSet(str key, float f)*, где *ident* - это ключ контекста.       |
| ident **#=** int   | str       | Тоже самое, что *CtxSet(str key, int i)*, где *ident* - это ключ контекста.         |

```
run str {
  str s = ` #AºB#`
  AºB #= `ººº`
  b #= 71
  CD #= `#AºB# #b# == ` 
  return #CD + #b + ##s
}
// ººº 71 == 71 ººº
```

## Функции

### Ctx(str input) str

Функция *Ctx* заменяет в строке *input* подстроки **#keyname#** на значение соответствующего ключа, если он существует.

```
run str {
    CtxSetBool(`qq`, true)
    CtxSetFloat(`ff`, 3.1415)
    CtxSet(`out`, "it is #qq# that PI equals #ff#")
    return Ctx("#out#. #notexist#")
}
// it is true that PI equals 3.1415. #notexist#
```

### CtxGet(str key) str

Функция *CtxGet* получает значение ключа *key*, заменяет в нём все вхождения других ключей и возвращает полученную строку. Если указанный ключ отсутствует, то возвратится пустая строка.

```
func init {
   CtxSet(`a1`, `end`)
   CtxSet(`a2`, `=#a1#=`)
   CtxSet(`a3`, `+#a2#+#a1#`)
}

run str {
    init()
    return CtxGet(`a3`)
}
// +=end=+end
```

### CtxIs(str key) bool

Функция *CtxIs* возвращает *true*, если в контексте существует значение с указанным ключом. В противном случае, возвращается *false*.

### CtxSet(str key, str val) str

Функция *CtxSet* добавляет ключ и значение в контекст. Если ключ уже существует, то ему будет присвоено новое значение. Функция возвращает присвоенное значение ключа.

### CtxSet(str key, bool b) str

Функция *CtxSet* добавляет ключ и логическое значение *b* в контекст. Логическое значение будет преобразовано к строке *true* или *false*. Функция возвращает присвоенное значение ключа.

### CtxSet(str key, float f) str

Функция *CtxSet* добавляет ключ и число с плавающей точкой *f* в контекст. Число будет преобразовано в строку. Функция возвращает присвоенное значение ключа.

### CtxSet(str key, int i) str

Функция *CtxSet* добавляет ключ и целое число *i* в контекст. Число будет преобразовано в строку. Функция возвращает присвоенное значение ключа.

### CtxValue(str key) str

Функция *CtxValue* возвращает значение ключа *key* как есть. В отличие от функции **CtxGet**, она не заменяет вхождения других ключей. Если указанный ключ отсутствует, то возвратится пустая строка.

```
run str {
    CtxSet(`test`, `?value`)
    CtxSet(`param`, `#test# ==`)
    return CtxValue(`param`) + CtxValue(`nop`) + CtxGet(`param`)
}
// #test# ==?value ==
```
