Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve std/generate-std.joke Script #137

Merged
merged 2 commits into from Dec 7, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
28 changes: 14 additions & 14 deletions std/base64/a_base64.go
Expand Up @@ -9,32 +9,32 @@ import (

var base64Namespace = GLOBAL_ENV.EnsureNamespace(MakeSymbol("joker.base64"))

var decode_string_ Proc = func(args []Object) Object {
c := len(args)
var decode_string_ Proc = func(_args []Object) Object {
_c := len(_args)
switch {
case c == 1:
case _c == 1:

s := ExtractString(args, 0)
res := decodeString(s)
return MakeString(res)
s := ExtractString(_args, 0)
_res := decodeString(s)
return MakeString(_res)

default:
PanicArity(c)
PanicArity(_c)
}
return NIL
}

var encode_string_ Proc = func(args []Object) Object {
c := len(args)
var encode_string_ Proc = func(_args []Object) Object {
_c := len(_args)
switch {
case c == 1:
case _c == 1:

s := ExtractString(args, 0)
res := encodeString(s)
return MakeString(res)
s := ExtractString(_args, 0)
_res := encodeString(s)
return MakeString(_res)

default:
PanicArity(c)
PanicArity(_c)
}
return NIL
}
Expand Down
6 changes: 3 additions & 3 deletions std/fn.tmpl
@@ -1,9 +1,9 @@
var {fnName} Proc = func(args []Object) Object {
c := len(args)
var {fnName} Proc = func(_args []Object) Object {
_c := len(_args)
switch {
{arities}
default:
PanicArity(c)
PanicArity(_c)
}
return NIL
}
55 changes: 38 additions & 17 deletions std/generate-std.joke
Expand Up @@ -20,6 +20,12 @@
[s]
(str "\"" s "\""))

(defn raw-quoted-string
"Returns a Go-style backtick-quoted string with backticks handled by appending double-quoted backticks"
[s]
(str "`" (rpl s "`" "` + \"`\" + `") "`")
)

(defn go-name
[fn-name]
(let [n (-> fn-name
Expand All @@ -39,7 +45,7 @@
(let [m (meta arg)
t (cond-> (:tag m)
(:varargs m) (str "s"))]
(str arg " := Extract" t "(args, " (str i) ")")))
(str arg " := Extract" t "(_args, " (str i) ")")))
args)))

(defn handle-varargs
Expand All @@ -62,18 +68,18 @@
:else (get go cnt))
go-res (if (joker.string/starts-with? go-expr "!")
(subs go-expr 1)
(str "res := " go-expr))]
(str "_res := " go-expr))]
(-> arity-template
(rpl "{arity}" (if varargs? "true" (str "c == " (count args))))
(rpl "{arity}" (if varargs? "true" (str "_c == " (count args))))
(rpl "{arityCheck}" (if varargs?
(str "CheckArity(args, " (dec cnt) "," 999 ")")
(str "CheckArity(_args, " (dec cnt) "," 999 ")")
""))
(rpl "{args}" (extract-args handle-args))
(rpl "{goExpr}" go-res)
(rpl "{return}"
(if tag
(str "return Make" tag "(res)")
"return res")))))
(str "return Make" tag "(_res)")
"return _res")))))

(defn generate-arglist
[args]
Expand All @@ -83,7 +89,7 @@
")"))

(defn generate-fn
[ns-sym k v]
[ns-name ns-name-final k v]
(let [m (meta v)
arglists (:arglists m)
go-fn-name (go-name (str k))
Expand All @@ -92,34 +98,49 @@
(rpl "{fnName}" go-fn-name)
(rpl "{arities}" arities))
intern-str (-> intern-template
(rpl "{nsName}" (str ns-sym))
(rpl "{nsFullName}" ns-name)
(rpl "{nsName}" ns-name-final)
(rpl "{fnName}" (str k))
(rpl "{goName}" go-fn-name)
(rpl "{fnDocstring}" (:doc m))
(rpl "{fnDocstring}" (raw-quoted-string (:doc m)))
(rpl "{added}" (:added m))
(rpl "{args}"
(joker.string/join ", " (for [args arglists]
(generate-arglist args)))))]
[fn-str intern-str]))

(defn comment-out
[s]
(-> s
(rpl "\n// " "\n")
(rpl "\n" "\n//")
(rpl "\n// package" "\npackage")))

(defn generate-ns
[ns-sym]
[ns-sym ns-name ns-name-final]
(let [ns (find-ns ns-sym)
m (meta ns)
fns (for [[k v] (sort-by first (ns-publics ns))]
(generate-fn ns-sym k v))
(generate-fn ns-name ns-name-final k v))
res (-> package-template
(rpl "{nsName}" (str ns-sym))
(rpl "{nsFullName}" ns-name)
(rpl "{nsName}" ns-name-final)
(rpl "{imports}" (joker.string/join "\n " (map q (:go-imports m))))
(rpl "{fns}" (joker.string/join "\n" (map first fns)))
(rpl "{nsDocstring}" (:doc m))
(rpl "{interns}" (joker.string/join "\n" (map second fns))))]
(rpl "{interns}" (joker.string/join "\n" (map second fns))))
res (if (:empty m)
(comment-out res)
res)]
res))

