Julia Language                
            문자열 매크로
        
        
            
    수색…
통사론
- 매크로 "문자열"# 짧은 문자열 매크로 폼
- @macro_str "string"# 긴 매크로 매크로 형식
- 매크로`명령`
비고
문자열 매크로는 일반 오래된 문자열처럼 강력하지 않습니다. 보간은 매크로의 논리에서 구현되어야하기 때문에 문자열 매크로는 보간을위한 동일한 구분 기호의 문자열 리터럴을 포함 할 수 없습니다.
예를 들어,
julia> "$("x")"
"x"
작품, 문자열 매크로 텍스트 양식
julia> doc"$("x")"
ERROR: KeyError: key :x not found
잘못 구문 분석됩니다. 이것은 외부 따옴표 구분 기호로 삼중 따옴표를 사용하여 다소 완화 할 수 있습니다.
julia> doc"""$("x")"""
"x"
실제로 제대로 작동합니다.
문자열 매크로 사용
문자열 매크로는 특정 매크로 호출에 대한 구문 설탕입니다. 파서는 다음과 같은 구문을 확장합니다.
mymacro"my string"
으로
@mymacro_str "my string"
 다른 매크로 호출과 마찬가지로 @mymacro_str 매크로가 반환하는 표현식으로 대체됩니다. Base Julia에는 다음과 같은 여러 문자열 매크로가 있습니다. 
 @b_str 
 이 문자열 매크로는 문자열 대신 바이트 배열을 구성합니다. UTF-8로 인코딩 된 문자열의 내용은 바이트 배열로 사용됩니다. 이것은 로우 레벨 API와의 인터페이싱에 유용 할 수 있습니다. 로우 레벨 API의 대부분은 문자열 대신 바이트 배열로 작동합니다.
julia> b"Hello World!"
12-element Array{UInt8,1}:
 0x48
 0x65
 0x6c
 0x6c
 0x6f
 0x20
 0x57
 0x6f
 0x72
 0x6c
 0x64
 0x21
 @big_str 
  이 매크로는 주어진 문자열에서 파싱 된 BigInt 또는 BigFloat 반환합니다. 
