# Is this @sprintf (annoying) behaviour intended?

**URL:** <https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483>\
**Category:** General Usage\
**Created:** [September 20, 2021, 4:52pm UTC](https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483 "2021-09-20T16:52:51Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [September 20, 2021, 4:52pm UTC](https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483/1 "2021-09-20T16:52:51Z")

</div>

The crux is that I want to build a string programmatically with a variable number of elements and can’t find a way to do it with `@sprintf`

```julia
julia> bnds = [1,2,3];
julia> @sprintf("%d,%d,%d,",bnds...)
"1,2,3,"

julia> repeat("%d,",3)
"%d,%d,%d,"

julia> @sprintf(repeat("%d,",3),bnds...)
ERROR: LoadError: MethodError: no method matching Printf.Format(::Expr)
Closest candidates are:
  Printf.Format(::S, ::Vector{UnitRange{Int64}}, ::T) where {S, T} at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.7\Printf\src\Printf.jl:65
  Printf.Format(::AbstractString) at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.7\Printf\src\Printf.jl:81
Stacktrace:
 [1] var"@sprintf"( __source__ ::LineNumberNode, __module__ ::Module, fmt::Any, args::Vararg{Any})
   @ Printf C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.7\Printf\src\Printf.jl:895
in expression starting at REPL[29]:1
```

---

<div class="post-metadata">

**Author:** ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)\
**Post date:** [September 20, 2021, 4:55pm UTC](https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483/2 "2021-09-20T16:55:32Z")

</div>

Yes. Because `@sprintf` is a macro, it can only act on the string literal it’s given. It can’t generate code for `repeat(...)` since the stuff `repeat` does is handled at run-time, not parse-time. You can use a `for` loop to do something similar, right? or `map` and `join`?

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [September 20, 2021, 5:11pm UTC](https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483/3 "2021-09-20T17:11:09Z")

</div>

But if I compute

```julia
fmt = repeat("%d,",3)
"%d,%d,%d,"

```

and pass the `fmt`, which is a string, the error is the same.

Yes, I can create my final sting some other way but it looks clumsy.

---

<div class="post-metadata">

**Author:** ![lmiq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lmiq/32/18314_2.png) [@lmiq](https://discourse.julialang.org/u/lmiq)\
**Post date:** [September 20, 2021, 5:14pm UTC](https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483/4 "2021-09-20T17:14:30Z")

</div>

This thread discusses many alternatives for that: [How to repeat the format in @printf? - #2 by heliosdrm](https://discourse.julialang.org/t/how-to-repeat-the-format-in-printf/66695/2)

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [September 20, 2021, 5:30pm UTC](https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483/5 "2021-09-20T17:30:00Z")

</div>

Thanks.

---

<div class="post-metadata">

**Author:** ![alan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alan/32/15970_2.png) [@alan](https://discourse.julialang.org/u/alan)\
**Post date:** [December 30, 2021, 9:18pm UTC](https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483/6 "2021-12-30T21:18:10Z")

</div>

This problem is more general than this thread suggests. It is not limited to repeated format items. Surely this is a bug:

julia\> using Printf

julia\> @sprintf(“aaa %d bbb”, 3)  
“aaa 3 bbb”

julia\> fmt = “aaa %d bbb”  
“aaa %d bbb”

julia\> @sprintf(fmt, 3)  
ERROR: LoadError: MethodError: no method matching Printf.Format(::Symbol)  
Closest candidates are:  
Printf.Format(::S, ::Vector{UnitRange{Int64}}, ::T) where {S, T} at /Applications/Julia-1.7.app/Contents/Resources/julia/share/julia/stdlib/v1.7/Printf/src/Printf.jl:65  
Printf.Format(::AbstractString) at /Applications/Julia-1.7.app/Contents/Resources/julia/share/julia/stdlib/v1.7/Printf/src/Printf.jl:81  
Stacktrace:  
[1] var"@sprintf"( **source** ::LineNumberNode, **module** ::Module, fmt::Any, args::Vararg{Any})  
@ Printf /Applications/Julia-1.7.app/Contents/Resources/julia/share/julia/stdlib/v1.7/Printf/src/Printf.jl:900  
in expression starting at REPL[18]:1

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [December 30, 2021, 9:26pm UTC](https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483/7 "2021-12-30T21:26:08Z")

</div>

> [@alan](#):
>
> Surely this is a bug

No, that’s how macros work: they replace expressions into other expressions. The `@sprintf` macro expects as first argument a literal string, not a variable whose runtime value is a string: macros can’t possibly access runtime values of variables (unless you use tricks like `@eval @sprintf($fmt, 3)` which gets the job done but defeats the purpose of using a macro in the first place).

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [December 30, 2021, 9:28pm UTC](https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483/8 "2021-12-30T21:28:18Z")

</div>

what you want:

```julia
julia> fmt = "aaa %d bbb"
"aaa %d bbb"

julia> Printf.format(Printf.Format(fmt), 3)
"aaa 3 bbb"

```

---

<div class="post-metadata">

**Author:** ![alan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alan/32/15970_2.png) [@alan](https://discourse.julialang.org/u/alan)\
**Post date:** [December 30, 2021, 10:02pm UTC](https://discourse.julialang.org/t/is-this-sprintf-annoying-behaviour-intended/68483/9 "2021-12-30T22:02:12Z")

</div>

Thank you.

I’m surprised no one has put that into a function called “sprintf”. It would be more useful than the macro.
