# Контекст

В языке 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 ==
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ru.gentee.org/stdlib/context.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
