NewLang Project
Yet another programm language
Loading...
Searching...
No Matches
system.h
Go to the documentation of this file.
1#ifndef NEWLANG_SYSTEM_H_
2#define NEWLANG_SYSTEM_H_
3
4//#include "pch.h"
5#include "nlc-rt.h"
6
7#include "runtime.h"
8#include "builtin.h"
9//#include "module.h"
10
11namespace newlang {
12
13 namespace runtime {
14
15 // os.name - имя операционной системы. Доступные варианты: ‘posix’, ’nt’, ‘mac’, ‘os2’, ‘ce’, ‘java’.
16 // os.environ - словарь переменных окружения. Изменяемый (можно добавлять и удалять переменные окружения).
17 // os.getlogin()
18 // os.getpid() - текущий id процесса.
19 // os.uname() - информация об ОС. возвращает объект с атрибутами:
20 // sysname - имя операционной системы,
21 // nodename - имя машины в сети (определяется реализацией),
22 // release - релиз,
23 // version - версия,
24 // machine - идентификатор машины.
25 // os.system(command) - исполняет системную команду, возвращает код её завершения (в случае успеха 0).
26 //
27 //
28 // os.chdir(path) - смена текущей директории.
29 // os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True) - смена прав доступа к объекту (mode - восьмеричное число).
30 // os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True) - меняет id владельца и группы (Unix).
31 // os.getcwd() - текущая рабочая директория.
32 // os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True) - создаёт жёсткую ссылку.
33 // os.listdir(path=".") - список файлов и директорий в папке.
34 // os.mkdir(path, mode=0o777, *, dir_fd=None) - создаёт директорию. OSError, если директория существует.
35 // os.makedirs(path, mode=0o777, exist_ok=False) - создаёт директорию, создавая при этом промежуточные директории.
36 // os.remove(path, *, dir_fd=None) - удаляет путь к файлу.
37 // os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) - переименовывает файл или директорию из src в dst.
38 // os.renames(old, new) - переименовывает old в new, создавая промежуточные директории.
39 // os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None) - переименовывает из src в dst с принудительной заменой.
40 // os.rmdir(path, *, dir_fd=None) - удаляет пустую директорию.
41 // os.removedirs(path) - удаляет директорию, затем пытается удалить родительские директории, и удаляет их рекурсивно, пока они пусты.
42 // os.symlink(source, link_name, target_is_directory=False, *, dir_fd=None) - создаёт символическую ссылку на объект.
43 // os.sync() - записывает все данные на диск (Unix).
44 // os.truncate(path, length) - обрезает файл до длины length.
45 // os.utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True) - модификация времени последнего доступа и изменения файла. Либо times - кортеж (время доступа в секундах, время изменения в секундах), либо ns - кортеж (время доступа в наносекундах, время изменения в наносекундах).
46 // os.walk(top, topdown=True, onerror=None, followlinks=False) - генерация имён файлов в дереве каталогов, сверху вниз (если topdown равен True), либо снизу вверх (если False). Для каждого каталога функция walk возвращает кортеж (путь к каталогу, список каталогов, список файлов).
47
48 class Buildin {//: public Module {
49 public:
50
51// bool RegisterMacros(MacroPtr macro) {
52// return true;
53// }
54
55 protected:
56
57 Buildin(RuntimePtr rt, ObjType type, const char * name = nullptr) {// : Module(rt) {
58 if (!name) {
59 name = newlang::toString(type);
60 ASSERT(name);
61 }
62
63 TermPtr term = Parser::ParseTerm(name, nullptr, false);
64
65 if (!term) {
66 LOG_RUNTIME("Fail name '%s'!", name);
67 }
68
69// m_file = name;
71// m_md5 = "";
72// m_timestamp = __TIMESTAMP__;
73// m_version = VERSION;
74 }
75
76
77 bool CreateMethod(const char * proto, FunctionType & func, ObjType type = ObjType::Function);
78 bool CreateMethodNative(const char * proto, void * addr);
79 bool AddMethod(const char * name, ObjPtr obj);
80
81
82// bool CreateProperty(const char * proto, ObjPtr obj);
83
84// bool CreateMacro(const char * text);
85
86 // std::vector<std::string> m_macro_list;
87
88
89 };
90
91 class Base : public Buildin {
92 public:
93
94 Base(RuntimePtr rt);
95// : Buildin(rt, ObjType::Base, "::Base") {
96//
97// bool dsl_enable = true;
98// if (rt) {
99// dsl_enable = rt->m_load_dsl;
100// }
101//
102// if (dsl_enable) {
103//
104// VERIFY(CreateMacro("@@ true @@ ::= 1"));
105// VERIFY(CreateMacro("@@ yes @@ ::= 1"));
106// VERIFY(CreateMacro("@@ false @@ ::= 0"));
107// VERIFY(CreateMacro("@@ no @@ ::= 0"));
108//
109// VERIFY(CreateMacro("@@ if( ... ) @@ ::= @@ [ @$... ] --> @@"));
110// VERIFY(CreateMacro("@@ elif( ... ) @@ ::= @@ ,[ @$... ] --> @@"));
111// VERIFY(CreateMacro("@@ else @@ ::= @@ ,[...] --> @@"));
112//
113// VERIFY(CreateMacro("@@ while( ... ) @@ ::= @@ [ @$... ] <-> @@"));
114// VERIFY(CreateMacro("@@ dowhile( ... ) @@ ::= @@ <-> [ @$... ] @@"));
115// VERIFY(CreateMacro("@@ loop @@ ::= @@ [ 1 ] <-> @@"));
116//
117//
118// VERIFY(CreateMacro("@@ break $label @@ ::= @@ @$label :: ++ @@"));
119// VERIFY(CreateMacro("@@ continue $label @@ ::= @@ @$label :: -- @@"));
120// VERIFY(CreateMacro("@@ return( result ) @@ ::= @@ @__FUNC_BLOCK__ ++ @$result ++ @@"));
121// VERIFY(CreateMacro("@@ throw( result ) @@ ::= @@ -- @$result -- @@"));
122//
123// VERIFY(CreateMacro("@@ match( ... ) @@ ::= @@ [ @$... ] @__PRAGMA_EXPECTED__( @\\ =>, @\\ ==>, @\\ ===>, @\\ ~>, @\\ ~~>, @\\ ~~~> ) @@"));
124// VERIFY(CreateMacro("@@ case( ... ) @@ ::= @@ [ @$... ] --> @@"));
125// VERIFY(CreateMacro("@@ default @@ ::= @@ [...] --> @@"));
126//
127//
128// VERIFY(CreateMacro("@@ this @@ ::= @@ $0 @@ ##< This object (self)"));
129// VERIFY(CreateMacro("@@ self @@ ::= @@ $0 @@ ##< This object (self)"));
130// VERIFY(CreateMacro("@@ super @@ ::= @@ $$ @@ ##< Super (parent) class or function"));
131// VERIFY(CreateMacro("@@ latter @@ ::= @@ $^ @@ ##< Result of the last operation"));
132//
133//
134// VERIFY(CreateMacro("@@ try @@ ::= @@ [ {* @__PRAGMA_EXPECTED__( @\\ { ) @@"));
135// VERIFY(CreateMacro("@@ catch(...) @@ ::= @@ *} ] : < @$... > ~> @@"));
136// VERIFY(CreateMacro("@@ forward @@ ::= @@ +- $^ -+ @@ ##< Forward latter result or exception"));
137//
138//
139// VERIFY(CreateMacro("@@ iter( obj, ... ) @@ ::= @@ @$obj ? (@$...) @@"));
140// VERIFY(CreateMacro("@@ next( obj, ... ) @@ ::= @@ @$obj ! (@$...) @@"));
141// VERIFY(CreateMacro("@@ curr( obj ) @@ ::= @@ @$obj !? @@"));
142// VERIFY(CreateMacro("@@ first( obj ) @@ ::= @@ @$obj !! @@"));
143// VERIFY(CreateMacro("@@ all( obj ) @@ ::= @@ @$obj ?? @@"));
144//
145// VERIFY(CreateMacro("@@ and @@ ::= @@ && @@"));
146// VERIFY(CreateMacro("@@ or @@ ::= @@ || @@"));
147// VERIFY(CreateMacro("@@ xor @@ ::= @@ ^^ @@"));
148// VERIFY(CreateMacro("@@ not(value) @@ ::= @@ (:Bool(@$value)==0) @@"));
149//
152//
154// VERIFY(CreateMacro("@@ module() @@ ::= @@ @$$ @@"));
155// VERIFY(CreateMacro("@@ static @@ ::= @@ @:: @@"));
156// VERIFY(CreateMacro("@@ package $name @@ ::= @@ @$$ = @# @$name @@"));
157// VERIFY(CreateMacro("@@ declare( obj ) @@ ::= @@ @$obj ::= ... @@ ##< Forward declaration of the object"));
158//
159// VERIFY(CreateMacro("@@ using(...) @@ ::= @@ ... = @$... @@"));
160//
161// VERIFY(CreateMacro("@@ typedef(cnt) @@ ::= @@ @__PRAGMA_TYPE_DEFINE__(@$cnt) @@ ##< Disable warning when defining a type inside a namespace"));
162//
163// VERIFY(CreateMacro("@@ coroutine @@ ::= @@ __ANNOTATION_SET__(coroutine) @@"));
164// VERIFY(CreateMacro("@@ co_yield $val @@ ::= @@ __ANNOTATION_CHECK__(coroutine) @__FUNC_BLOCK__ :: -- @$val -- @@"));
165// VERIFY(CreateMacro("@@ co_await @@ ::= @@ __ANNOTATION_CHECK__(coroutine) @__FUNC_BLOCK__ :: +- @@"));
166// VERIFY(CreateMacro("@@ co_return $val @@ ::= @@ __ANNOTATION_CHECK__(coroutine) @__FUNC_BLOCK__ :: ++ @$val ++ @@"));
167//
168// VERIFY(CreateMacro("@@ exit(code) @@ ::= @@ :: ++ @$code ++ @@"));
169// VERIFY(CreateMacro("@@ abort() @@ ::= @@ :: -- @@"));
170//
171//
172//
173// }
174//
175//
176// bool assert_enable = true;
177// if (rt) {
178// assert_enable = rt->m_assert_enable;
179// }
180// // @assert(value, ...)
181// // @static_assert(value, ...)
182// // @verify(value, ...)
183// //
184// // @__PRAGMA_ASSERT__( is_runtime, is_always, value, val_string, ... )
185// //
186// // @@ static_assert(value, ...) @@ ::= @@ @__PRAGMA_ASSERT__(0, 0, value, @# value, @$... ) @@;
187// // @@ assert(value, ...) @@ ::= @@ @__PRAGMA_ASSERT__(1, 0, value, @# value, @$... ) @@;
188// // @@ verify(value, ...) @@ ::= @@ @__PRAGMA_ASSERT__(1, 1, value, @# value, @$... ) @@;
189//
190// // @__PRAGMA_ASSERT__ replase to __pragma_assert__ in @ref Parser::PragmaEval
191// // @__PRAGMA_STATIC_ASSERT__
192// VERIFY(CreateMethod("__assert_abort__(...):None", __assert_abort__));
193//
194// VERIFY(CreateMacro("@@ static_assert(...) @@ ::= @@ @__PRAGMA_STATIC_ASSERT__(@$... ) @@"));
195//
196// if (assert_enable) {
197// VERIFY(CreateMacro("@@ assert(value, ...) @@ ::= @@ [:Bool(@$value)==0]-->{ ::Base::__assert_abort__(@# @$value, @$value, @$... ) } @@"));
198// VERIFY(CreateMacro("@@ verify(value, ...) @@ ::= @@ [:Bool(@$value)==0]-->{ ::Base::__assert_abort__(@# @$value, @$value, @$... ) } @@"));
199// } else {
200// VERIFY(CreateMacro("@@ assert(value, ...) @@ ::= @@ (_) @@"));
201// VERIFY(CreateMacro("@@ verify(value, ...) @@ ::= @@ (@$value) @@"));
202// }
203//
204//
205// }
206
207 virtual ~Base() {
208 };
209
213
216
221
222
223 };
224
225 class System : public Buildin {
226 public:
227
228 System(RuntimePtr rt) : Buildin(rt, ObjType::Sys, "::Sys") {
229 // m_var_type_current = ObjType::Module;
230 // m_var_type_fixed = ObjType::Module;
231 // m_class_name = "System";
232
233
234// Obj arg;
235// VERIFY(CreateProperty("name^:StrChar", getname(nullptr, arg)));
236 VERIFY(CreateMethod("getname():StrChar", getname));
237
238 VERIFY(CreateMethod("getlogin():StrChar", getlogin));
239 VERIFY(CreateMethod("getenv(name:StrChar):String", getenv));
240 VERIFY(CreateMethodNative("getpid():Int32", (void *) &::getpid));
241
242 VERIFY(CreateMethod("getuname():Dictionary", getuname));
243 VERIFY(CreateMethod("getsysinfo():Dictionary", getsysinfo));
244
245
246 VERIFY(CreateMethod("getmillisec():Int64", getmillisec));
247 VERIFY(CreateMethod("gettimeofday():Dictionary", gettimeofday));
248 VERIFY(CreateMethod("getenviron():Dictionary", getenviron));
249 VERIFY(CreateMethod("system(cmd:StrChar):StrChar", system));
250
251
252 VERIFY(CreateMethodNative("chdir(dir:StrChar):Int32", (void *) &::chdir));
253 VERIFY(CreateMethodNative("getcwd():StrChar", (void *) &::getcwd));
254
255 // m_var_is_init = true;
256 }
257
258 virtual ~System() {
259 };
260
264
267
271
272
275
276
277 };
278
279
280 /*
281 *
282 *
283 * rand():Int32 := %rand;
284 * srand(seed:Int32):None;
285 * sleep(usec:DWord64):None := %usleep;
286 * usleep(usec:DWord64):None := %usleep;
287 *
288
289 *
290 * abs(x) - Возвращает абсолютную величину (модуль числа).
291 * max(iter, [args ...] * [, key]) - Максимальный элемент последовательности.
292 * min(iter, [args ...] * [, key]) - Минимальный элемент последовательности.
293 * pow(x, y[, r]) - ( x ** y ) % r.
294 * round(X [, N]) - Округление до N знаков после запятой.
295 * sorted(iterable[, key][, reverse]) - Отсортированный список.
296 * sum(iter, start=0) - Сумма членов последовательности.
297 * divmod(a, b) - Возвращает частное и остаток от деления a на b.
298 *
299 * all(последовательность) - Возвращает True, если все элементы истинные (или, если последовательность пуста).
300 * any(последовательность) - Возвращает True, если хотя бы один элемент - истина. Для пустой последовательности возвращает False.
301 *
302 * ascii(object) - Как repr(), возвращает строку, содержащую представление объекта, но заменяет не-ASCII символы на экранированные последовательности.
303 * oct(х) - Преобразование целого числа в восьмеричную строку.
304 * ord(с) - Код символа.
305 *
306 * callable(x) - Возвращает True для объекта, поддерживающего вызов (как функции).
307 * classmethod(x) - Представляет указанную функцию методом класса.
308 * compile(source, filename, mode, flags=0, dont_inherit=False) - Компиляция в программный код, который впоследствии может выполниться функцией eval или exec. Строка не должна содержать символов возврата каретки или нулевые байты.
309 *
310 * enumerate(iterable, start=0) - Возвращает итератор, при каждом проходе предоставляющем кортеж из номера и соответствующего члена последовательности.
311 *
312 * eval(expression, globals=None, locals=None) - Выполняет строку программного кода.
313 * exec(object[, globals[, locals]]) - Выполняет программный код на Python.
314 *
315 * filter(function, iterable) - Возвращает итератор из тех элементов, для которых function возвращает истину.
316 *
317 * globals() - Словарь глобальных имен.
318 * locals() - Словарь локальных имен.
319 *
320 * dir([object]) - Список имен объекта, а если объект не указан, список имен в текущей локальной области видимости.
321 * vars([object]) - Словарь из атрибутов объекта. По умолчанию - словарь локальных имен.
322 *
323 * iter(x) - Возвращает объект итератора.
324 * next(x) - Возвращает следующий элемент итератора.
325 * reversed(object) - Итератор из развернутого объекта.
326 * repr(obj) - Представление объекта.
327 *
328 * len(x) - Возвращает число элементов в указанном объекте.
329 * map(function, iterator) - Итератор, получившийся после применения к каждому элементу последовательности функции function.
330 *
331 * property(fget=None, fset=None, fdel=None, doc=None)
332 * getattr(object, name ,[default]) - извлекает атрибут объекта или default.
333 * hasattr(object, name) - Имеет ли объект атрибут с именем 'name'.
334 * setattr(объект, имя, значение) - Устанавливает атрибут объекта.
335 * delattr(object, name) - Удаляет атрибут с именем 'name'.
336 * isinstance(object, ClassInfo) - Истина, если объект является экземпляром ClassInfo или его подклассом. Если объект не является объектом данного типа, функция всегда возвращает ложь.
337 * issubclass(класс, ClassInfo) - Истина, если класс является подклассом ClassInfo. Класс считается подклассом себя.
338 * staticmethod(function) - Статический метод для функции.
339 * super([тип [, объект или тип]]) - Доступ к родительскому классу.
340 *
341 *
342 * help([object]) - Вызов встроенной справочной системы.
343 *
344 * hash(x) - Возвращает хеш указанного объекта.
345 * id(object) - Возвращает "адрес" объекта. Это целое число, которое гарантированно будет уникальным и постоянным для данного объекта в течение срока его существования.
346 *
347 * open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) - Открывает файл и возвращает соответствующий поток.
348 *
349 *
350 * hex(х) - Преобразование целого числа в шестнадцатеричную строку.
351 * format(value[,format_spec]) - Форматирование (обычно форматирование строки).
352 * print([object, ...], *, sep=" ", end='\n', file=sys.stdout) - Печать.
353 * input([prompt]) - Возвращает введенную пользователем строку. Prompt - подсказка пользователю.
354 *
355 * type(object) - Возвращает тип объекта.
356 * type(name, bases, dict) - Возвращает новый экземпляр класса name.
357 * zip(*iters) - Итератор, возвращающий кортежи, состоящие из соответствующих элементов аргументов-последовательностей.
358 *
359 * Функция __import__() в Python, находит и импортирует модуль
360 * Функция __import__() импортирует имя модуля name, потенциально используя данные значений переменных глобальной globals и локальной locals областей видимости, чтобы определить, как интерпретировать имя name в контексте пакета.
361 *
362 *
363 * len()!!!
364 * size()
365 */
366
367 } // namespace runtime
368
369} // namespace newlang
370
371#endif // NEWLANG_SYSTEM_H_
#define CALSS_METHOD_DEF(NAME)
Definition builtin.h:42
static size_t ParseTerm(TermPtr &term, const BlockType &buffer, const size_t skip=0, bool pragma_enable=true)
Definition parser.cpp:895
static newlang::ObjPtr __len__(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:95
static newlang::ObjPtr __assert_abort__(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:79
static newlang::ObjPtr __thread_get_id__(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:136
static newlang::ObjPtr __timeit__(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:102
static newlang::ObjPtr __thread_hardware_concurrency__(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:132
static newlang::ObjPtr __thread_join__(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:145
static newlang::ObjPtr __thread_this_id__(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:128
static newlang::ObjPtr __thread_joinable__(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:149
static newlang::ObjPtr __thread_start__(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:141
bool CreateMethodNative(const char *proto, void *addr)
Definition system.cpp:43
bool AddMethod(const char *name, ObjPtr obj)
Definition system.cpp:22
bool CreateMethod(const char *proto, FunctionType &func, ObjType type=ObjType::Function)
Definition system.cpp:55
Buildin(RuntimePtr rt, ObjType type, const char *name=nullptr)
Definition system.h:57
System(RuntimePtr rt)
Definition system.h:228
static newlang::ObjPtr getcwd(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:275
static newlang::ObjPtr getmillisec(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:258
static newlang::ObjPtr getenviron(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:288
static newlang::ObjPtr getlogin(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:184
static newlang::ObjPtr getuname(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:210
static newlang::ObjPtr gettimeofday(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:264
static newlang::ObjPtr system(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:306
static newlang::ObjPtr getsysinfo(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:229
static newlang::ObjPtr getenv(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:200
static newlang::ObjPtr getname(newlang::Context *ctx, newlang::Obj &in)
Definition system.cpp:176
#define LOG_RUNTIME(format,...)
Definition logger.h:26
#define VERIFY(exp)
Definition logger.h:65
#define ASSERT(condition)
Definition logger.h:60
Definition nlc.h:59
std::shared_ptr< Term > TermPtr
Definition variable.h:33
std::shared_ptr< Obj > ObjPtr
Definition variable.h:28
std::shared_ptr< RunTime > RuntimePtr
Definition types.h:242
ObjType
Definition types.h:524
const char * toString(TermID type)
Definition term.h:126
ObjPtr FunctionType(Context *ctx, Obj &in)
Definition types.h:248