111 lines
3.3 KiB
Markdown
111 lines
3.3 KiB
Markdown
|
|
## 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 <<EOT > /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
|
|
|
|
#### 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
|
|
- add debug support, at least call stack
|
|
- multiline editing (see kilocpp editor)
|
|
- execute system command should capture stderr
|
|
- add some mem stats to benchmark
|
|
- add tests for usql
|
|
|
|
#### Code
|
|
- add documentation
|
|
- add more unit test, mainly for usql
|
|
- rename constants in ml_profiler.h
|
|
- replace to_string macro in ml.cpp
|
|
- add instrumentation (time, nr of evals, num of atoms, debug info, debug environment etc)
|
|
|
|
#### Language
|
|
- support for "#t" or "t" symbol as a true and "#f" for false
|
|
- support for exceptions
|
|
- 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
|
|
- add include-stdlib function for other libs in stdlib dir (during startup stdlib.lsp is loaded only)
|
|
- syntax highlighting do VS Code
|
|
|
|
#### Performance
|
|
- define is one of most frequent callee, when in scope with very few vars, lookup sequentially
|
|
- first, second are often called -> implement in c++
|
|
- 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 ..) 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
|