@sprintf is a macro, not a function. It doesn't evaluate its inputs: it just 
rewrites the inputs into something else (usually less readable) that carries 
out the actual computation. You can see what it does using the macroexpand 
function:

julia> macroexpand(quote @sprintf("%8.1e", 3.1415) end)
:(begin  # none, line 1:
        Base.Printf.sprint(#63#io->begin  # printf.jl, line 783:
                    begin 
                        #59#out = #63#io
                        #60###x#3463 = 3.1415
                        local #61#neg, #57#pt, #58#len, #62#exp
                        if Base.Printf.isfinite(#60###x#3463)
                            Base.Printf.ini_dec(#60###x#3463,2)
                            #61#neg = Base.Printf.NEG[1]
                            #62#exp = Base.Printf.-(Base.Printf.POINT[1],1)
                            
(Base.Printf.-(Base.Printf.-(1,Base.Printf.|((#62#exp Base.Printf.<= -100),(100 
Base.Printf.<= #62#exp))),#61#neg) Base.Printf.> 0) && 
Base.Printf.write(#59#out,' ')
                            #61#neg && Base.Printf.write(#59#out,'-')
                            Base.Printf.write(#59#out,Base.Printf.DIGITS[1])
                            Base.Printf.write(#59#out,'.')
                            
Base.Printf.write(#59#out,Base.Printf.+(Base.Printf.pointer(Base.Printf.DIGITS),1),1)
                            Base.Printf.write(#59#out,'e')
                            Base.Printf.print_exp(#59#out,#62#exp)
                        else 
                            Base.Printf.write(#59#out,begin  # printf.jl, line 
141:
                                    if Base.Printf.isnan(#60###x#3463)
                                        "     NaN"
                                    else 
                                        if (#60###x#3463 Base.Printf.< 0)
                                            "    -Inf"
                                        else 
                                            "     Inf"
                                        end
                                    end
                                end)
                        end
                        Base.Printf.nothing
                    end
                end)
    end)

 -- John

On Apr 11, 2014, at 11:46 PM, Dominique Orban <[email protected]> wrote:

> As a follow-up question, why is the following not allowed?
> 
> julia> fmt = "%8.1e";
> 
> julia> @sprintf(fmt, 3.1415)
> ERROR: first or second argument must be a format string
> 
> I don't see how it's different from
> 
> julia> @sprintf("%8.1e", 3.1415)
> 
> What's the appropriate syntax?
> 
> Thanks.
> 
> 
> On Friday, April 11, 2014 11:24:50 PM UTC-7, Dominique Orban wrote:
> Thank you! Such a basic operation could feature a bit more prominently in the 
> documentation.
> 
> 
> On Friday, April 11, 2014 11:21:28 PM UTC-7, John Myles White wrote:
> @sprintf
> 
> On Apr 11, 2014, at 11:18 PM, Dominique Orban <[email protected]> wrote:
> 
>> Sorry if this is a RTFM, but I can't find the answer in the documentation or 
>> on the web. I may have missed it. I come from Python where I can build 
>> strings with formatted data using a syntax like
>> 
>> s = "pi=%7.1e" % acos(-1)
>> 
>> How do I accomplish that in Julia? @printf doesn't do the job because it 
>> doesn't return anything:
>> 
>> julia> s = @printf("%7.1e", 3.14)
>> 3.1e+00
>> julia> s
>> 
>> 
>> 
>> 
>> Thanks.
>> 
> 

Reply via email to