## ml is a small lisp interpreter based on Adam McDaniel's wisp interpreter (https://github.com/adam-mcdaniel/wisp). It's main purpose is to learn something about more recent c++ ### Example of use ``` cat < /tmp/qs.lsp (defun qs (l) (if (<= (len l) 1) l (do (define pivot (first l)) (+ (qs (filter (lambda (n) (> pivot n)) l)) (list pivot) (qs (tail (filter (lambda (n) (<= pivot n)) l))) )) )) (print (qs '(10 9 8 7 6 5 4 3 2 10))) EOT ml -f /tmp/qs.lsp ``` or ``` ml -f tests/test.lsp ``` #### Interactive mode ``` ml ``` #### Documentation see /doc/Doc.md #### Dependencies - libssl-dev #### Compile ``` mkdir -p build gcc -std=c99 -c -O2 -o linenoise.o clib/linenoise.c c++ -c -O2 -I/usr/local/opt/openssl/include -Iclib --std=c++17 ml.cpp ml_io.cpp ml_date.cpp ml_string.cpp ml_util.cpp ml_profiler.cpp ml_usql.cpp clib/json11.cpp clib/csvparser.cpp clib/sslclient.cpp clib/printf.cpp usql/exception.cpp usql/lexer.cpp usql/parser.cpp usql/usql.cpp usql/table.cpp usql/table.h usql/row.cpp usql/csvreader.cpp usql/usql.cpp usql/usql_ddl.cpp usql/usql_dml.cpp usql/settings.cpp // on linux c++ -o build/ml -O2 -L/usr/local/lib -L/usr/local/opt/openssl/lib -lm -lstdc++ -lcrypto -lssl *.o c++ -o build/ml -O2 -L/usr/local/lib -L/usr/local/opt/openssl/lib -lm -lstdc++ -lcrypto -lssl -Wl,-stack_size -Wl,0x1000000 *.o ``` or use ``` cmake . make ``` #### Install ``` cp build/ml /usr/local/bin/ml cp stdlib/*.lsp /usr/local/var/mlisp/ ``` or ``` utils/local_install.sh ``` ### KNOWNN BUGS (read-url "https://api.nasdaq.com/api/calendar/dividends/") ; hangs in sslclient.cpp line 132 ### TODO - better formating of help - unify -f and -run options - add debug support, at least call stack - multiline editing (see kilocpp editor) - execute system command should capture stderr - add some mem stats to benchmark #### Code - tcpnet should use RAII - add documentation - some code lide (doc::add func_name desc example flags), (doc::help name), (doc::appropos text) - add more unit test, mainly for usql - add instrumentation (time, nr of evals, num of atoms, debug info, debug environment etc) #### Language - string functions - compare - needed for sorting, cmp ignore case - regexp match, regexp tokens - date support - decode-universal-time (http://www.lispworks.com/documentation/HyperSpec/Body/f_dec_un.htm) - env functions - get-env, set-env; set-env cannot be implemented in stdlib.lsp, because popen is in fact subshell - version should include whether build is debug build #### Performance - push_back - repeatedly without reserving size - range - with for(int i...) and reserving result size can be 3times faster on (range 1 10000) - mini_sprintf - unnecesary copying between vector and list - (do, scope, cond ..) repeatedly assign to acc ### Links https://github.com/adam-mcdaniel/wisp https://github.com/dropbox/json11 https://github.com/antirez/linenoise #### read stdout and stderr from popen https://stackoverflow.com/questions/478898how-do-i-execute-a-command-and-get-the-output-of-the-command-within-c-using-po