Merge branch 'master' of https://bitbucket.org/vaclavt/mlisp into HEAD

# Conflicts:
#	Readme.md
#	ml.cpp
This commit is contained in:
VaclavT 2021-03-12 20:15:24 +01:00
commit dc61c74992
5 changed files with 101 additions and 22 deletions

View File

@ -22,6 +22,7 @@ project(ml)
set(PROJECT_NAME ml)
set(SOURCE
main.cpp
ml.cpp
ml_io.cpp
ml_date.cpp

View File

@ -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)))

View File

@ -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 ..)`|||

82
main.cpp Normal file
View File

@ -0,0 +1,82 @@
#include "ml.h"
#include "ml_io.h"
#include <iostream>
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<std::string> getCmdOption(char *argv[], int argc, const std::string &option) {
std::vector<std::string> 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<MlValue> 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;
}