Files
FoxLang/DOCUMENTATION.md
2026-01-22 21:31:57 +05:00

868 lines
30 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# πŸ“š ДокумСнтация FoxLang v5.0
## ОглавлСниС
1. [ΠžΡΠ½ΠΎΠ²Ρ‹ синтаксиса](#1-основы-синтаксиса)
2. [ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π’ΠΈΠΏΡ‹](#2-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-ΠΈ-Ρ‚ΠΈΠΏΡ‹)
3. [ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ](#3-ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ)
4. [ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΈ Π›ΠΎΠ³ΠΈΠΊΠ°](#4-ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ°-ΠΈ-Π»ΠΎΠ³ΠΈΠΊΠ°)
5. [Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ конструкции](#5-ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅-конструкции)
6. [ΠœΠ°ΡΡΠΈΠ²Ρ‹](#6-массивы)
7. [ΠœΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Π˜ΠΌΠΏΠΎΡ€Ρ‚](#7-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ-ΠΈ-ΠΈΠΌΠΏΠΎΡ€Ρ‚)
8. [ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ](#8-встроСнныС-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ)
9. [Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ возмоТности ΠΈ HTTP](#9-сСтСвыС-возмоТности-ΠΈ-http)
10. [Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ синтаксис](#10-соврСмСнный-синтаксис)
---
## 1. ΠžΡΠ½ΠΎΠ²Ρ‹ синтаксиса
FoxLang ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ синтаксис, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° C++ ΠΈ Java.
* КаТдая ΠΊΠΎΠΌΠ°Π½Π΄Π° **обязана** Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ с запятой `;`.
* Π‘Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌΠΈ скобками `{ ... }`.
* ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с `//` ΠΈ ΠΈΠ΄ΡƒΡ‚ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки.
* ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ с подчСркиваниями (`user_name`, `get_data`).
```cpp
// Π­Ρ‚ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
print("Hello"); // Команда
string user_name = "john_doe"; // Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ синтаксис
```
---
## 2. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π’ΠΈΠΏΡ‹
Π―Π·Ρ‹ΠΊ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡΡ‚ΡŒ основных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…:
* `int` β€” Π¦Π΅Π»Ρ‹Π΅ числа.
* `float` β€” Π”Ρ€ΠΎΠ±Π½Ρ‹Π΅ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ.
* `string` β€” ВСкст Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ….
* `bool` β€” ЛогичСский Ρ‚ΠΈΠΏ (`true` ΠΈΠ»ΠΈ `false`).
* `void` β€” Π’ΠΈΠΏ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.
**ОбъявлСниС:**
```cpp
int health = 100;
float gravity = 9.8;
string player_name = "Player1";
bool is_alive = true;
```
**ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅:**
```cpp
health = 90;
gravity = 1.62;
player_name = "Player2";
is_alive = false;
```
---
## 3. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
FoxLang ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.
### ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
```cpp
// Ѐункция с Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ
int add(int a, int b) {
return a + b;
}
// Ѐункция Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния
void greet(string name) {
print("Hello, " + name + "!");
}
// Ѐункция Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²
string get_version() {
return "FoxLang 5.0";
}
```
### Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
```cpp
int result = add(5, 3);
greet("Alice");
string version = get_version();
print("Version: " + version);
```
### РСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
```cpp
int factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
int fact5 = factorial(5); // 120
```
### Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
```cpp
int calculate_area(int width, int height) {
int area = width * height; // Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ пСрСмСнная
return area;
}
```
> **Π’Π°ΠΆΠ½ΠΎ:** НСльзя ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΆΠ΅ сущСствуСт Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости.
> ΠŸΡ€ΠΈ присваивании Π΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° `int`, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Π² Ρ†Π΅Π»ΠΎΠ΅ (ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½Π° дробная Ρ‡Π°ΡΡ‚ΡŒ).
---
## 4. ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΈ Π›ΠΎΠ³ΠΈΠΊΠ°
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ стандартныС арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°.
### АрифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
| ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `+` | Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ / ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡ строк | `5 + 5` ΠΈΠ»ΠΈ `"A" + "B"` |
| `-` | Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ | `10 - 2` |
| `*` | Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ | `2 * 2` |
| `/` | Π”Π΅Π»Π΅Π½ΠΈΠ΅ | `10 / 2` |
| `%` | ΠžΡΡ‚Π°Ρ‚ΠΎΠΊ ΠΎΡ‚ дСлСния | `10 % 3` (Π²Π΅Ρ€Π½Π΅Ρ‚ 1) |
| `++` | Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ (ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° 1) | `i++` (Π²Π΅Ρ€Π½Π΅Ρ‚ староС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ) |
### ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния
ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ `1` (истина) ΠΈΠ»ΠΈ `0` (лоТь).
| ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `==` | Π Π°Π²Π½ΠΎ | `x == 5` |
| `!=` | НС Ρ€Π°Π²Π½ΠΎ | `x != 5` |
| `<` | МСньшС | `x < 10` |
| `>` | Π‘ΠΎΠ»ΡŒΡˆΠ΅ | `x > 0` |
### ЛогичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
FoxLang ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с boolean значСниями:
| ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `&&` | ЛогичСскоС И (AND) | `(x > 0) && (x < 10)` |
| `\|\|` | ЛогичСскоС Π˜Π›Π˜ (OR) | `(x == 0) \|\| (x == 1)` |
| `!` | ЛогичСскоС НЕ (NOT) | `!(x == 0)` |
```cpp
bool is_valid = (age >= 18) && (age <= 65);
bool is_weekend = (day == "Saturday") || (day == "Sunday");
bool is_not_empty = !name.empty();
```
---
## 5. Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ конструкции
### Условия (If / Else)
```cpp
int x = 10;
if (x == 10) {
print("X is ten");
} else {
print("X is not ten");
}
```
### Π¦ΠΈΠΊΠ»Ρ‹ (While)
ВыполняСт Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠΊΠ° условиС истинно.
```cpp
int i = 0;
while (i < 5) {
print("Loop iteration: " + i);
i++;
}
```
### Π¦ΠΈΠΊΠ»Ρ‹ (For)
ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Ρ†ΠΈΠΊΠ» `for`, состоящий ΠΈΠ· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, условия ΠΈ шага.
```cpp
for (int i = 0; i < 5; i++) {
print("For loop: " + i);
}
```
### Switch/Case конструкции
FoxLang ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ конструкции `switch/case` с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ `break` ΠΈ `default`:
```cpp
int day = 3;
switch (day) {
case 1:
print("ПонСдСльник");
break;
case 2:
print("Π’Ρ‚ΠΎΡ€Π½ΠΈΠΊ");
break;
case 3:
print("Π‘Ρ€Π΅Π΄Π°");
break;
default:
print("Π”Ρ€ΡƒΠ³ΠΎΠΉ дСнь");
break;
}
```
### Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ
- `break` β€” ΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π° ΠΈΠ»ΠΈ switch
- `continue` β€” ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π°
```cpp
for (int i = 0; i < 10; i++) {
if (i == 5) {
continue; // ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ 5
}
if (i == 8) {
break; // Π’Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°
}
print(i);
}
```
### ΠžΠ±Π»Π°ΡΡ‚ΠΈ видимости (Scope)
Π‘Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° `{ ... }` ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ°, нСдоступны снаруТи.
```cpp
int global = 10;
{
int local = 5;
print(global); // 10
print(local); // 5
}
// print(local); // Ошибка! ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ local Π½Π΅ сущСствуСт здСсь.
```
---
## 6. ΠœΠ°ΡΡΠΈΠ²Ρ‹
ΠœΠ°ΡΡΠΈΠ²Ρ‹ Π² FoxLang ΠΈΠΌΠ΅ΡŽΡ‚ фиксированный Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ создании.
1. **Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅:** `array имя Ρ€Π°Π·ΠΌΠ΅Ρ€;`
2. **Π—Π°ΠΏΠΈΡΡŒ:** `set(имя, индСкс, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅);`
3. **Π§Ρ‚Π΅Π½ΠΈΠ΅:** `get(имя, индСкс)`
4. **Π Π°Π·ΠΌΠ΅Ρ€:** `size(имя)`
```cpp
array chest 3; // Массив Π½Π° 3 элСмСнта
set(chest, 0, 55); // Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ 55 Π² индСкс 0
print(get(chest, 0)); // Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ 55
```
---
## 7. ΠœΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Π˜ΠΌΠΏΠΎΡ€Ρ‚
FoxLang ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `include("ΠΏΡƒΡ‚ΡŒ/ΠΊ/Ρ„Π°ΠΉΠ»Ρƒ.fox");`.
**ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ:**
* ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΊΠΎΠ΄, находящийся Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ становятся доступными Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ„Π°ΠΉΠ»Π΅.
---
## 8. ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
### Π’Π²ΠΎΠ΄/Π’Ρ‹Π²ΠΎΠ΄
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `print(expr...)` | Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ тСкст ΠΈΠ»ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТСния Π² консоль. ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ нСсколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². | `print("Hello", name);` |
| `input()` | Π–Π΄Π΅Ρ‚ Π²Π²ΠΎΠ΄Π° строки ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Ρ‘. | `string name = input();` |
| `input(prompt)` | Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΆΠ΄Π΅Ρ‚ Π²Π²ΠΎΠ΄Π° строки. | `string name = input("Имя: ");` |
### ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `round(number)` | ΠžΠΊΡ€ΡƒΠ³Π»ΡΠ΅Ρ‚ Π΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ число Π΄ΠΎ блиТайшСго Ρ†Π΅Π»ΠΎΠ³ΠΎ. | `int x = round(3.7); // 4` |
| `random(min, max)` | Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ случайноС число Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ min Π΄ΠΎ max Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. | `int dice = random(1, 6);` |
### Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `read_file(filename)` | Π§ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π½Π΅ΠΏΡƒΡΡ‚ΡƒΡŽ строку ΠΈΠ· Ρ„Π°ΠΉΠ»Π° (ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ #). | `string config = read_file("config.txt");` |
### HTTP запросы
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `httpget(url)` | ВыполняСт HTTP GET запрос ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра. | `string data = httpget("https://api.example.com");` |
| `httppost(url, data)` | ВыполняСт HTTP POST запрос с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. | `string response = httppost(url, "{\"key\":\"value\"}");` |
| `httppost(url, data, content_type)` | HTTP POST с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. | `httppost(url, data, "application/json");` |
| `httpput(url, data)` | ВыполняСт HTTP PUT запрос с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. | `string response = httpput(url, data);` |
| `httpput(url, data, content_type)` | HTTP PUT с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. | `httpput(url, data, "text/plain");` |
| `httpdelete(url)` | ВыполняСт HTTP DELETE запрос. | `string response = httpdelete(url);` |
### FastAPI-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Π²Π΅Π±-сСрвСр
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `server_start(port)` | ЗапускаСт HTTP сСрвСр Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡ€Ρ‚Ρƒ. | `string result = server_start(8080);` |
| `server_stop()` | ΠžΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ HTTP сСрвСр. | `string result = server_stop();` |
| `route_get(path, handler)` | РСгистрируСт GET ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ. | `string result = route_get("/api", "handler");` |
| `route_post(path, handler)` | РСгистрируСт POST ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ. | `string result = route_post("/users", "create");` |
| `send_response(data)` | ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Ρ…). | `send_response("{\"status\":\"ok\"}");` |
### Π Π°Π±ΠΎΡ‚Π° со строками ΠΈ JSON
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `json_get(json_string, key)` | Π˜Π·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ ΠΈΠ· JSON строки. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ΠΈ: "chat_id", "text", "update_id". | `string chat_id = json_get(response, "chat_id");` |
| `str_contains(text, substring)` | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, содСрТит Π»ΠΈ строка подстроку. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `true` ΠΈΠ»ΠΈ `false`. | `bool found = str_contains("Hello World", "World");` |
| `str_to_int(string)` | ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку Π² Ρ†Π΅Π»ΠΎΠ΅ число. ΠŸΡ€ΠΈ ошибкС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0. | `int num = str_to_int("123");` |
### Π’Π²ΠΎΠ΄ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ (Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ)
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `getch()` | Π§ΠΈΡ‚Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ символ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π±Π΅Π· наТатия Enter. | `string key = getch();` |
| `kbhit()` | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, Π±Ρ‹Π»Π° Π»ΠΈ Π½Π°ΠΆΠ°Ρ‚Π° клавиша. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `true` ΠΈΠ»ΠΈ `false`. | `bool pressed = kbhit();` |
### БистСмныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
| --- | --- | --- |
| `wait(milliseconds)` | ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ количСство миллисСкунд. | `wait(1000); // ΠŸΠ°ΡƒΠ·Π° 1 сСкунда` |
| `fox()` | ΠŸΠ°ΡΡ…Π°Π»ΠΊΠ°: Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ языка "FoxLang". | `fox();` |
---
## 9. Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ возмоТности ΠΈ HTTP
FoxLang прСдоставляСт ΠΌΠΎΡ‰Π½Ρ‹Π΅ возмоТности для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ΅Ρ‚ΡŒΡŽ ΠΈ HTTP запросами. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ всС основныС HTTP ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ созданиС Π²Π΅Π±-сСрвСров.
### HTTP ΠΊΠ»ΠΈΠ΅Π½Ρ‚ - ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° запросов
#### GET запросы
```cpp
// ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ GET запрос
string response = httpget("https://api.github.com/users/octocat");
print("Response: " + response);
// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ JSON Π΄Π°Π½Π½Ρ‹Ρ…
string user_data = httpget("https://jsonplaceholder.typicode.com/users/1");
print("User: " + user_data);
```
#### POST запросы
```cpp
// POST с JSON Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
string json_data = "{\"name\":\"John\",\"email\":\"john@example.com\"}";
string response = httppost("https://jsonplaceholder.typicode.com/users", json_data, "application/json");
print("Created: " + response);
// POST Π±Π΅Π· указания Content-Type (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ application/json)
string simple_post = httppost("https://httpbin.org/post", "{\"test\":\"data\"}");
print("POST result: " + simple_post);
```
#### PUT запросы (ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…)
```cpp
// ОбновлСниС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ рСсурса
string update_data = "{\"name\":\"John Updated\",\"email\":\"john.new@example.com\"}";
string updated = httpput("https://jsonplaceholder.typicode.com/users/1", update_data, "application/json");
print("Updated: " + updated);
```
#### DELETE запросы (ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…)
```cpp
// Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ рСсурса
string deleted = httpdelete("https://jsonplaceholder.typicode.com/users/1");
print("Deleted: " + deleted);
```
### Π Π°Π±ΠΎΡ‚Π° с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ API
#### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с REST API
```cpp
void work_with_api() {
string base_url = "https://jsonplaceholder.typicode.com";
// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ
string users = httpget(base_url + "/users");
print("All users: " + users);
// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
string user = httpget(base_url + "/users/1");
print("User 1: " + user);
// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ пост
string new_post = "{\"title\":\"My Post\",\"body\":\"Post content\",\"userId\":1}";
string created = httppost(base_url + "/posts", new_post, "application/json");
print("Created post: " + created);
// ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ пост
string updated_post = "{\"id\":1,\"title\":\"Updated Post\",\"body\":\"New content\",\"userId\":1}";
string updated = httpput(base_url + "/posts/1", updated_post, "application/json");
print("Updated post: " + updated);
// Π£Π΄Π°Π»ΠΈΡ‚ΡŒ пост
string deleted = httpdelete(base_url + "/posts/1");
print("Deleted post: " + deleted);
}
work_with_api();
```
### FastAPI-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Π²Π΅Π±-сСрвСр
FoxLang ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ созданиС Π²Π΅Π±-сСрвСров Ρ‡Π΅Ρ€Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ `net.fox`:
#### Быстрый старт сСрвСра
```cpp
include("src/net.fox");
// ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ²
void api_home() {
json_response("{\"message\":\"Welcome to FoxLang API!\",\"version\":\"5.0.1\"}");
}
void api_users() {
json_response("{\"users\":[{\"id\":1,\"name\":\"Alice\"},{\"id\":2,\"name\":\"Bob\"}]}");
}
void create_user() {
json_response("{\"message\":\"User created\",\"id\":3,\"name\":\"Charlie\"}");
}
// Запуск сСрвСра
void main() {
// Π‘Ρ‚Π°Ρ€Ρ‚ сСрвСра Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 8080
start_server(8080);
// РСгистрация ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ²
register_get("/", "api_home");
register_get("/users", "api_users");
register_post("/users", "create_user");
print("πŸš€ Server running on http://localhost:8080");
print("Available endpoints:");
print(" GET / - Welcome message");
print(" GET /users - List users");
print(" POST /users - Create user");
}
main();
```
#### ВстроСнныС сСрвСрныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
|---------|----------|---------|
| `server_start(port)` | ЗапускаСт HTTP сСрвСр | `server_start(8080);` |
| `server_stop()` | ΠžΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ сСрвСр | `server_stop();` |
| `route_get(path, handler)` | РСгистрируСт GET ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ | `route_get("/api", "handler");` |
| `route_post(path, handler)` | РСгистрируСт POST ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ | `route_post("/users", "create");` |
| `send_response(data)` | ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ | `send_response("{\"status\":\"ok\"}");` |
#### Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° net.fox - ВысокоуровнСвыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
```cpp
include("src/net.fox");
// Π£Π΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:
start_server(8080); // Запуск сСрвСра
register_get("/", "handler"); // РСгистрация GET ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°
register_post("/api", "create"); // РСгистрация POST ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°
json_response("{\"key\":\"value\"}"); // JSON ΠΎΡ‚Π²Π΅Ρ‚
text_response("Hello World"); // ВСкстовый ΠΎΡ‚Π²Π΅Ρ‚
```
### ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹
#### HTTP ΠΊΠ»ΠΈΠ΅Π½Ρ‚ для тСстирования API
```cpp
void test_external_apis() {
// ВСст GitHub API
string github_user = httpget("https://api.github.com/users/octocat");
print("GitHub user: " + github_user);
// ВСст ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎΠ³ΠΎ API (ΠΏΡ€ΠΈΠΌΠ΅Ρ€)
string weather = httpget("https://api.openweathermap.org/data/2.5/weather?q=Moscow&appid=YOUR_KEY");
print("Weather: " + weather);
// ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π² webhook
string webhook_data = "{\"text\":\"Hello from FoxLang!\"}";
string webhook_response = httppost("https://hooks.slack.com/services/YOUR/WEBHOOK/URL", webhook_data);
print("Webhook sent: " + webhook_response);
}
```
#### ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ API сСрвСр с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…
```cpp
include("src/net.fox");
global array users 10;
global int user_count = 0;
void get_users() {
string users_json = "{\"users\":[";
int i = 0;
while (i < user_count) {
if (i > 0) {
users_json = users_json + ",";
}
users_json = users_json + "{\"id\":" + i + ",\"name\":\"" + get(users, i) + "\"}";
i = i + 1;
}
users_json = users_json + "],\"total\":" + user_count + "}";
json_response(users_json);
}
void add_user() {
if (user_count < 10) {
set(users, user_count, "User" + user_count);
user_count = user_count + 1;
json_response("{\"message\":\"User added\",\"id\":" + (user_count - 1) + "}");
} else {
json_response("{\"error\":\"Maximum users reached\"}");
}
}
void main() {
start_server(3000);
register_get("/users", "get_users");
register_post("/users", "add_user");
print("API server ready on http://localhost:3000");
}
main();
```
### ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ
```cpp
void safe_http_request(string url) {
string response = httpget(url);
if (response == "") {
print("❌ Request failed: " + url);
return;
}
// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ (простая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°)
if (str_contains(response, "error") || str_contains(response, "Error")) {
print("⚠️ API returned error: " + response);
return;
}
print("βœ… Success: " + response);
}
// ИспользованиС
safe_http_request("https://api.github.com/users/nonexistent");
safe_http_request("https://api.github.com/users/octocat");
```
### ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ справочник HTTP Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
#### πŸ“‹ ВсС встроСнныС HTTP Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
|---------|----------|---------|
| `httpget(url)` | GET запрос | `httpget("https://api.com/users")` |
| `httppost(url, data)` | POST запрос | `httppost(url, "{\"key\":\"value\"}")` |
| `httppost(url, data, type)` | POST с Content-Type | `httppost(url, data, "application/json")` |
| `httpput(url, data)` | PUT запрос | `httpput(url, "{\"updated\":true}")` |
| `httpput(url, data, type)` | PUT с Content-Type | `httpput(url, data, "text/plain")` |
| `httpdelete(url)` | DELETE запрос | `httpdelete("https://api.com/item/1")` |
#### πŸš€ Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (встроСнныС)
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
|---------|----------|---------|
| `server_start(port)` | Запуск сСрвСра | `server_start(8080)` |
| `server_stop()` | ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° сСрвСра | `server_stop()` |
| `route_get(path, handler)` | GET ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ | `route_get("/api", "handler")` |
| `route_post(path, handler)` | POST ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ | `route_post("/users", "create")` |
| `send_response(data)` | ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΎΡ‚Π²Π΅Ρ‚Π° | `send_response("{\"ok\":true}")` |
#### πŸ“š Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° net.fox (высокоуровнСвыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ)
| Ѐункция | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ |
|---------|----------|---------|
| `start_server(port)` | Π£Π΄ΠΎΠ±Π½Ρ‹ΠΉ запуск сСрвСра | `start_server(8080)` |
| `register_get(path, handler)` | РСгистрация GET | `register_get("/", "home")` |
| `register_post(path, handler)` | РСгистрация POST | `register_post("/api", "create")` |
| `json_response(json)` | JSON ΠΎΡ‚Π²Π΅Ρ‚ | `json_response("{\"status\":\"ok\"}")` |
| `text_response(text)` | ВСкстовый ΠΎΡ‚Π²Π΅Ρ‚ | `text_response("Hello World")` |
#### ⚑ БыстрыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹
**HTTP ΠΊΠ»ΠΈΠ΅Π½Ρ‚:**
```cpp
// GET
string user = httpget("https://api.github.com/users/octocat");
// POST
string data = "{\"name\":\"John\"}";
string created = httppost("https://api.com/users", data, "application/json");
// PUT
string updated = httpput("https://api.com/users/1", "{\"name\":\"Jane\"}");
// DELETE
string deleted = httpdelete("https://api.com/users/1");
```
**Π’Π΅Π±-сСрвСр:**
```cpp
include("src/net.fox");
void api_home() {
json_response("{\"message\":\"Hello FoxLang API!\"}");
}
void main() {
start_server(8080);
register_get("/", "api_home");
print("πŸš€ Server: http://localhost:8080");
}
main();
```
#### πŸ§ͺ ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΈ запуск
```bash
# ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ
cd src && g++ -std=c++17 main.cpp Lexer.cpp Parser.cpp -o foxlang
# Запуск HTTP ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
./foxlang examples/http_demo.fox
# Запуск Π²Π΅Π±-сСрвСра
./foxlang examples/fastapi_demo.fox
```
### Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования
#### Webhook ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ°
```cpp
void send_notification(string message) {
string webhook_url = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL";
string payload = "{\"text\":\"" + message + "\"}";
string response = httppost(webhook_url, payload);
if (response != "") {
print("βœ… Notification sent");
} else {
print("❌ Failed to send notification");
}
}
send_notification("Hello from FoxLang!");
```
#### ΠŸΠΎΠ»Π½Ρ‹ΠΉ REST API сСрвСр с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
```cpp
include("src/net.fox");
global array users 10;
global int user_count = 0;
void get_users() {
string users_json = "{\"users\":[";
int i = 0;
while (i < user_count) {
if (i > 0) {
users_json = users_json + ",";
}
users_json = users_json + "{\"id\":" + i + ",\"name\":\"" + get(users, i) + "\"}";
i = i + 1;
}
users_json = users_json + "],\"total\":" + user_count + "}";
json_response(users_json);
}
void add_user() {
if (user_count < 10) {
set(users, user_count, "User" + user_count);
user_count = user_count + 1;
json_response("{\"message\":\"User added\",\"id\":" + (user_count - 1) + "}");
} else {
json_response("{\"error\":\"Maximum users reached\"}");
}
}
void main() {
start_server(3000);
register_get("/users", "get_users");
register_post("/users", "add_user");
print("API server ready on http://localhost:3000");
}
main();
```
#### ВСстированиС мноТСствСнных API
```cpp
void test_multiple_apis() {
print("πŸ§ͺ Testing multiple APIs:");
// GitHub API
string github = httpget("https://api.github.com/users/octocat");
print("GitHub API: " + github);
// JSONPlaceholder API
string posts = httpget("https://jsonplaceholder.typicode.com/posts/1");
print("JSONPlaceholder: " + posts);
// HTTPBin для тСстирования POST
string test_post = httppost("https://httpbin.org/post", "{\"test\":\"data\"}");
print("HTTPBin POST: " + test_post);
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ поста
string new_post = "{\"title\":\"FoxLang Test\",\"body\":\"API testing\"}";
string created = httppost("https://jsonplaceholder.typicode.com/posts", new_post);
print("Created post: " + created);
}
test_multiple_apis();
```
#### ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ счСтчик API
```cpp
include("src/net.fox");
global int counter = 0;
void get_counter() {
json_response("{\"counter\":" + counter + ",\"message\":\"Current value\"}");
}
void increment_counter() {
counter = counter + 1;
json_response("{\"counter\":" + counter + ",\"message\":\"Incremented\"}");
}
void decrement_counter() {
counter = counter - 1;
json_response("{\"counter\":" + counter + ",\"message\":\"Decremented\"}");
}
void reset_counter() {
counter = 0;
json_response("{\"counter\":0,\"message\":\"Reset to zero\"}");
}
void main() {
start_server(4000);
register_get("/counter", "get_counter");
register_post("/counter/increment", "increment_counter");
register_post("/counter/decrement", "decrement_counter");
register_post("/counter/reset", "reset_counter");
print("πŸ”’ Counter API running on http://localhost:4000");
print("Available endpoints:");
print(" GET /counter - Get current value");
print(" POST /counter/increment - Add 1");
print(" POST /counter/decrement - Subtract 1");
print(" POST /counter/reset - Reset to 0");
}
main();
```
### ВСхничСскиС особСнности
#### Content-Type Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ
- По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ POST/PUT ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ `application/json`
- МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свой: `httppost(url, data, "text/plain")`
- ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ: `application/json`, `text/plain`, `application/x-www-form-urlencoded`
#### ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²
- ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ `string` с Ρ‚Π΅Π»ΠΎΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π°
- ΠŸΡƒΡΡ‚Π°Ρ строка `""` ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ соСдинСния
- HTTP ΠΊΠΎΠ΄Ρ‹ ошибок (404, 500) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ‚Π΅Π»ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° сСрвСра
#### Π‘Π΅Ρ€Π²Π΅Ρ€
- Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ HTTP сСрвСра
- ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ GET ΠΈ POST ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
- JSON ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ автоматичСски ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Content-Type
- Π‘Π΅Ρ€Π²Π΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅
---
## 10. Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ синтаксис
FoxLang ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ соврСмСнныС соглашСния ΠΏΠΎ имСнованию ΠΈ синтаксису:
### Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ с подчСркиваниями
Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ старых вСрсий, FoxLang Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ с подчСркиваниями:
```cpp
// ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
string user_name = "john_doe";
int max_health = 100;
bool is_game_over = false;
// Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ
void calculate_damage(int base_damage, float multiplier) {
// ...
}
int get_player_score() {
return player_score;
}
```
### Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
FoxLang ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ объявлСниС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом `global`:
```cpp
global int game_score = 0;
global string player_name = "Unknown";
void update_score(int points) {
game_score = game_score + points;
}
void main() {
print("Score: " + game_score);
update_score(100);
print("New score: " + game_score);
}
```
### ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ соврСмСнного ΠΊΠΎΠ΄Π°
```cpp
// БоврСмСнная функция с подчСркиваниями
bool check_user_permissions(string user_role, int required_level) {
if (user_role == "admin") {
return true;
}
int user_level = get_user_level(user_role);
return user_level >= required_level;
}
// Π Π°Π±ΠΎΡ‚Π° с массивами
void sort_user_scores(array scores, int count) {
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (get(scores, j) > get(scores, j + 1)) {
int temp = get(scores, j);
set(scores, j, get(scores, j + 1));
set(scores, j + 1, temp);
}
}
}
}
```
---