diff --git a/CHANGELOG.md b/CHANGELOG.md index 5baeaa38..b789352d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ All notable changes to this project will be documented in this file. ## Unreleased - ??? +- Fix bug in `getline`. - Add `sh-rule` and `sh-phony` to jpm's dialect of Janet. - Change C api's `janet_formatb` -> `janet_formatbv`. - Add C `janet_formatb` to C api. diff --git a/auxbin/jpm b/auxbin/jpm index 19f7d9e9..1963a89e 100755 --- a/auxbin/jpm +++ b/auxbin/jpm @@ -187,20 +187,25 @@ [into x] (when x (proto-flatten into (table/getproto x)) - (loop [k :keys x] - (put into k (x k)))) + (merge-into into x)) into) +(defn make-jpm-env + "Build an environment table with jpm functions preloaded." + [&opt no-deps] + (def env (make-env)) + (put env :jpm-no-deps no-deps) + (loop [k :keys _env :when (symbol? k)] + (unless ((_env k) :private) (put env k (_env k)))) + env) + (defn require-jpm "Require a jpm file project file. This is different from a normal require in that code is loaded in the jpm environment." [path &opt no-deps] - (def env (make-env)) - (put env :jpm-no-deps no-deps) (unless (os/stat path :mode) (error (string "cannot open " path))) - (loop [k :keys _env :when (symbol? k)] - (unless ((_env k) :private) (put env k (_env k)))) + (def env (make-jpm-env no-deps)) (def currenv (proto-flatten @{} (fiber/getenv (fiber/current)))) (loop [k :keys currenv :when (keyword? k)] (put env k (currenv k))) @@ -1053,17 +1058,23 @@ Flags are: (defn jpm-repl [] - (def env (require-jpm "./project.janet")) - (def p (env :project)) - (def name (p :name)) + (def env + (try + (require-jpm "./project.janet") + ([err f] + (if (= "cannot open ./project.janet" err) + (put (make-jpm-env) :project {}) + (propagate err f))))) (setdyn :pretty-format (if-not (dyn :nocolor) "%.20Q" "%.20q")) (setdyn :err-color (if-not (dyn :nocolor) true)) - (print "Project: " name) - (print "Repository: " (p :repo)) - (print "Author: " (p :author)) + (def p (env :project)) + (def name (p :name)) + (if name (print "Project: " name)) + (if-let [r (p :repo)] (print "Repository: " r)) + (if-let [a (p :author)] (print "Author: " a)) (defn getchunk [buf p] (def [line] (parser/where p)) - (getline (string "jpm[" name "]:" line ":" (parser/state p :delimiters) "> ") buf env)) + (getline (string "jpm[" (or name "repl") "]:" line ":" (parser/state p :delimiters) "> ") buf env)) (repl getchunk nil env)) (def- subcommands diff --git a/src/boot/boot.janet b/src/boot/boot.janet index 89357727..84d55c5a 100644 --- a/src/boot/boot.janet +++ b/src/boot/boot.janet @@ -501,7 +501,7 @@ that define something to loop over. They are formatted like:\n\n \tbinding :verb object/expression\n\n Where binding is a binding as passed to def, :verb is one of a set of keywords, - and object is any janet expression. The available verbs are:\n\n + and object is any expression. The available verbs are:\n\n \t:iterate - repeatedly evaluate and bind to the expression while it is truthy.\n \t:range - loop over a range. The object should be two element tuple with a start and end value, and an optional positive step. The range is half open, [start, end).\n @@ -1482,10 +1482,10 @@ ### (defn- env-walk - [pred &opt env] + [pred &opt env local] (default env (fiber/getenv (fiber/current))) (def envs @[]) - (do (var e env) (while e (array/push envs e) (set e (table/getproto e)))) + (do (var e env) (while e (array/push envs e) (set e (table/getproto e)) (if local (break)))) (def ret-set @{}) (loop [envi :in envs k :keys envi @@ -1494,16 +1494,18 @@ (sort (keys ret-set))) (defn all-bindings - "Get all symbols available in an enviroment. Defaults to the current - fiber's environment." - [&opt env] - (env-walk symbol? env)) + "Get all symbols available in an environment. Defaults to the current + fiber's environment. If local is truthy, will not show inherited bindings + (from prototype tables)." + [&opt env local] + (env-walk symbol? env local)) (defn all-dynamics "Get all dynamic bindings in an environment. Defaults to the current - fiber's environment." - [&opt env] - (env-walk keyword? env)) + fiber's environment. If local is truthy, will not show inherited bindings + (from prototype tables)." + [&opt env local] + (env-walk keyword? env local)) (defn doc-format "Reformat text to wrap at a given line." @@ -1701,7 +1703,7 @@ ret) (defn all - "Returns true if all xs are truthy, otherwise the resulty of first + "Returns true if all xs are truthy, otherwise the result of first falsey predicate value, (pred x)." [pred xs] (var ret true) @@ -1915,7 +1917,7 @@ (eflush)) (defn run-context - "Run a context. This evaluates expressions of janet in an environment, + "Run a context. This evaluates expressions in an environment, and is encapsulates the parsing, compilation, and evaluation. Returns (in environment :exit-value environment) when complete. opts is a table or struct of options. The options are as follows:\n\n\t @@ -2672,7 +2674,7 @@ ### ### -(def root-env "The root environment used to create envionments with (make-env)" _env) +(def root-env "The root environment used to create environments with (make-env)" _env) (do (put _env 'boot/opts nil)