a lisp syntax like mini interpreter
- cpp-linenoise
- boost::variant
- boost::asio (http-get url)
- gumbo-parser
- gumbo-query (gumbo-query content query-string)
- posix regex
- sarrow104/ss1x
- sarrow104/sss
(+ ...) -> number(- arg ...) -> number(* ...) -> number(/ arg ...) -> number(% arg ...) -> number(power arg1 arg2) -> number
(& int1 int2 ...) -> int64_t(| int1 int2 ...) -> int64_t(>> int64_t shift) -> int64_t(<< int64_t shift) -> int64_t(~ int64_t) -> int64_t(^ int1 int2 ...) -> int64_t
(= obj1 obj2) -> #t | #f(!= obj1 obj2) -> #t | #f(> obj1 obj2) -> #t | #f(< obj1 obj2) -> #t | #f(>= obj1 obj2) -> #t | #f(<= obj1 obj2) -> #t | #f(not expr) -> !#t | !#f(equal '(list1) '(list2)) -> #t | #f
(defer (expr)) -> nil
(uchardet "content") -> "utf8"(pychardet "content") -> "utf8"(ivchardet "encodings" "content") -> "utf8"(iconv "enc-from" "enc-to" "content") -> "converted-out"(ensure-utf8 "content") -> "utf8-content"
(errno) -> int64_t(strerr) -> string
(eval '(...)) -> ...
(read-all "path/to/file") -> string(write content "path/to/file")(write-append content "path/to/file")(open "path" flag) -> file_descriptor | nil(getfdflag fd) -> flag | nil(setfdflag fd flag) -> errno(close file_descriptor) -> errno(read-line file_descriptor) -> string | nill(read-char file_descriptor) -> int64_t | nill(write-char file_descriptor int64_t) -> int64_t | nill(write-string file_descriptor string) -> int64_t | nill(list-opened-fd) -> [(fd name)...] | []
(split "string-to-be-split")(split "string-to-be-split" "sepeator-char")(join (content list))(join (content list) "sepeator-string")(substr-byte "target-string" offset)(substr-byte "target-string" offset length) -> sub-str(substr "target-string" offset)(substr "target-string" offset length)(ltrim "target-string") -> "left-trimed-string"(rtrim "target-string") -> "right-trimed-string"(trim "target-string") -> "bothsides-trimed-string"(strlen "target-string") -> length(strlen-byte "target-string") -> length(split-char "target-string") -> '(int64_t-char1 int64_t-char2 ...)(join-char '(int64_t-char1 int64_t-char2 ...)) -> "string"(byte-nth int64_nth "string" -> int64_t)(char-nth int64_nth "string" -> int64_t)(strstr "source" "needle") -> offset-int | nil(is-begin-with "source" "needle") -> boolean(is-end-with "source" "needle") -> boolean
(http-timeout) -> cur-timeout-in-seconds(http-timeout new-timeout-in-seconds) -> old-timeout-in-seconds(http-debug) -> cur-http-debug-status(http-debug new-http-debug-status) -> old-http-debug-status(http-get "url") -> [<html>, {response}](http-get "url" {request_header}) -> [<html>, {response}](http-get "url" "proxy-url" proxy-port-number) -> [<html>, {response}](http-get "url" "proxy-url" proxy-port-number {request_header}) -> [<html>, {response}](http-post "url" content) -> [<html>, {response}](http-post "url" content {request_header}) -> [<html>, {response}](http-post "url" content "proxy-url" proxy-port-number) -> [<html>, {response}](http-post "url" content "proxy-url" proxy-port-number {request_header}) -> [<html>, {response}]
(gumbo "\<html\>") -> gumboNode(gumbo "\<html\>" "query-string") -> '(gumboNode)(gumbo-query gumboNode "selector-string") -> '(gumboNodes)(gumbo-query "html-file-content" "gumbo-query-string")(gumbo-children gumboNode) -> '(gumboNodes)(gqnode-indent) -> "current-indent"(gqnode-indent "new-indent") -> "new-accept-indent"(gqnode-attr gumboNode "attrib-name") -> "attrib-value" | nil(gqnode-hasAttr gumboNode "attrib-name") -> #t | #f(gqnode-valid gumboNode) -> boolean(gqnode-isText gumboNode) -> boolean(gqnode-text gumboNode) -> "text"(gqnode-textNeat gumboNode) -> "text"(gqnode-ownText gumboNode) -> "text"(gqnode-tag gumboNode) -> "text"(gqnode-innerHtml gumboNode) -> "text"(gqnode-outerHtml gumboNode) -> "text"(gumbo-query-text "<html>" "selector-string")(gumbo-original-rewrite) -> boolean(gumbo-original-rewrite boolean) -> boolean(gumbo-rewrite int-fd '(gq-node) "") -> nil(gumbo-rewrite int-fd {request_header} '(gq-node) "") -> nil(gumbo-rewrite [int-fd proxy-domain proxy-port] '(gq-node) "") -> nil(gumbo-rewrite [int-fd proxy-domain proxy-port] {request_header} '(gq-node) "") -> nil
(quit) -> #t(it-debug #t|#f) -> nil(colog-format CL_ELEMENT) -> current-format-mask
(car (list item1 item2 ...)) -> item1(cdr '(list item1 item2 ...)) -> '(item2 item3 ...)...(cons 1 (cons 2 '())) -> '(1 2)(length '(list)) -> quote-list-length(empty? '(list)) -> boolean(append '(list1) '(list2)) -> '(list1 list2)(flat '(list...)) -> '(list...)(slice '(list) begin end)(slice '(list) begin end step)(range begin end)(range begin end step)(find item '(list)) -> index | nil(find item '(list) operation) -> index | nil
(load "path/to/lisp") -> nil(save "path/to/lisp") -> item-count(clear) -> item-count
-
(regex "regex-string") -> regex-obj -
(regex-match reg-obj "target-string") -> boolean -
(regex-search reg-obj "target-string") -> (list sub0, sub1 ...) -
(regex-search reg-obj "target-string" offset-in-number) -> (list sub0, sub1 ...) -
(regex-replace reg-obj "target-string") -> string -
(regex-replace reg-obj "target-string" "format-string") -> string -
(regex-replace reg-obj "target-string" functor) -> string -
(regex-split sep-reg "target-string") -
(regex-collect reg "target-string") -
(regex-collect reg "target-string" "fmt-string")
(path-fnamemodify "path/string" "path modifier") -> "modified-fname"(path-append part1 part2) -> part1/part2(glob "paht/to/explorer") -> '("fname1", "fname2", ...)(glob-recurse "paht/to/explorer" "fname-filter" depth) -> '("fname1", "fname2", ...)(file? "path/to/file") -> boolean(directory? "path/to/directory") -> boolean(expand "$var-path") -> "expand-path"
(io-print "fmt" ...)(io-print-ln "fmt\n" ...)(io-fmt "fmt-str" arg1 arg2 ... argn) -> "fmt-out"(format stream-fd "fmt-str" arg1 arg2 ... argn) -> ...(fmt-escape "normal-string-may-have-curly-bracket") -> "scaped-string"
(shell "") -> '(stdout, stderr)(shell "" arg1 arg2 arg3) -> '(stdout, stderr)(shell-cd "path/to/go") -> "new-work-dir"(system "") -> return-code(system "" arg1 arg2 arg3) -> return-code(shell-mkdir "path/to/make") -> "full/path" | nil(shell-pwd) -> "current-working-dir"(shell-env) -> {(kev \"value\")...}(shell-env key) -> "value-string" | nil...
(sort func '(list)) -> '(sorted-list)(sort! func '(list)) -> nil# NOTE in-place sort
(time-elapsed expr) -> result-of-expr(date) -> [year month day](date-time) -> [year month day HH MM SS](date-time seconds-since-Epoch) -> [year month day HH MM SS](date-time-nano) -> [year month day HH MM SS nano](time-format \"fmt\" '()) -> string(time-strparse \"27 December 2016, at 13:17\" \"%d %h %Y, at %H:%M\") -> '(time-list)(time expr) -> result-of-expr
(typeid type) -> id(number? type) -> #t | #f...(null? nil) -> #t(cast lexical-value var) -> type-of-lexical-value
(help symbol) -> nil(get-help symbol) -> string
(undef symbol) -> boolean(ifdef symbol) -> boolean(var-list) -> int64_t(let ((symbol expr)...) (expr)...) -> result-of-last-expr(letn ((symbol expr)...) (expr)...) -> result-of-last-expr(set 'quote-symbal expr) -> value-of-expr(setq symbol1 expr1 symbol2 expr2 ... ) -> value-of-last-expr(setf "varname" expr) -> nil(swap var1 var2) -> nil(locate {}-or-[]-value '(string-or-int...)) -> sub-value(symbols) -> [current-symbol-list]](symbols {}-name) -> [target-{}-symbol-list]
(map func list-1 list-2 ... list-n) -> '(func(l1[1] l2[1] ... ln[1]) func(l1[2] l2[2] ... ln[2]) ... func(l1[n] l2[n] ... ln[n]))(reduce func list) -> func(func(func(l[1] l[2]) l[3]) ... l[n-1]) l[n])(filter func list) -> (sigma list[i] where (func list[i]) == #t)(transform func list) -> '(func(car-nth i list) ... )
(json-print obj boolean) -> nil(json-string obj boolean) -> nil(json-indent) -> "current-json-indent-setting"(json-indent "string") -> "json-indent-setting"(apply func '(args...))
(call? symbol) -> boolean(signature func-symbol) -> [min, max, "help_msg"] | nil(curry func var...) -> (lambda ($1) (apply func '($1 var...)))(partial func var... $1...) -> (lambda ($1...) (apply f '(var... $...)))
(min [obj1 obj2...]) -> the-minimum-element(min obj1 obj2...) -> the-minimum-element(max [obj1 obj2...]) -> the-maximum-element(max obj1 obj2...) -> the-maximum-element
(en-base64 "string") -> "enc"(de-base64 "string") -> "decode"(en-gzip "string") -> "enc"(de-gzip "string") -> "dec"(deflate "string") -> "dec"(inflate "string") -> "dec"
(digest-sha1-file "path/to/file") -> "sha1-string" | nil(digest-hex-string "bytes-content-to-hex") -> "hex-string"
(catch expr (value1)...) -> result-of-expr | exception-value(catch expr (value1 on_except_type1)...) -> result-of-expr | result-of-on_value_handle-on-exception-value(throw value) -> nil(std-exception expr) -> result-of-expr
(mime-file "path-to-file") -> mime-type-string(mime-buffer "string-buffer-to-detect") -> mime-type-string
(url-split "url-string") -> '(protocal domain port path {parameters})(url-join '(protocal domain port path {parameters})) -> "url-string"(url-full target-string mapping-url) -> "full-url-string"(url-encode "string") -> "encoded-string"(url-decode "encoded-string") -> "string"
- for
(for (var s-list) expr...) -> result-of-last-expr(for (var ini-value end-value) expr...) ->result-of-last-expr(for (var ini-value end-value step) expr...) -> result-of-last-expr(for ((v1 a1 v2 a2...) condition (iterate-expr)) expr...) -> result-of-last-expr
(begin expr...) -> result-of-last-expr(silent expr...) -> result-of-last-expr(tie ('var-list...) [list...])
(cookie-enable boolean) -> boolean(cookie-enable?) -> boolean(cookie-get-value "domain" "path") -> "cookie-value" | nil(cookie-set-value "domain" "path" "cookie") -> boolean
> (regex-collect (regex "[0-9]+") "123 abc 1645 798a8709801")
("123" "1645" "798" "8709801")
> (regex-split (regex "[a-zA-Z ]+") "123 abc 1645 798a8709801")
("123" "1645" "798" "8709801")just a toy
-
2016-11-17 支持命令行启动程序;回显控制,启动脚步控制;
-
2016-11-10 内置
gumbo-node类型,以支援更丰富的html信息抽取 -
debug模式 用內建函数开关debug模式,以便查看解释器动作流程。
-
2016-11-25 http-get支持301,302自动跳转;支持通过proxy下载https资源。
-
2016-11-09 支持map,reduce,filter算法
-
2016-11-10 內建gumbo-node,将gumbo-query算法内置;
-
2016-11-29 內建帮助系统;命令(help symbol)即可显示內建函数,以及自定义函数的帮助信息。
...