# πŸ“š ДокумСнтация 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); } } } } ``` ---