You can do this with a functional form:

function with_output_to_string(f)
  f(IOBuffer())
end

with_output_to_string() do io
  println(io, "testing")
  @printf(io, "pi is %.5f", Float64(pi))
end

see also: https://github.com/JuliaLang/julia/issues/7022

On Sun, May 3, 2015 at 6:18 AM Tamas Papp <[email protected]> wrote:

> Hi,
>
> I am trying to write something analogous to
> COMMON-LISP:WITH-OUTPUT-TO-STRING, what I have so far is
>
> macro with_output_to_string(stream, expr)
>   quote
>     let $(esc(stream)) = IOBuffer()
>       $expr
>       takebuf_string($(esc(stream)))
>     end
>   end
> end
>
> Works fine:
>
> @with_output_to_string io begin
>   println(io, "testing")
>   @printf(io, "pi is %.5f", Float64(pi))
> end
>
> but I have a couple of questions:
>
> 1. Is there a way I can get rid of the `begin`? Julia syntax for
> built-ins that have implicit blocks (`for`, `function`) has no `begin`,
> is it possible to write a macro in a similar style? Ie is there
> something analogous to COMMON-LISP:&BODY in Julia? (in effect, not in
> syntax, I know about varargs, but they don't look right here).
>
> 2. I thought that if I make the first argument STDOUT, I can get rid of
> the stream name in the body, but it doesn't work (still prints to
> console). What is the right way?
>
> 3. In Common Lisp, it is common for the first argument to be an
> s-expression that is then destructured. Is that idiomatic in Julia? Can
> you point me to some examples?
>
> Best,
>
> Tamas
>

Reply via email to