(defn ns-file-name
[ns-sym]
(str ns-sym "/a_" ns-sym ".go"))
[dir ns-name-final]
(str dir "/a_" ns-name-final ".go"))

(doseq [ns-sym namespaces]
(spit (ns-file-name ns-sym)
(generate-ns ns-sym)))
(let [ns-name (str ns-sym)
dir (rpl ns-name "." "/")
ns-name-final (rpl ns-name #".*[.]" "")]
(spit (ns-file-name dir ns-name-final)
(generate-ns ns-sym ns-name ns-name-final))))
28 changes: 14 additions & 14 deletions std/html/a_html.go
Expand Up @@ -9,32 +9,32 @@ import (

var htmlNamespace = GLOBAL_ENV.EnsureNamespace(MakeSymbol("joker.html"))

var escape_ Proc = func(args []Object) Object {
c := len(args)
var escape_ Proc = func(_args []Object) Object {
_c := len(_args)
switch {
case c == 1:
case _c == 1:

s := ExtractString(args, 0)
res := html.EscapeString(s)
return MakeString(res)
s := ExtractString(_args, 0)
_res := html.EscapeString(s)
return MakeString(_res)

default:
PanicArity(c)
PanicArity(_c)
}
return NIL
}

var unescape_ Proc = func(args []Object) Object {
c := len(args)
var unescape_ Proc = func(_args []Object) Object {
_c := len(_args)
switch {
case c == 1:
case _c == 1:

s := ExtractString(args, 0)
res := html.UnescapeString(s)
return MakeString(res)
s := ExtractString(_args, 0)
_res := html.UnescapeString(s)
return MakeString(_res)

default:
PanicArity(c)
PanicArity(_c)
}
return NIL
}
Expand Down
46 changes: 23 additions & 23 deletions std/http/a_http.go
Expand Up @@ -9,49 +9,49 @@ import (

var httpNamespace = GLOBAL_ENV.EnsureNamespace(MakeSymbol("joker.http"))

var send_ Proc = func(args []Object) Object {
c := len(args)
var send_ Proc = func(_args []Object) Object {
_c := len(_args)
switch {
case c == 1:
case _c == 1:

request := ExtractMap(args, 0)
res := sendRequest(request)
return res
request := ExtractMap(_args, 0)
_res := sendRequest(request)
return _res

default:
PanicArity(c)
PanicArity(_c)
}
return NIL
}

var start_file_server_ Proc = func(args []Object) Object {
c := len(args)
var start_file_server_ Proc = func(_args []Object) Object {
_c := len(_args)
switch {
case c == 2:
case _c == 2:

addr := ExtractString(args, 0)
root := ExtractString(args, 1)
res := startFileServer(addr, root)
return res
addr := ExtractString(_args, 0)
root := ExtractString(_args, 1)
_res := startFileServer(addr, root)
return _res

default:
PanicArity(c)
PanicArity(_c)
}
return NIL
}

var start_server_ Proc = func(args []Object) Object {
c := len(args)
var start_server_ Proc = func(_args []Object) Object {
_c := len(_args)
switch {
case c == 2:
case _c == 2:

addr := ExtractString(args, 0)
handler := ExtractCallable(args, 1)
res := startServer(addr, handler)
return res
addr := ExtractString(_args, 0)
handler := ExtractCallable(_args, 1)
_res := startServer(addr, handler)
return _res

default:
PanicArity(c)
PanicArity(_c)
}
return NIL
}
Expand Down
2 changes: 1 addition & 1 deletion std/intern.tmpl
@@ -1,4 +1,4 @@
{nsName}Namespace.InternVar("{fnName}", {goName},
MakeMeta(
NewListFrom({args}),
`{fnDocstring}`, "{added}"))
{fnDocstring}, "{added}"))
28 changes: 14 additions & 14 deletions std/json/a_json.go
Expand Up @@ -9,32 +9,32 @@ import (

var jsonNamespace = GLOBAL_ENV.EnsureNamespace(MakeSymbol("joker.json"))

var read_string_ Proc = func(args []Object) Object {
c := len(args)
var read_string_ Proc = func(_args []Object) Object {
_c := len(_args)
switch {
case c == 1:
case _c == 1:

s := ExtractString(args, 0)
res := readString(s)
return res
s := ExtractString(_args, 0)
_res := readString(s)
return _res

default:
PanicArity(c)
PanicArity(_c)
}
return NIL
}

var write_string_ Proc = func(args []Object) Object {
c := len(args)
var write_string_ Proc = func(_args []Object) Object {
_c := len(_args)
switch {
case c == 1:
case _c == 1:

v := ExtractObject(args, 0)
res := writeString(v)
return res
v := ExtractObject(_args, 0)
_res := writeString(v)
return _res

default:
PanicArity(c)
PanicArity(_c)
}
return NIL
}
Expand Down