From 4e263b8c392ff1fb18d88767aed19dc926bc576e Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Fri, 12 Nov 2021 17:33:58 +0900 Subject: [PATCH] Support using functions with :out dynamic binding --- src/core/io.c | 13 +++++++++++++ test/suite0007.janet | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/core/io.c b/src/core/io.c index 0295b115..41dc116c 100644 --- a/src/core/io.c +++ b/src/core/io.c @@ -483,6 +483,19 @@ static Janet cfun_io_print_impl_x(int32_t argc, Janet *argv, int newline, janet_buffer_push_u8(buf, '\n'); return janet_wrap_nil(); } + case JANET_FUNCTION: { + /* Special case function */ + JanetFunction *fun = janet_unwrap_function(x); + JanetBuffer *buf = janet_buffer(0); + for (int32_t i = offset; i < argc; ++i) { + janet_to_string_b(buf, argv[i]); + } + if (newline) + janet_buffer_push_u8(buf, '\n'); + Janet args[1] = { janet_wrap_buffer(buf) }; + janet_call(fun, 1, args); + return janet_wrap_nil(); + } case JANET_NIL: f = dflt_file; if (f == NULL) janet_panic("cannot print to nil"); diff --git a/test/suite0007.janet b/test/suite0007.janet index aedc8b8f..ab6482cb 100644 --- a/test/suite0007.janet +++ b/test/suite0007.janet @@ -168,6 +168,16 @@ (assert (= (string out-buf) "Hello\nhi") "print and prin to buffer 1") (assert (= (string err-buf) "Sup\nnot much.") "eprint and eprin to buffer 1") +# Printing to functions +(def out-buf @"") +(defn prepend [x] + (with-dyns [:out out-buf] + (prin "> " x))) +(with-dyns [:out prepend] + (print "Hello world")) + +(assert (= (string out-buf) "> Hello world\n") "print to buffer via function") + (assert (= (string '()) (string [])) "empty bracket tuple literal") # with-vars