julia> big"1"
1
julia> big"1.0"
1.000000000000000000000000000000000000000000000000000000000000000000000000000000
 이 매크로는 big(0.1) 이 처음 예상했던대로 동작하지 않기 때문에 존재합니다. 0.1 은 True 0.1 ( 1//10 )의 Float64 근사값이며 BigFloat 로 BigFloat 하면 Float64 의 근사 오차가 유지됩니다. 매크로를 사용하면 0.1 을 BigFloat 직접 파싱하여 근사 오차를 줄입니다. 
julia> big(0.1)
1.000000000000000055511151231257827021181583404541015625000000000000000000000000e-01
julia> big"0.1"
1.000000000000000000000000000000000000000000000000000000000000000000000000000002e-01
 @doc_str 
  이 문자열 매크로는 Base.Markdown.MD 객체를 생성하며 내부 문서 시스템에서 모든 환경에 대한 서식있는 텍스트 문서를 제공하는 데 사용됩니다. 이러한 MD 개체는 터미널에서 잘 렌더링됩니다. 
또한 브라우저에서 :
 @html_str 
 이 문자열 매크로는 브라우저에서 멋지게 렌더링되는 HTML 문자열 리터럴을 구성합니다.
 @ip_str 
 이 문자열 매크로는 IP 주소 리터럴을 구성합니다. 그것은 IPv4와 IPv6 모두에서 작동합니다 :
julia> ip"127.0.0.1"
ip"127.0.0.1"
julia> ip"::"
ip"::"
 @r_str 
  이 문자열 매크로는 Regex 리터럴을 구성합니다. 
 @s_str 
  이 문자열 매크로는 SubstitutionString 리터럴을 구성합니다.이 리터럴은 Regex 리터럴과 함께 작동하여 고급 텍스트 대체를 허용합니다. 
 @text_str 
  이 문자열 매크로는 @doc_str 및 @html_str 과 비슷한 정신을 @doc_str 있지만 멋진 서식 지정 기능은 없습니다. 
 @v_str 
  이 문자열 매크로는 VersionNumber 리터럴을 구성합니다. 버전 및 사용 방법에 대한 설명은 버전 번호 를 참조하십시오. 
 @MIME_str 
  이 문자열 매크로는 싱글 톤 유형의 MIME 유형을 구성합니다. 예를 들어 MIME"text/plain" 은 MIME("text/plain") 유형 MIME("text/plain") 입니다. 
법적 식별자가 아닌 기호
줄리아 심볼 리터럴은 합법적 인 식별자 여야합니다. 작동 방식 :
julia> :cat
:cat
하지만 그렇지 않습니다.
julia> :2cat
ERROR: MethodError: no method matching *(::Int64, ::Base.#cat)
Closest candidates are:
  *(::Any, ::Any, ::Any, ::Any...) at operators.jl:288
  *{T<:Union{Int128,Int16,Int32,Int64,Int8,UInt128,UInt16,UInt32,UInt64,UInt8}}(::T<:Union{Int128,Int16,Int32,Int64,Int8,UInt128,UInt16,UInt32,UInt64,UInt8}, ::T<:Union{Int128,Int16,Int32,Int64,Int8,UInt128,UInt16,UInt32,UInt64,UInt8}) at int.jl:33
  *(::Real, ::Complex{Bool}) at complex.jl:180
  ...
 여기에 기호 리터럴과 비슷한 것은 사실 암시 적으로 :2 (단지 2 )와 cat 이라는 함수를 암시 적으로 곱하여 파싱됩니다. 분명히 작동하지 않습니다. 
우리는 사용할 수 있습니다.
julia> Symbol("2cat")
Symbol("2cat")
문제를 해결할 수 있습니다.
 문자열 매크로는 이것을 더 간결하게 만들 수 있습니다. @sym_str 매크로를 정의한다면 : 
macro sym_str(str)
    Meta.quot(Symbol(str))
end
그러면 우리는 간단히 할 수 있습니다.
julia> sym"2cat"
Symbol("2cat")
유효한 줄리아 식별자가 아닌 기호를 만들 수 있습니다.
물론 이러한 기술 은 유효한 줄리아 식별자 인 기호를 만들 수도 있습니다. 예를 들어,
julia> sym"test"
:test
문자열 매크로에서 보간 구현하기
 문자열 매크로에는 내장 된 보간 기능이 없습니다. 그러나이 기능을 수동으로 구현할 수도 있습니다. 주변 문자열 매크로와 같은 구분 기호를 갖는 이스케이프 문자열 리터럴 없이는 포함시킬 수 없습니다. 즉, """ $("x") """ 가능하지만 " $("x") " 는 불가능합니다. 대신 " $(\"x\") " 로 이스케이프해야합니다. 이 제한 사항에 대한 자세한 내용은 설명 섹션을 참조하십시오. 
보간법을 수동으로 구현하는 데는 두 가지 방법이 있습니다. 수동으로 파싱을 구현하거나 Julia가 파싱을 수행하게하십시오. 첫 번째 방법은 더 유연하지만 두 번째 방법은 더 쉽습니다.
수동 구문 분석
macro interp_str(s)
    components = []
    buf = IOBuffer(s)
    while !eof(buf)
        push!(components, rstrip(readuntil(buf, '$'), '$'))
        if !eof(buf)
            push!(components, parse(buf; greedy=false))
        end
    end
    quote
        string($(map(esc, components)...))
    end
end
줄리아 파싱
macro e_str(s)
    esc(parse("\"$(escape_string(s))\""))
end
 이 메서드는 문자열을 이스케이프하지만 ( escape_string 은 $ 기호를 이스케이프하지 않음) escape_string 시키기 위해 Julia의 파서로 다시 전달합니다. 문자열을 이스케이프 처리하면 " 및 \ 는 문자열의 구문 분석에 영향을 미치지 않습니다. 결과 표현식은 :string 표현식이며 매크로 용도로 검사하고 분해 할 수 있습니다. 
명령 매크로
Julia v0.6 이상에서는 일반 문자열 매크로 외에도 명령 매크로가 지원됩니다. 명령 매크로 호출
mymacro`xyz`
매크로 호출로 구문 분석됩니다.
@mymacro_cmd "xyz"
 이것은 _str 대신 _cmd 를 제외하고는 문자열 매크로와 비슷합니다. 
 우리는 일반적으로 많은 언어에서 자주 포함하지 않는 코드에 대한 명령 매크로 사용 " 하지만 거의 포함을 ` .의 간단한 버전을 다시 구현할 예를 들어, 그것은 매우 간단 quasiquoting 명령 매크로를 사용하여 : 
macro julia_cmd(s)
    esc(Meta.quot(parse(s)))
end
이 매크로는 인라인으로 사용할 수 있습니다.
julia> julia`1+1`
:(1 + 1)
julia> julia`hypot2(x,y)=x^2+y^2`
:(hypot2(x,y) = begin  # none, line 1:
            x ^ 2 + y ^ 2
        end)
또는 여러 줄 :
julia> julia```
       function hello()
           println("Hello, World!")
       end
       ```
:(function hello() # none, line 2:
        println("Hello, World!")
    end)
 $ 사용한 보간이 지원됩니다. 
julia> x = 2
2
julia> julia`1 + $x`
:(1 + 2)
그러나 여기에 주어진 버전은 하나의 표현식 만 허용합니다.
julia> julia```
       x = 2
       y = 3
       ```
ERROR: ParseError("extra token after end of expression")
그러나 여러 표현식을 처리하도록 확장하는 것은 어렵지 않습니다.



