From 4b93f393753cb3ae4256d46900f65320c69a1b21 Mon Sep 17 00:00:00 2001 From: VaclavT Date: Tue, 16 Feb 2021 19:53:39 +0100 Subject: [PATCH] changes here, changes there --- CMakeLists.txt | 5 +- Readme.md | 33 ++++++------ debug.lisp | 73 ++++++++++++++------------ ml.cpp | 137 ++++++++++++++++++++++++++---------------------- ml_date.cpp | 58 ++++++++++++++++++++ ml_date.h | 19 +++++++ ml_io.cpp | 41 ++++++++++++++- ml_io.h | 7 ++- tests/test.lisp | 80 ++++++++++++++++++++++++++++ 9 files changed, 332 insertions(+), 121 deletions(-) create mode 100644 ml_date.cpp create mode 100644 ml_date.h create mode 100644 tests/test.lisp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e4e813..fc5ef69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,10 +20,11 @@ set(PROJECT_NAME ml) set(SOURCE ml.cpp - ml_io.cpp + ml_io.cpp + ml_date.cpp clib/csvparser.cpp clib/sslclient.cpp - clib/json11.cpp) + clib/json11.cpp ml_date.h ml_date.cpp) add_executable(${PROJECT_NAME} ${SOURCE}) diff --git a/Readme.md b/Readme.md index 0fd0946..b8ce95f 100644 --- a/Readme.md +++ b/Readme.md @@ -1,38 +1,37 @@ ### TODO -- move system_cmd into ml_io +- date support + - decode-universal-time +- add save-csv - logical operators - documentation - add url of source/inspiration to clib/*.cpp -- load std lib when starting -- add more command line args -- add stdtest +- support for including lisp libs +- add stdtest - to test every functionality - rename ivaluize - add benchmark - add some debug support?? - add instrumentation (time, nr of evals, debug info, debug environment etc) -- in cating functions (as_string..) better exception description -- add fuctions asecond,third, fourth... -- add better print (syntaxhighligting) -- add options -h -v - - -#### Functionality +- in casting functions (as_string..) better exception description +- add better print (syntax high-lighting) +- format (printf) +- add comman line options -h -v - readline -- execute system command -- printf -- support for including lisp lib -- date support +- execute system command should capture stderr +- add sleep - file functions - name it here -- string funtions +- string functions - name it here +- regexp functions - add hash datatype - add support for nil +- conversion functions like parse-integer +- list function nth #### Performance -- push_back - repeately without reserving size +- push_back - repeatedly without reserving size diff --git a/debug.lisp b/debug.lisp index bfe8cc8..1123942 100644 --- a/debug.lisp +++ b/debug.lisp @@ -10,14 +10,14 @@ ; (print (fact 5)) -; (define json_list (read-json "{\"k1\":\"v1\", \"k2\":42, \"k3\":[\"a\",123,true,false,null]}")) +; (define json_list (parse-json "{\"k1\":\"v1\", \"k2\":42, \"k3\":[\"a\",123,true,false,null]}")) ; (print json_list) ; (for x json_list ; (print x)) ; nefunguje - api.nasdaq.com ;(define nasdaq_headers (quote (("Accept" "application/json, text/plain, */*") ("Connection" "keep-alive") ("Origin" "https://www.nasdaq.com/") ("User-Agent" "Mozilla/5.0 (Windows NT 10.0)")))) -;(define json_list2 (read-json (read-url "https://api.nasdaq.com/api/calendar/dividends/?date=2021-02-01" nasdaq_headers))) +;(define json_list2 (parse-json (read-url "https://api.nasdaq.com/api/calendar/dividends/?date=2021-02-01" nasdaq_headers))) ; (for x json_list2 ; (print x)) @@ -36,40 +36,45 @@ ;; (print fdx_list) -(define curl "curl -H \"Accept: application/json, text/plain, */*\" -H \"Origin: https://www.nasdaq.com/\" -H \"User-Agent: Mozilla/5.0 (Windows NT 10.0)\" https://api.nasdaq.com/api/calendar/dividends/?date=2021-02-01 2>/dev/null") -(define curl_out (system-cmd curl)) -(define json_list (read-json (last curl_out))) -;(print json_list) -(define data (first json_list)) -;(print data) -;(print (index data 1)) ; druhy prvek -(define calendar (index data 1)) -;(print calendar) -(define calendar_data (index (index calendar 0) 1)) -;(print calendar_data) -(define header (index (index calendar_data 0) 1)) -;(print header) -(define rows (index (index calendar_data 1) 1)) -;(print rows) -(for e rows - ; (("announcement_Date" "01/07/2021") ("companyName" "Itau Unibanco Banco Holding SA") ("dividend_Ex_Date" "02/01/2021") ("dividend_Rate" 0.003) ("indicated_Annual_Dividend" 0.033) ("payment_Date" "03/11/2021") ("record_Date" "02/02/2021") ("symbol" "ITUB")) - (define symbol (second (first (filter (lambda (x) (= (first x) "symbol")) e)))) - (define divrate (second (first (filter (lambda (x) (= (first x) "dividend_Rate")) e)))) - (define adate (second (first (filter (lambda (x) (= (first x) "announcement_Date")) e)))) - (define name (second (first (filter (lambda (x) (= (first x) "companyName")) e)))) - (define edate (second (first (filter (lambda (x) (= (first x) "dividend_Ex_Date")) e)))) - (define pdate (second (first (filter (lambda (x) (= (first x) "payment_Date")) e)))) - (define rdate (second (first (filter (lambda (x) (= (first x) "record_Date")) e)))) +;; (define curl "curl -H \"Accept: application/json, text/plain, */*\" -H \"Origin: https://www.nasdaq.com/\" -H \"User-Agent: Mozilla/5.0 (Windows NT 10.0)\" https://api.nasdaq.com/api/calendar/dividends/?date=2021-02-01 2>/dev/null") +;; (define curl_out (system-cmd curl)) +;; (define json_list (parse-json (last curl_out))) +;; ;(print json_list) +;; (define data (first json_list)) +;; ;(print data) +;; ;(print (index data 1)) ; druhy prvek +;; (define calendar (index data 1)) +;; ;(print calendar) +;; (define calendar_data (index (index calendar 0) 1)) +;; ;(print calendar_data) +;; (define header (index (index calendar_data 0) 1)) +;; ;(print header) +;; (define rows (index (index calendar_data 1) 1)) +;; ;(print rows) +;; (for e rows +;; ; (("announcement_Date" "01/07/2021") ("companyName" "Itau Unibanco Banco Holding SA") ("dividend_Ex_Date" "02/01/2021") ("dividend_Rate" 0.003) ("indicated_Annual_Dividend" 0.033) ("payment_Date" "03/11/2021") ("record_Date" "02/02/2021") ("symbol" "ITUB")) +;; (define symbol (second (first (filter (lambda (x) (= (first x) "symbol")) e)))) +;; (define divrate (second (first (filter (lambda (x) (= (first x) "dividend_Rate")) e)))) +;; (define adate (second (first (filter (lambda (x) (= (first x) "announcement_Date")) e)))) +;; (define name (second (first (filter (lambda (x) (= (first x) "companyName")) e)))) +;; (define edate (second (first (filter (lambda (x) (= (first x) "dividend_Ex_Date")) e)))) +;; (define pdate (second (first (filter (lambda (x) (= (first x) "payment_Date")) e)))) +;; (define rdate (second (first (filter (lambda (x) (= (first x) "record_Date")) e)))) - ;(print symbol edate pdate divrate) - '(symbol edate pdate divrate) - - ) +;; ;(print symbol edate pdate divrate) +;; '(symbol edate pdate divrate) +;; ) -(print (ls-dir "/tmp")) -(print (is-file? "/tmp/file")) -(print (is-file? "/tmp/hovinko")) -(print (is-dir? "/tmp/powerlog")) +;(print (ls-dir "/tmp")) +;(write-file "/tmp/file" "write-file test\n") +;(print (is-file? "/tmp/file")) +;(print (is-file? "/tmp/hovinko")) +;(print (is-dir? "/tmp/powerlog")) + +(print (get-universal-time)) +(print (date-to-str (get-universal-time) "%d.%m.%Y")) +(print (str-to-date "01.01.1970" "%d.%m.%Y")) +(print (date-add (str-to-date "01.01.1970" "%d.%m.%Y") 1 "day")) (print "Debug ends") diff --git a/ml.cpp b/ml.cpp index 9cb06f5..d75c27c 100644 --- a/ml.cpp +++ b/ml.cpp @@ -1,6 +1,7 @@ #include "ml.h" #include "ml_io.h" +#include "ml_date.h" #include "csvparser.h" #include "sslclient.h" @@ -30,7 +31,7 @@ #define BAD_CAST "cannot cast" #define ATOM_NOT_DEFINED "atom not defined" #define EVAL_EMPTY_LIST "evaluated empty list" -#define INTERNAL_ERROR "interal virtual machine error" +#define INTERNAL_ERROR "internal virtual machine error" #define INDEX_OUT_OF_RANGE "index out of range" #define MALFORMED_PROGRAM "malformed program" @@ -1057,16 +1058,9 @@ namespace builtin { eval_args(args, env); if (args.size() != 2) - throw MlError(MlValue("write-file", write_file), env, - args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + throw MlError(MlValue("write-file", write_file), env, args.size() > 2 ? TOO_MANY_ARGS : TOO_FEW_ARGS); - std::ofstream f; - // The first argument is the file name - f.open(args[0].as_string().c_str()); - // The second argument is the contents of the file to write - MlValue result = MlValue((f << args[1].as_string()) ? 1 : 0); - f.close(); - return result; + return MlValue(write_file_contents(args[0].as_string(), args[1].as_string())); } // Read URL to (code content) @@ -1097,12 +1091,13 @@ namespace builtin { } // Parse JSON string - MlValue read_json(std::vector args, MlEnvironment &env) { + MlValue parse_json(std::vector args, MlEnvironment &env) { eval_args(args, env); // TODO add support for more params specifying options if (args.size() != 1) - throw MlError(MlValue("read-json", read_json), env, args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + throw MlError(MlValue("parse-json", parse_json), env, + args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS); std::string str = args[0].as_string(); std::string err; @@ -1116,48 +1111,59 @@ namespace builtin { return json.ivalualize(); } + // get current time as secs from epoch + MlValue get_universal_time(std::vector args, MlEnvironment &env) { + eval_args(args, env); + + if (args.size() != 0) + throw MlError(MlValue("get-universal-time", get_universal_time), env, TOO_MANY_ARGS); + + return MlValue(now()); + } + + MlValue date_to_str(std::vector args, MlEnvironment &env) { + eval_args(args, env); + + if (args.size() != 2) + throw MlError(MlValue("date_to_str", date_to_str), env, + args.size() > 2 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + + return MlValue::string(date_to_string(args[0].as_int(), args[1].as_string())); + } + + MlValue str_to_date(std::vector args, MlEnvironment &env) { + eval_args(args, env); + + if (args.size() != 2) + throw MlError(MlValue("str-to-date", str_to_date), env, + args.size() > 2 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + + return MlValue(string_to_date(args[0].as_string(), args[1].as_string())); + } + + MlValue date_add(std::vector args, MlEnvironment &env) { + eval_args(args, env); + + if (args.size() != 3) + throw MlError(MlValue("date-add", date_add), env, args.size() > 3 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + + return MlValue(add_to_date(args[0].as_int(), args[1].as_int(), args[2].as_string())); + } + + // Execute system command MlValue system_cmd(std::vector args, MlEnvironment &env) { eval_args(args, env); // TODO add support for more params constructing options as one string - // TODO add support for stderr if (args.size() != 1) throw MlError(MlValue("system-cmd", system_cmd), env, args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS); - std::string cmd = args[0].as_string(); - - std::string cmd_output; - int stat; - - // TODO better parameter here - // TODO handle reading of stderr - // https://stackoverflow.com/questions/478898/how-do-i-execute-a-command-and-get-the-output-of-the-command-within-c-using-po - // https://jineshkj.wordpress.com/2006/12/22/how-to-capture-stdin-stdout-and-stderr-of-child-program/ - char buffer[128]; - FILE *pipe = popen(cmd.c_str(), "r"); - if (!pipe) - throw std::runtime_error("popen() failed!"); - try { - while (!std::feof(pipe)) { - if (std::fgets(buffer, 128, pipe) != nullptr) - cmd_output += buffer; - } - } catch (...) { - stat = pclose(pipe); - throw; - } - stat = pclose(pipe); - int cmd_retval = WEXITSTATUS(stat); - - // TODO add helper function for this - std::vector lst; - lst.push_back(MlValue(cmd_retval)); - lst.push_back(MlValue::string(cmd_output)); - return lst; + return exec_system_cmd(args[0].as_string()); } + // list directory MlValue ls_dir(std::vector args, MlEnvironment &env) { eval_args(args, env); @@ -1172,7 +1178,7 @@ namespace builtin { MlValue is_file(std::vector args, MlEnvironment &env) { eval_args(args, env); - // TODO add suppor for more params and list params + // TODO add support for more params and list params if (args.size() != 1) throw MlError(MlValue("is-file?", is_file), env, args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS); @@ -1183,7 +1189,7 @@ namespace builtin { MlValue is_dir(std::vector args, MlEnvironment &env) { eval_args(args, env); - // TODO add suppor for more params and list params + // TODO add support for more params and list params if (args.size() != 1) throw MlError(MlValue("is-dir?", is_dir), env, args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS); @@ -1583,10 +1589,7 @@ void repl(MlEnvironment &env) { std::cout << "File to export to: "; std::getline(std::cin, input); - std::ofstream f; - f.open(input.c_str(), std::ofstream::out); - f << code; - f.close(); + write_file_contents(input, code); } else if (input != "") { try { tmp = run(input, env); @@ -1601,6 +1604,16 @@ void repl(MlEnvironment &env) { } } +// load lisp std library +void load_std_lib(MlEnvironment &env) { + // TODO iterate through dir with files + std::string filename = "stdlib/stdlib.lisp"; + + MlEnvironment e; + MlValue result = run(read_file_contents(filename), e); + env.combine(e); +} + // Does this environment, or its parent environment, have a variable? bool MlEnvironment::has(std::string name) const { // Find the value in the map @@ -1653,9 +1666,7 @@ MlValue MlEnvironment::get(const std::string &name) const { if (name == "insert") return MlValue("insert", builtin::insert); if (name == "index") return MlValue("index", builtin::index); if (name == "remove") return MlValue("remove", builtin::remove); - if (name == "len") return MlValue("len", builtin::len); - if (name == "push") return MlValue("push", builtin::push); if (name == "pop") return MlValue("pop", builtin::pop); if (name == "head") return MlValue("head", builtin::head); @@ -1676,15 +1687,23 @@ MlValue MlEnvironment::get(const std::string &name) const { if (name == "input") return MlValue("input", builtin::input); if (name == "random") return MlValue("random", builtin::random); if (name == "include") return MlValue("include", builtin::include); - if (name == "parse-csv") return MlValue("parse-csv", builtin::parse_csv); if (name == "read-file") return MlValue("read-file", builtin::read_file); if (name == "write-file") return MlValue("write-file", builtin::write_file); if (name == "read-url") return MlValue("read-url", builtin::read_url); - if (name == "read-json") return MlValue("read-json", builtin::read_json); if (name == "system-cmd") return MlValue("system-cmd", builtin::system_cmd); if (name == "ls-dir") return MlValue("ls-dir", builtin::ls_dir); if (name == "is-file?") return MlValue("is-file?", builtin::is_file); - if (name == "is-dir?") return MlValue("is-der?", builtin::is_dir); + if (name == "is-dir?") return MlValue("is-dir?", builtin::is_dir); + + // parsing operations + if (name == "parse-csv") return MlValue("parse-csv", builtin::parse_csv); + if (name == "parse-json") return MlValue("parse-json", builtin::parse_json); + + // Datetime operations + if (name == "get-universal-time") return MlValue("get-universal-time", builtin::get_universal_time); + if (name == "date-to-str") return MlValue("date-to-str", builtin::date_to_str); + if (name == "str-to-date") return MlValue("str-to-date", builtin::str_to_date); + if (name == "date-add") return MlValue("date-add", builtin::date_add); // String operations if (name == "debug") return MlValue("debug", builtin::debug); @@ -1709,16 +1728,6 @@ MlValue MlEnvironment::get(const std::string &name) const { throw MlError(MlValue::atom(name), *this, ATOM_NOT_DEFINED); } -// load lisp std library -void load_std_lib(MlEnvironment &env) { - // TODO iterate through dir with files - std::string filename = "stdlib/stdlib.lisp"; - - MlEnvironment e; - MlValue result = run(read_file_contents(filename), e); - env.combine(e); -} - int main(int argc, const char **argv) { MlEnvironment env; std::vector args; diff --git a/ml_date.cpp b/ml_date.cpp new file mode 100644 index 0000000..71c906f --- /dev/null +++ b/ml_date.cpp @@ -0,0 +1,58 @@ + +#include "ml_date.h" + +int now() { + // get-universal-time + time_t t = std::time(0); + long int now = static_cast(t); + + return (int) now; +} + +std::string date_to_string(const int datetime, const std::string format) { + // std::locale::global(std::locale("en-US.UTF8")); + + time_t timestamp = datetime; + char mbstr[128]; + + if (std::strftime(mbstr, sizeof(mbstr), format.c_str(), std::localtime(×tamp))) { + std::string result = {mbstr}; + return result; + } + // TODO exception here +} + +int string_to_date(const std::string &datestr, const std::string &format) { + // format for example "%d.%m.%Y"; + + std::istringstream in{datestr.c_str()}; + date::sys_seconds tp; + in >> date::parse(format, tp); + return (int) tp.time_since_epoch().count(); +} + +int add_to_date(const int datetime, const int quantity, const std::string &part) { + // part is one of 'year', 'month', 'day', 'hour', 'minute', 'second', or 'millisecond' + + // very basic implementation, just for now - no timezones DST etc + time_t base = datetime; + struct tm *tm = localtime(&base); + + if (part == "year") { + tm->tm_year += quantity; + } else if (part == "month") { + tm->tm_mon += quantity; + } else if (part == "day") { + tm->tm_mday += quantity; + } else if (part == "hour") { + tm->tm_hour += quantity; + } else if (part == "minute") { + tm->tm_min += quantity; + } else if (part == "second") { + tm->tm_sec += quantity; + } else { + // TODO exception here + } + + return (int) mktime(tm); +} diff --git a/ml_date.h b/ml_date.h new file mode 100644 index 0000000..f6f80dd --- /dev/null +++ b/ml_date.h @@ -0,0 +1,19 @@ + +#pragma once + +#include "ml.h" +#include "clib/date.h" + +#include +#include + + +int now(); + +// TODO temporary solution before format will be implemented +std::string date_to_string(const int datetime, const std::string format); + +int string_to_date(const std::string &datestr, const std::string &format); + +int add_to_date(const int datetime, const int quantity, const std::string &part); + diff --git a/ml_io.cpp b/ml_io.cpp index 8af76cb..6abc509 100644 --- a/ml_io.cpp +++ b/ml_io.cpp @@ -23,6 +23,14 @@ std::string read_file_contents(const std::string &filename) { return contents; } +int write_file_contents(const std::string &filename, const std::string &content) { + std::ofstream f; + f.open(filename.c_str()); + int result = (f << content) ? 1 : 0; + f.close(); + return result; +} + MlValue list_dir(const std::string &path) { std::vector entries; @@ -50,13 +58,42 @@ bool is_path_dir(const std::string &path) { return (bool) S_ISDIR(buf.st_mode); } -int mk_dir(const std::string &path) { +int mk_path_dir(const std::string &path) { int r = ::mkdir(path.c_str(), 0755); return r; } -int rm_dir(const std::string &path) { +int rm_path_dir(const std::string &path) { int r = ::rmdir(path.c_str()); return r; } +MlValue exec_system_cmd(const std::string &cmd) { + // TODO handle reading of stderr + // https://stackoverflow.com/questions/478898/how-do-i-execute-a-command-and-get-the-output-of-the-command-within-c-using-po + // https://jineshkj.wordpress.com/2006/12/22/how-to-capture-stdin-stdout-and-stderr-of-child-program/ + + std::string cmd_output; + int stat; + char buffer[128]; + FILE *pipe = popen(cmd.c_str(), "r"); + if (!pipe) + throw std::runtime_error("popen() failed!"); + try { + while (!feof(pipe)) { + if (fgets(buffer, 128, pipe) != nullptr) + cmd_output += buffer; + } + } catch (...) { + stat = pclose(pipe); + throw; + } + stat = pclose(pipe); + int cmd_retval = WEXITSTATUS(stat); + + // TODO add helper function for this + std::vector lst; + lst.push_back(MlValue(cmd_retval)); + lst.push_back(MlValue::string(cmd_output)); + return lst; +} diff --git a/ml_io.h b/ml_io.h index e4e1324..d673d6e 100644 --- a/ml_io.h +++ b/ml_io.h @@ -9,13 +9,16 @@ std::string read_file_contents(const std::string &filename); +int write_file_contents(const std::string &filename, const std::string &content); + MlValue list_dir(const std::string &path); bool is_path_file(const std::string &path); bool is_path_dir(const std::string &path); -int mk_dir(const std::string &path); +int mk_path_dir(const std::string &path); -int rm_dir(const std::string &path); +int rm_path_dir(const std::string &path); +MlValue exec_system_cmd(const std::string &path); \ No newline at end of file diff --git a/tests/test.lisp b/tests/test.lisp new file mode 100644 index 0000000..1123942 --- /dev/null +++ b/tests/test.lisp @@ -0,0 +1,80 @@ +(print "Debug starts") + +; define a function `fact` that takes an argument `n` +; (defun fact (n) +; (if (<= n 1) +; 1 +; (* n (fact (- n 1))) +; )) + +; (print (fact 5)) + + +; (define json_list (parse-json "{\"k1\":\"v1\", \"k2\":42, \"k3\":[\"a\",123,true,false,null]}")) +; (print json_list) +; (for x json_list +; (print x)) + +; nefunguje - api.nasdaq.com +;(define nasdaq_headers (quote (("Accept" "application/json, text/plain, */*") ("Connection" "keep-alive") ("Origin" "https://www.nasdaq.com/") ("User-Agent" "Mozilla/5.0 (Windows NT 10.0)")))) +;(define json_list2 (parse-json (read-url "https://api.nasdaq.com/api/calendar/dividends/?date=2021-02-01" nasdaq_headers))) +; (for x json_list2 +; (print x)) + +;; (include "tmp/example.lisp") +;; (print "sorted: " (qs '(10 9 8 7 6 5 4 3 2 1))) + + +; (define csv (read-file "tmp/data.csv")) +; (define csv_list (parse-csv csv)) +; (for x csv_list +; (print x)) + +;; (define web_page (read-url "https://query1.finance.yahoo.com/v7/finance/download/FDX?period1=1581272585&period2=1612894985&interval=1d&events=history&includeAdjustedClose=true")) +;; (print web_page) +;; (define fdx_list (parse-csv (index web_page 1))) +;; (print fdx_list) + + +;; (define curl "curl -H \"Accept: application/json, text/plain, */*\" -H \"Origin: https://www.nasdaq.com/\" -H \"User-Agent: Mozilla/5.0 (Windows NT 10.0)\" https://api.nasdaq.com/api/calendar/dividends/?date=2021-02-01 2>/dev/null") +;; (define curl_out (system-cmd curl)) +;; (define json_list (parse-json (last curl_out))) +;; ;(print json_list) +;; (define data (first json_list)) +;; ;(print data) +;; ;(print (index data 1)) ; druhy prvek +;; (define calendar (index data 1)) +;; ;(print calendar) +;; (define calendar_data (index (index calendar 0) 1)) +;; ;(print calendar_data) +;; (define header (index (index calendar_data 0) 1)) +;; ;(print header) +;; (define rows (index (index calendar_data 1) 1)) +;; ;(print rows) +;; (for e rows +;; ; (("announcement_Date" "01/07/2021") ("companyName" "Itau Unibanco Banco Holding SA") ("dividend_Ex_Date" "02/01/2021") ("dividend_Rate" 0.003) ("indicated_Annual_Dividend" 0.033) ("payment_Date" "03/11/2021") ("record_Date" "02/02/2021") ("symbol" "ITUB")) +;; (define symbol (second (first (filter (lambda (x) (= (first x) "symbol")) e)))) +;; (define divrate (second (first (filter (lambda (x) (= (first x) "dividend_Rate")) e)))) +;; (define adate (second (first (filter (lambda (x) (= (first x) "announcement_Date")) e)))) +;; (define name (second (first (filter (lambda (x) (= (first x) "companyName")) e)))) +;; (define edate (second (first (filter (lambda (x) (= (first x) "dividend_Ex_Date")) e)))) +;; (define pdate (second (first (filter (lambda (x) (= (first x) "payment_Date")) e)))) +;; (define rdate (second (first (filter (lambda (x) (= (first x) "record_Date")) e)))) + +;; ;(print symbol edate pdate divrate) +;; '(symbol edate pdate divrate) +;; ) + + +;(print (ls-dir "/tmp")) +;(write-file "/tmp/file" "write-file test\n") +;(print (is-file? "/tmp/file")) +;(print (is-file? "/tmp/hovinko")) +;(print (is-dir? "/tmp/powerlog")) + +(print (get-universal-time)) +(print (date-to-str (get-universal-time) "%d.%m.%Y")) +(print (str-to-date "01.01.1970" "%d.%m.%Y")) +(print (date-add (str-to-date "01.01.1970" "%d.%m.%Y") 1 "day")) + +(print "Debug ends")