Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a non-standard string literal with parameters in Julia?

Tags:

julia

I am creating a non-standard string literal with a macro with something like that:

macro R13_str(p)
    rotate(13, p)
end

and it works. I can call it as:

R13"abc"

But I would like to declare the macro to work with any integer, like:

R1"abc"

or

R244"abc"

Let's say the function rotate() is:

function rotate(shift_amount::Int64, s::String)

    # Ensure the shift is no bigger than the string
    shift = shift_amount ≤ length(s) ? shift_amount : shift_amount % length(s)

    # Circular shift
    return s[end-shift+1:end] * s[1:end-shift]
end

How can I do that? I have checked all the docs, but it's not clear to me.

like image 668
Flavio Barros Avatar asked Oct 21 '25 13:10

Flavio Barros


2 Answers

Can't see how to achieve exactly what is required. But the following might be good enough:

julia> macro R_str(p,flag)
           rotate(flag, p)
       end
@R_str (macro with 1 method)

julia> R"hello"3
"llohe"

julia> R"abc"1
"cab"

julia> R"abc"244
"cab"

See https://docs.julialang.org/en/v1/manual/metaprogramming/#meta-non-standard-string-literals

Trying to conform to OP call format:

julia> macro rework(expr)
       if expr.head != :macrocall return expr ; end
       r = String(expr.args[1])
       rr = parse(Int, r[3:findfirst('_',r)-1])
       :(rotate($rr, $(expr.args[3])))
       end
@rework (macro with 1 method)

julia> @rework R13"hello"
"llohe"

This macro could help to read the prepared test cases??

like image 131
Dan Getz Avatar answered Oct 25 '25 06:10

Dan Getz


I have found a solution:

for n in 0:244
    @eval macro $(Symbol(:R, n, :_str))(s)
        rotate($n, s)
    end 
end

While I believe that using flags is the better approach, with this for loop I can generate all the macros that I need.

Julia> R1"abc" 
Julia> R24"acb" 
Julia> R56"abc"

simply work.

like image 38
Flavio Barros Avatar answered Oct 25 '25 05:10

Flavio Barros



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!