From dd8502231dbba1f323e6c22cb4117fab5799890e Mon Sep 17 00:00:00 2001 From: VaclavT Date: Wed, 10 Mar 2021 23:52:55 +0100 Subject: [PATCH 1/2] main.cpp introduced --- CMakeLists.txt | 1 + Readme.md | 2 +- main.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ ml.cpp | 71 +------------------------------------------ ml.h | 2 +- 5 files changed, 86 insertions(+), 72 deletions(-) create mode 100644 main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1123fc8..cd6a7bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,7 @@ project(ml) set(PROJECT_NAME ml) set(SOURCE + main.cpp ml.cpp ml_io.cpp ml_date.cpp diff --git a/Readme.md b/Readme.md index 160eb26..3bd9a2a 100644 --- a/Readme.md +++ b/Readme.md @@ -53,7 +53,7 @@ cp stdlib/*.lsp /usr/local/var/mlisp/ #### Compile ``` -gcc -o ml -I/usr/local/opt/openssl/include -Iclib -L/usr/local/lib -L/usr/local/opt/openssl/lib -lm -lstdc++ -lcrypto -lssl -Wl,-stack_size -Wl,0x1000000 --std=c++17 ml.cpp ml_io.cpp ml_date.cpp ml_string.cpp clib/json11.cpp clib/csvparser.cpp clib/sslclient.cpp clib/printf.cpp +gcc -o ml -I/usr/local/opt/openssl/include -Iclib -L/usr/local/lib -L/usr/local/opt/openssl/lib -lm -lstdc++ -lcrypto -lssl -Wl,-stack_size -Wl,0x1000000 --std=c++17 main.cpp ml.cpp ml_io.cpp ml_date.cpp ml_string.cpp clib/json11.cpp clib/csvparser.cpp clib/sslclient.cpp clib/printf.cpp ``` or cmake diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..773c0c7 --- /dev/null +++ b/main.cpp @@ -0,0 +1,82 @@ +#include "ml.h" +#include "ml_io.h" + +#include + + +MlValue run(const std::string &code, MlEnvironment &env); +MlValue repl(MlEnvironment &env); + + +void load_std_lib(MlEnvironment &env) { + std::string loader = + R"( (define ___lib_path '("/usr/local/var/mlisp")) + (for d ___lib_path + (if (is-dir? d) + (for f (ls-dir d) + (if (regex-search? f "^.*\.l(i)?sp$") + (include (+ d "/" f)) + '()) + ) + '())) + )"; + + run(loader, env); +} + + +bool cmdOptionExists(char **begin, char **end, const std::string &option) { return std::find(begin, end, option) != end; } + + +std::vector getCmdOption(char *argv[], int argc, const std::string &option) { + std::vector tokens; + for (int i = 1; i < argc; ++i) { + if (option == argv[i] && i + 1 < argc) { + i++; + tokens.push_back(std::string(argv[i])); + } + } + return tokens; +} + + +int main(int argc, char *argv[]) { + MlEnvironment env; + std::vector args; + for (int i = 0; i < argc; i++) + args.push_back(MlValue::string(argv[i])); + env.set("cmd-args", MlValue(args)); + + srand(time(NULL)); + try { + load_std_lib(env); + // for xcode profiling + // run(read_file_contents("/Users/vaclavt/Development/mlisp/tests/test.lsp"), env); + + // help + if (cmdOptionExists(argv, argv + argc, "-h")) { + std::cout << "Usage:\n\t-h print this help\n\t-f source_file - executes code in file\n\t-c code - runs passed code\n\t-i runs repl\n\t-v prints version string\n\n"; + return 0; + } + + // version + if (cmdOptionExists(argv, argv + argc, "-v")) { + std::cout << VERSION << std::endl; + return 0; + } + + if (argc == 1 || (argc == 2 && std::string(argv[1]) == "-i")) + repl(env); + else if (argc == 3 && std::string(argv[1]) == "-c") + run(argv[2], env); + else if (argc == 3 && std::string(argv[1]) == "-f") + run(read_file_contents(argv[2]), env); + else std::cerr << "invalid arguments" << std::endl; + } catch (MlError &e) { + std::cerr << e.description() << std::endl; + } catch (std::runtime_error &e) { + std::cerr << e.what() << std::endl; + } + + return 0; +} diff --git a/ml.cpp b/ml.cpp index 8797ed5..91273db 100644 --- a/ml.cpp +++ b/ml.cpp @@ -1609,6 +1609,7 @@ namespace builtin { } } + void repl(MlEnvironment &env) { std::string code; std::string input; @@ -1640,22 +1641,6 @@ void repl(MlEnvironment &env) { } } -void load_std_lib(MlEnvironment &env) { - std::string loader = - R"( (define ___lib_path '("/usr/local/var/mlisp")) - (for d ___lib_path - (if (is-dir? d) - (for f (ls-dir d) - (if (regex-search? f "^.*\.l(i)?sp$") - (include (+ d "/" f)) - '()) - ) - '())) - )"; - - run(loader, env); -} - // Does this environment, or its parent environment, have a variable? bool MlEnvironment::has(std::string name) const { // Find the value in the map @@ -1772,57 +1757,3 @@ MlValue MlEnvironment::get(const std::string &name) const { throw MlError(MlValue::atom(name), *this, ATOM_NOT_DEFINED); } - -std::vector getCmdOption(char *argv[], int argc, const std::string &option) { - std::vector tokens; - for (int i = 1; i < argc; ++i) { - if (option == argv[i] && i + 1 < argc) { - i++; - tokens.push_back(std::string(argv[i])); - } - } - return tokens; -} - -bool cmdOptionExists(char **begin, char **end, const std::string &option) { return std::find(begin, end, option) != end; } - -int main(int argc, char *argv[]) { - MlEnvironment env; - std::vector args; - for (int i = 0; i < argc; i++) - args.push_back(MlValue::string(argv[i])); - env.set("cmd-args", MlValue(args)); - - srand(time(NULL)); - try { - load_std_lib(env); - // for xcode profiling - // run(read_file_contents("/Users/vaclavt/Development/mlisp/tests/test.lsp"), env); - - // help - if (cmdOptionExists(argv, argv + argc, "-h")) { - std::cout << "Usage:\n\t-h print this help\n\t-f source_file - executes code in file\n\t-c code - runs passed code\n\t-i runs repl\n\t-v prints version string\n\n"; - return 0; - } - - // version - if (cmdOptionExists(argv, argv + argc, "-v")) { - std::cout << VERSION << std::endl; - return 0; - } - - if (argc == 1 || (argc == 2 && std::string(argv[1]) == "-i")) - repl(env); - else if (argc == 3 && std::string(argv[1]) == "-c") - run(argv[2], env); - else if (argc == 3 && std::string(argv[1]) == "-f") - run(read_file_contents(argv[2]), env); - else std::cerr << "invalid arguments" << std::endl; - } catch (MlError &e) { - std::cerr << e.description() << std::endl; - } catch (std::runtime_error &e) { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/ml.h b/ml.h index 4910d97..e827d49 100644 --- a/ml.h +++ b/ml.h @@ -214,4 +214,4 @@ private: std::string str; std::vector list; MlEnvironment lambda_scope; -}; \ No newline at end of file +}; From b9a44d68b04cf6559b1c264da7fe0b5d5484e58d Mon Sep 17 00:00:00 2001 From: VaclavT Date: Thu, 11 Mar 2021 00:40:54 +0100 Subject: [PATCH 2/2] a bit of doc updates --- Readme.md | 1 + debug.lsp | 6 ------ doc/Doc.md | 32 +++++++++++++++++--------------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/Readme.md b/Readme.md index 3bd9a2a..8ed006a 100644 --- a/Readme.md +++ b/Readme.md @@ -4,6 +4,7 @@ ### TODO - support for (), nil, t, in lsp code replace 0 by nil in logicals +- casting to string (like ti int and to float) - some performance functionality (at least counting how many times symbol was evaluated) - documentation - add url of source/inspiration to clib/*.cpp diff --git a/debug.lsp b/debug.lsp index 5b7945f..20ae9cf 100644 --- a/debug.lsp +++ b/debug.lsp @@ -21,9 +21,3 @@ (term-blue (sprintf "%.2f" (list 1.11))) " " (term-yellow (sprintf "%.2f" (list 1.11))) " " )) - - ;; (define q_change_str (sprintf "%+.2f %%" (list q))) - ;; (if (>= q_change 0.0) - ;; (define q_change_str (term-green q_change_str)) - ;; (define q_change_str (term-red q_change_str))) - diff --git a/doc/Doc.md b/doc/Doc.md index 84edeb8..a64a7ea 100644 --- a/doc/Doc.md +++ b/doc/Doc.md @@ -43,27 +43,27 @@ |`(member list item)`|Returns true (1) when list contains item|| |`(uniq list)`|Returns list with removed duplicates || |`(make-list len)`|Return list with len nil elements|`(make-list 3) => (nil nil nil)`| -|`(make-list-of len value)`||| +|`(make-list-of len value)`|Return list with len value elements|| |`(map ..)`||`(map (lambda (x) (+ x 10)) '(1 2 3 4 5 6)) => (11 12 13 14 15 16)`| |`(filter lambda list)`||`(filter (lambda (x) (> x 2)) '(1 2 3 4 5)) => (3 4 5)`| |`(reduce lambda acumulator list)`||`>>> (reduce (lambda (x y) (+ (* x 10) y)) 0 '(1 2 3 4)) => 1234`| -|`(exit ..)`||| -|`(quit ..)`||| -|`(print ..)`||| -|`(input ..)`||| -|`(random ..)`||| -|`(include ..)`||| -|`(read-file ..)`||| -|`(write-file ..)`||| -|`(read-url ..)`||| -|`(system-cmd ..)`||| -|`(ls-dir ..)`||| +|`(exit code)`|Exit the program with an integer code|| +|`(quit code)`|Same as (exit ..)|| +|`(print ..)`|Print several values and return the last one|| +|`(input [prompt])`|Get user input with an optional prompt|| +|`(random low high)`|Get a random number between two numbers inclusively|| +|`(include file)`|Read a file and execute its code|| +|`(read-file filename)`|Get the contents of a file|| +|`(write-file filename)`|Write a string to a file|| +|`(read-url url [headers])`|Reads URL|Returnd list (status_code content)| +|`(system-cmd command_str)`|Execute system command|| +|`(ls-dir ..)`|List a dir|List of directory entries| |`(is-file? ..)`|Returns true if passed filename is a file|| |`(is-dir? ..)`|Returns true if passed filename is a directory|| -|`(parse-csv ..)`||| -|`(parse-json ..)`||| +|`(parse-csv string)`|Parse CSV string|| +|`(parse-json json_string)`|Parse JSON string|| |`(save-csv ..)`||| -|`(get-universal-time ..)`||| +|`(get-universal-time)`|Get current time as secs from epoch|| |`(date-to-str ..)`||| |`(str-to-date ..)`||| |`(date-add ..)`||| @@ -77,4 +77,6 @@ |`(eval ..)`||| |`(type ..)`||| |`(parse ..)`||| +|`(make-list size)`||| +|`(make-list-of size value)`||| |`(xx ..)`|||