diff --git a/.gitignore b/.gitignore index 7cb4ef520..4a6282e5f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,5 @@ bindata.go play .vscode .idea -a_*.go +core/a_*.go diff --git a/circle.yml b/circle.yml index 7d7c4300d..db0a7999f 100644 --- a/circle.yml +++ b/circle.yml @@ -5,7 +5,6 @@ dependencies: - mkdir -p ~/.go_workspace/src/github.com/${CIRCLE_PROJECT_USERNAME} - ln -s ${HOME}/${CIRCLE_PROJECT_REPONAME} ${HOME}/.go_workspace/src/github.com/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME} - go get -d -v github.com/chzyer/readline - - if [ ! -e ~/bin/joker ]; then wget -O ~/joker.zip https://github.com/candid82/joker/releases/download/v0.7.2/joker-0.7.2-linux-amd64.zip && unzip ~/joker.zip -d ~/bin; fi - go generate -v ./... - go build -v - ./linter-tests.sh diff --git a/core/object.go b/core/object.go index e80615369..468fa35e5 100644 --- a/core/object.go +++ b/core/object.go @@ -1,7 +1,6 @@ //go:generate go run gen_data/gen_data.go //go:generate go run gen/gen_types.go assert Comparable *Vector Char String Symbol Keyword Regex Bool Number Seqable Callable *Type Meta Int Stack Map Set Associative Reversible Named Comparator *Ratio *Namespace *Var Error *Fn Deref *Atom Ref KVReduce Pending //go:generate go run gen/gen_types.go info *List *ArrayMapSeq *ArrayMap *HashMap *ExInfo *Fn *Var Nil *Ratio *BigInt *BigFloat Char Double Int Bool Keyword Regex Symbol String *LazySeq *MappingSeq *ArraySeq *ConsSeq *NodeSeq *ArrayNodeSeq *MapSet *Vector *VectorSeq *VectorRSeq -//go:generate ../std/generate-std.sh package core diff --git a/std/base64/a_base64.go b/std/base64/a_base64.go new file mode 100644 index 000000000..b7b6e1afd --- /dev/null +++ b/std/base64/a_base64.go @@ -0,0 +1,37 @@ +// This file is generated by generate-std.joke script. Do not edit manually! + +package base64 + +import ( + + . "github.com/candid82/joker/core" +) + +var base64Namespace = GLOBAL_ENV.EnsureNamespace(MakeSymbol("joker.base64")) + +var decode_string_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := base64DecodeString(s) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + + +func init() { + +base64Namespace.ResetMeta(MakeMeta(nil, "Implements base64 encoding as specified by RFC 4648.", "1.0")) + +base64Namespace.InternVar("decode-string", decode_string_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Returns the bytes represented by the base64 string s.`, "1.0")) + +} diff --git a/std/json/a_json.go b/std/json/a_json.go new file mode 100644 index 000000000..f05d9e6f3 --- /dev/null +++ b/std/json/a_json.go @@ -0,0 +1,57 @@ +// This file is generated by generate-std.joke script. Do not edit manually! + +package json + +import ( + + . "github.com/candid82/joker/core" +) + +var jsonNamespace = GLOBAL_ENV.EnsureNamespace(MakeSymbol("joker.json")) + +var write_string_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + v := ExtractObject(args, 0) + res := writeString(v) + return res + + default: + PanicArity(c) + } + return NIL +} + +var read_string_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := readString(s) + return res + + default: + PanicArity(c) + } + return NIL +} + + +func init() { + +jsonNamespace.ResetMeta(MakeMeta(nil, "Implements encoding and decoding of JSON as defined in RFC 4627.", "1.0")) + +jsonNamespace.InternVar("write-string", write_string_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("v"))), + `Returns the JSON encoding of v.`, "1.0")) + +jsonNamespace.InternVar("read-string", read_string_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Parses the JSON-encoded data and return the result as a Joker value.`, "1.0")) + +} diff --git a/std/os/a_os.go b/std/os/a_os.go new file mode 100644 index 000000000..8441780ee --- /dev/null +++ b/std/os/a_os.go @@ -0,0 +1,101 @@ +// This file is generated by generate-std.joke script. Do not edit manually! + +package os + +import ( + "os" + . "github.com/candid82/joker/core" +) + +var osNamespace = GLOBAL_ENV.EnsureNamespace(MakeSymbol("joker.os")) + +var sh_ Proc = func(args []Object) Object { + c := len(args) + switch { + case true: + CheckArity(args, 1,999) + name := ExtractString(args, 0) + arguments := ExtractStrings(args, 1) + res := sh(name, arguments) + return res + + default: + PanicArity(c) + } + return NIL +} + +var env_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 0: + + + res := env() + return res + + default: + PanicArity(c) + } + return NIL +} + +var args_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 0: + + + res := commandArgs() + return res + + default: + PanicArity(c) + } + return NIL +} + +var exit_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + code := ExtractInt(args, 0) + res := NIL; os.Exit(code) + return res + + default: + PanicArity(c) + } + return NIL +} + + +func init() { + +osNamespace.ResetMeta(MakeMeta(nil, "Provides a platform-independent interface to operating system functionality.", "1.0")) + +osNamespace.InternVar("sh", sh_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("name"), MakeSymbol("&"), MakeSymbol("arguments"))), + `Executes the named program with the given arguments. Returns a map with the following keys: + :success - whether or not the execution was successful, + :out - string capturing stdout of the program, + :err - string capturing stderr of the program.`, "1.0")) + +osNamespace.InternVar("env", env_, + MakeMeta( + NewListFrom(NewVectorFrom()), + `Returns a map representing the environment.`, "1.0")) + +osNamespace.InternVar("args", args_, + MakeMeta( + NewListFrom(NewVectorFrom()), + `Returns a sequence of the command line arguments, starting with the program name (normally, joker).`, "1.0")) + +osNamespace.InternVar("exit", exit_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("code"))), + `Causes the current program to exit with the given status code.`, "1.0")) + +} diff --git a/std/string/a_string.go b/std/string/a_string.go new file mode 100644 index 000000000..58311fb6c --- /dev/null +++ b/std/string/a_string.go @@ -0,0 +1,521 @@ +// This file is generated by generate-std.joke script. Do not edit manually! + +package string + +import ( + "strings" + "unicode" + . "github.com/candid82/joker/core" +) + +var stringNamespace = GLOBAL_ENV.EnsureNamespace(MakeSymbol("joker.string")) + +var index_of_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 2: + + s := ExtractString(args, 0) + value := ExtractObject(args, 1) + res := indexOf(s, value, 0) + return res + + case c == 3: + + s := ExtractString(args, 0) + value := ExtractObject(args, 1) + from := ExtractInt(args, 2) + res := indexOf(s, value, from) + return res + + default: + PanicArity(c) + } + return NIL +} + +var lower_case_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := strings.ToLower(s) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var reverse_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := reverse(s) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var split_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 2: + + s := ExtractString(args, 0) + re := ExtractRegex(args, 1) + res := split(s, re, 0) + return res + + case c == 3: + + s := ExtractString(args, 0) + re := ExtractRegex(args, 1) + n := ExtractInt(args, 2) + res := split(s, re, n) + return res + + default: + PanicArity(c) + } + return NIL +} + +var isstarts_with_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 2: + + s := ExtractString(args, 0) + substr := ExtractString(args, 1) + res := strings.HasPrefix(s, substr) + return MakeBool(res) + + default: + PanicArity(c) + } + return NIL +} + +var trim_left_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := strings.TrimLeftFunc(s, unicode.IsSpace) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var isends_with_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 2: + + s := ExtractString(args, 0) + substr := ExtractString(args, 1) + res := strings.HasSuffix(s, substr) + return MakeBool(res) + + default: + PanicArity(c) + } + return NIL +} + +var trim_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := strings.TrimSpace(s) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var escape_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 2: + + s := ExtractString(args, 0) + cmap := ExtractCallable(args, 1) + res := escape(s, cmap) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var join_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + coll := ExtractSeqable(args, 0) + res := join("", coll) + return MakeString(res) + + case c == 2: + + separator := ExtractString(args, 0) + coll := ExtractSeqable(args, 1) + res := join(separator, coll) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var pad_right_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 3: + + s := ExtractString(args, 0) + pad := ExtractString(args, 1) + n := ExtractInt(args, 2) + res := padRight(s, pad, n) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var capitalize_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := capitalize(s) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var replace_first_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 3: + + s := ExtractString(args, 0) + match := ExtractObject(args, 1) + repl := ExtractString(args, 2) + res := replaceFirst(s, match, repl) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var pad_left_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 3: + + s := ExtractString(args, 0) + pad := ExtractString(args, 1) + n := ExtractInt(args, 2) + res := padLeft(s, pad, n) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var isblank_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractObject(args, 0) + res := isBlank(s) + return MakeBool(res) + + default: + PanicArity(c) + } + return NIL +} + +var upper_case_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := strings.ToUpper(s) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var isincludes_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 2: + + s := ExtractString(args, 0) + substr := ExtractString(args, 1) + res := strings.Contains(s, substr) + return MakeBool(res) + + default: + PanicArity(c) + } + return NIL +} + +var last_index_of_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 2: + + s := ExtractString(args, 0) + value := ExtractObject(args, 1) + res := lastIndexOf(s, value, 0) + return res + + case c == 3: + + s := ExtractString(args, 0) + value := ExtractObject(args, 1) + from := ExtractInt(args, 2) + res := lastIndexOf(s, value, from) + return res + + default: + PanicArity(c) + } + return NIL +} + +var trim_newline_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := strings.TrimRight(s, "\n\r") + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var split_lines_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := split(s, newLine, 0) + return res + + default: + PanicArity(c) + } + return NIL +} + +var trim_right_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + s := ExtractString(args, 0) + res := strings.TrimRightFunc(s, unicode.IsSpace) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + +var replace_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 3: + + s := ExtractString(args, 0) + match := ExtractObject(args, 1) + repl := ExtractString(args, 2) + res := replace(s, match, repl) + return MakeString(res) + + default: + PanicArity(c) + } + return NIL +} + + +func init() { + +stringNamespace.ResetMeta(MakeMeta(nil, "Implements simple functions to manipulate strings.", "1.0")) + +stringNamespace.InternVar("index-of", index_of_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("value")), NewVectorFrom(MakeSymbol("s"), MakeSymbol("value"), MakeSymbol("from"))), + `Return index of value (string or char) in s, optionally searching + forward from from or nil if not found.`, "1.0")) + +stringNamespace.InternVar("lower-case", lower_case_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Converts string to all lower-case.`, "1.0")) + +stringNamespace.InternVar("reverse", reverse_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Returns s with its characters reversed.`, "1.0")) + +stringNamespace.InternVar("split", split_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("re")), NewVectorFrom(MakeSymbol("s"), MakeSymbol("re"), MakeSymbol("n"))), + `Splits string on a regular expression. Returns vector of the splits.`, "1.0")) + +stringNamespace.InternVar("starts-with?", isstarts_with_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("substr"))), + `True if s starts with substr.`, "1.0")) + +stringNamespace.InternVar("trim-left", trim_left_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Removes whitespace from the left side of string.`, "1.0")) + +stringNamespace.InternVar("ends-with?", isends_with_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("substr"))), + `True if s ends with substr.`, "1.0")) + +stringNamespace.InternVar("trim", trim_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Removes whitespace from both ends of string.`, "1.0")) + +stringNamespace.InternVar("escape", escape_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("cmap"))), + `Return a new string, using cmap to escape each character ch + from s as follows: + + If (cmap ch) is nil, append ch to the new string. + If (cmap ch) is non-nil, append (str (cmap ch)) instead.`, "1.0")) + +stringNamespace.InternVar("join", join_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("coll")), NewVectorFrom(MakeSymbol("separator"), MakeSymbol("coll"))), + `Returns a string of all elements in coll, as returned by (seq coll), separated by an optional separator.`, "1.0")) + +stringNamespace.InternVar("pad-right", pad_right_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("pad"), MakeSymbol("n"))), + `Returns s padded with pad at the end to length n.`, "1.0")) + +stringNamespace.InternVar("capitalize", capitalize_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Converts first character of the string to upper-case, all other + characters to lower-case.`, "1.0")) + +stringNamespace.InternVar("replace-first", replace_first_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("match"), MakeSymbol("repl"))), + `Replaces the first instance of match (String of Regex) with string repl in string s. + + If match is Regex, $1, $2, etc. in the replacement string repl are + substituted with the string that matched the corresponding + parenthesized group in the pattern. + `, "1.0")) + +stringNamespace.InternVar("pad-left", pad_left_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("pad"), MakeSymbol("n"))), + `Returns s padded with pad at the beginning to length n.`, "1.0")) + +stringNamespace.InternVar("blank?", isblank_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `True if s is nil, empty, or contains only whitespace.`, "1.0")) + +stringNamespace.InternVar("upper-case", upper_case_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Converts string to all upper-case.`, "1.0")) + +stringNamespace.InternVar("includes?", isincludes_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("substr"))), + `True if s includes substr.`, "1.0")) + +stringNamespace.InternVar("last-index-of", last_index_of_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("value")), NewVectorFrom(MakeSymbol("s"), MakeSymbol("value"), MakeSymbol("from"))), + `Return last index of value (string or char) in s, optionally + searching backward from from or nil if not found.`, "1.0")) + +stringNamespace.InternVar("trim-newline", trim_newline_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Removes all trailing newline \n or return \r characters from string.`, "1.0")) + +stringNamespace.InternVar("split-lines", split_lines_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Splits string on \n or \r\n. Returns vector of the splits.`, "1.0")) + +stringNamespace.InternVar("trim-right", trim_right_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"))), + `Removes whitespace from the right side of string.`, "1.0")) + +stringNamespace.InternVar("replace", replace_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("s"), MakeSymbol("match"), MakeSymbol("repl"))), + `Replaces all instances of match (String of Regex) with string repl in string s. + + If match is Regex, $1, $2, etc. in the replacement string repl are + substituted with the string that matched the corresponding + parenthesized group in the pattern. + `, "1.0")) + +} diff --git a/std/time/a_time.go b/std/time/a_time.go new file mode 100644 index 000000000..5f538bf85 --- /dev/null +++ b/std/time/a_time.go @@ -0,0 +1,38 @@ +// This file is generated by generate-std.joke script. Do not edit manually! + +package time + +import ( + + . "github.com/candid82/joker/core" +) + +var timeNamespace = GLOBAL_ENV.EnsureNamespace(MakeSymbol("joker.time")) + +var sleep_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 1: + + d := ExtractInt(args, 0) + res := sleep(d) + return res + + default: + PanicArity(c) + } + return NIL +} + + +func init() { + +timeNamespace.ResetMeta(MakeMeta(nil, "Provides functionality for measuring and displaying time.", "1.0")) + +timeNamespace.InternVar("sleep", sleep_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("d"))), + `Pauses the execution thread for at least the duration d (expressed in nanoseconds). + A negative or zero duration causes sleep to return immediately.`, "1.0")) + +}