1
0
mirror of https://github.com/janet-lang/janet synced 2024-11-28 11:09:54 +00:00

Add tabseq macro.

This commit is contained in:
Calvin Rose 2022-06-28 22:51:41 -05:00
parent f456369941
commit 9bde57854a
4 changed files with 16 additions and 8 deletions

View File

@ -2,6 +2,8 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## 1.23.1 - ??? ## 1.23.1 - ???
- Improve default error message from `assert`.
- Add the `tabseq` macro for simpler table comprehensions.
- Allow setting `(dyn :task-id)` in fibers to improve context in supervisor messages. Prior to - Allow setting `(dyn :task-id)` in fibers to improve context in supervisor messages. Prior to
this change, supverisor messages over threaded channels would be from ambiguous threads/fibers. this change, supverisor messages over threaded channels would be from ambiguous threads/fibers.

View File

@ -158,7 +158,7 @@
(def ,v ,x) (def ,v ,x)
(if ,v (if ,v
,v ,v
(,error ,(if err err "assert failure"))))) (,error ,(if err err (string/format "assert failure in %j" x))))))
(defn errorf (defn errorf
"A combination of `error` and `string/format`. Equivalent to `(error (string/format fmt ;args))`." "A combination of `error` and `string/format`. Equivalent to `(error (string/format fmt ;args))`."
@ -606,13 +606,20 @@
See `loop` for details.`` See `loop` for details.``
[head & body] [head & body]
(def $accum (gensym)) (def $accum (gensym))
~(do (def ,$accum @[]) (loop ,head (array/push ,$accum (do ,;body))) ,$accum)) ~(do (def ,$accum @[]) (loop ,head (,array/push ,$accum (do ,;body))) ,$accum))
(defmacro tabseq
``Similar to `loop`, but accumulates key value pairs into a table.
See `loop` for details.``
[head key-body & value-body]
(def $accum (gensym))
~(do (def ,$accum @{}) (loop ,head (,put ,$accum ,key-body (do ,;value-body))) ,$accum))
(defmacro generate (defmacro generate
``Create a generator expression using the `loop` syntax. Returns a fiber ``Create a generator expression using the `loop` syntax. Returns a fiber
that yields all values inside the loop in order. See `loop` for details.`` that yields all values inside the loop in order. See `loop` for details.``
[head & body] [head & body]
~(fiber/new (fn [] (loop ,head (yield (do ,;body)))) :yi)) ~(,fiber/new (fn [] (loop ,head (yield (do ,;body)))) :yi))
(defmacro coro (defmacro coro
"A wrapper for making fibers that may yield multiple values (coroutine). Same as `(fiber/new (fn [] ;body) :yi)`." "A wrapper for making fibers that may yield multiple values (coroutine). Same as `(fiber/new (fn [] ;body) :yi)`."
@ -2768,13 +2775,13 @@
(def c ((:where p) 0)) (def c ((:where p) 0))
(def prpt (string "debug[" level "]:" c ":" status "> ")) (def prpt (string "debug[" level "]:" c ":" status "> "))
(getline prpt buf nextenv)) (getline prpt buf nextenv))
(print "entering debug[" level "] - (quit) to exit") (eprint "entering debug[" level "] - (quit) to exit")
(flush) (flush)
(run-context (run-context
{:chunks debugger-chunks {:chunks debugger-chunks
:on-status (debugger-on-status-var nextenv (+ 1 level) true) :on-status (debugger-on-status-var nextenv (+ 1 level) true)
:env nextenv}) :env nextenv})
(print "exiting debug[" level "]") (eprint "exiting debug[" level "]")
(flush) (flush)
(nextenv :resume-value)) (nextenv :resume-value))

View File

@ -762,8 +762,7 @@ static const char *scanformat(
memset(precision, '\0', 3); memset(precision, '\0', 3);
while (*p != '\0' && strchr(FMT_FLAGS, *p) != NULL) while (*p != '\0' && strchr(FMT_FLAGS, *p) != NULL)
p++; /* skip flags */ p++; /* skip flags */
if ((size_t)(p - strfrmt) >= sizeof(FMT_FLAGS) / sizeof(char)) if ((size_t)(p - strfrmt) >= sizeof(FMT_FLAGS)) janet_panic("invalid format (repeated flags)");
janet_panic("invalid format (repeated flags)");
if (isdigit((int)(*p))) if (isdigit((int)(*p)))
width[0] = *p++; /* skip width */ width[0] = *p++; /* skip width */
if (isdigit((int)(*p))) if (isdigit((int)(*p)))

View File

@ -530,7 +530,7 @@ JANET_CORE_FN(cfun_string_join,
JANET_CORE_FN(cfun_string_format, JANET_CORE_FN(cfun_string_format,
"(string/format format & values)", "(string/format format & values)",
"Similar to `snprintf`, but specialized for operating with Janet values. Returns " "Similar to C's `snprintf`, but specialized for operating with Janet values. Returns "
"a new string.") { "a new string.") {
janet_arity(argc, 1, -1); janet_arity(argc, 1, -1);
JanetBuffer *buffer = janet_buffer(0); JanetBuffer *buffer = janet_buffer(0);