├── .gitignore ├── Примеры ├── CMakeLists.txt └── Русь.cpp ├── ВедиКрестКрест ├── CMakeLists.txt ├── Потокъ.hpp ├── Языкъ.hpp └── Строка.hpp ├── CMakeLists.txt └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .vs/ 2 | out/ 3 | -------------------------------------------------------------------------------- /Примеры/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SRC 2 | Русь.cpp 3 | ) 4 | 5 | add_executable(HelloWorld Русь.cpp) 6 | target_link_libraries(HelloWorld SlavicCpp) 7 | -------------------------------------------------------------------------------- /ВедиКрестКрест/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SRC 2 | Языкъ.hpp 3 | Потокъ.hpp 4 | Строка.hpp 5 | ) 6 | 7 | add_library(SlavicCpp INTERFACE ${SRC}) 8 | target_include_directories(SlavicCpp INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}") 9 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.17) 2 | 3 | set(CMAKE_CXX_STANDARD 17) 4 | set(CMAKE_CXX_STANDARD_REQUIRED ON) 5 | 6 | project(SlavicCpp C CXX) 7 | 8 | add_subdirectory(ВедиКрестКрест) 9 | add_subdirectory(Примеры) 10 | -------------------------------------------------------------------------------- /Примеры/Русь.cpp: -------------------------------------------------------------------------------- 1 | #include <Языкъ.hpp> 2 | #include <Потокъ.hpp> 3 | #include <Строка.hpp> 4 | 5 | целое32 царь_батюшка_главный() 6 | { 7 | вперёдъ_славяне; 8 | Русь::строка строченька = "Славься Русь!"; 9 | Русь::молвить << строченька << Русь::прыгъ_скокъ; 10 | воздать Перуну_Отцу_Всего_Сущего; 11 | } 12 | -------------------------------------------------------------------------------- /ВедиКрестКрест/Потокъ.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "Языкъ.hpp" 3 | #include 4 | 5 | namespace Русь 6 | { 7 | using потокъ = std::ostream; 8 | 9 | свой потокъ& молвить = std::cout; 10 | 11 | template 12 | std::basic_ostream& прыгъ_скокъ(std::basic_ostream& stream) { 13 | return std::endl(stream); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ВедиКрестКрест/Языкъ.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | #define вперёдъ_славяне std::setlocale(LC_ALL, "ru-RU") 6 | #define царь_батюшка_главный main 7 | 8 | // ключевые слова 9 | 10 | #define воздать return 11 | #define свой static 12 | 13 | // основные типы 14 | 15 | using тьма = void; 16 | 17 | using целое8 = int8_t; 18 | using целое16 = int16_t; 19 | using целое32 = int32_t; 20 | using целое64 = int64_t; 21 | 22 | inline constexpr целое32 Перуну_Отцу_Всего_Сущего = 0; 23 | inline constexpr целое32 Матери_Сырой_Земле = -1; 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # В++ 2 | 3 | Веди крестъ крестъ - великій языкъ программированія древнихъ Русовъ. 4 | 5 | ### Особенности 6 | 7 | В отличие от других реализаций стандарта В++, в этой использование препроцессора сведено к минимуму, то есть `#define` используется лишь 8 | при абсолютной необходимости, в основном для ключевых слов. 9 | 10 | Базовые типы данных определены с помощью `using`, константы - с помощью `constexpr`. Однако, возникает проблема с классами из стандартной библиотеки: 11 | даже после переименования через `using` или `typedef` их методы будут иметь те же англоязычные названия. Это было решено с помощью приватного наследования 12 | (например, [в коде строки](https://github.com/n-dub/slavic-cpp/blob/main/%D0%92%D0%B5%D0%B4%D0%B8%D0%9A%D1%80%D0%B5%D1%81%D1%82%D0%9A%D1%80%D0%B5%D1%81%D1%82/%D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%B0.hpp)). 13 | 14 | ### Пример кода 15 | 16 | ```cpp 17 | #include <Языкъ.h> 18 | #include <Потокъ.h> 19 | #include <Строка.h> 20 | 21 | целое32 царь_батюшка_главный() 22 | { 23 | вперёдъ_славяне; 24 | Русь::строка строченька = "Славься Русь!"; 25 | Русь::молвить << строченька << Русь::прыгъ_скокъ; 26 | воздать Перуну_Отцу_Всего_Сущего; 27 | } 28 | 29 | ``` 30 | -------------------------------------------------------------------------------- /ВедиКрестКрест/Строка.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "Языкъ.hpp" 3 | #include "Потокъ.hpp" 4 | #include 5 | 6 | namespace Русь 7 | { 8 | template, class TAlloc = std::allocator> 9 | class строка_базированная : std::basic_string 10 | { 11 | public: 12 | using база = std::basic_string; 13 | 14 | база& в_базу() 15 | { 16 | return static_cast<база&>(*this); 17 | } 18 | 19 | const база& в_базу() const 20 | { 21 | return static_cast(*this); 22 | } 23 | 24 | строка_базированная() : basic_string() 25 | { 26 | } 27 | 28 | explicit строка_базированная(const TAlloc& _Al) noexcept 29 | : basic_string(_Al) 30 | { 31 | } 32 | 33 | строка_базированная(const basic_string& _Right) 34 | : basic_string(_Right) 35 | { 36 | } 37 | 38 | строка_базированная(const basic_string& _Right, const TAlloc& _Al) 39 | : basic_string(_Right, _Al) 40 | { 41 | } 42 | 43 | строка_базированная(const basic_string& _Right, const size_type _Roff, const TAlloc& _Al = TAlloc()) 44 | : basic_string(_Right, _Roff, _Al) 45 | { 46 | } 47 | 48 | строка_базированная( 49 | const basic_string& _Right, const size_type _Roff, const size_type _Count, const TAlloc& _Al = TAlloc()) 50 | : basic_string(_Right, _Roff, _Count, _Al) 51 | { 52 | } 53 | 54 | строка_базированная(_In_reads_(_Count) const T* const _Ptr, const size_type _Count) 55 | : _Mypair(_Zero_then_variadic_args_t{}) { 56 | _Construct<_Construct_strategy::_From_ptr>(_Ptr, _Count); 57 | } 58 | 59 | строка_базированная(const T* const _Ptr, const size_type _Count, const TAlloc& _Al) 60 | : basic_string(_Ptr, _Count, _Al) 61 | { 62 | } 63 | 64 | строка_базированная(const T* const _Ptr) 65 | : basic_string(_Ptr) 66 | { 67 | } 68 | }; 69 | 70 | using строка = строка_базированная; 71 | 72 | template 73 | inline потокъ& operator<<(потокъ& левый, const строка_базированная& правый) 74 | { 75 | return левый << правый.в_базу(); 76 | } 77 | } 78 | --------------------------------------------------------------------------------