수색…


통사론

  • 매크로 "문자열"# 짧은 문자열 매크로 폼
  • @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 근사값이며 BigFloatBigFloat 하면 Float64 의 근사 오차가 유지됩니다. 매크로를 사용하면 0.1BigFloat 직접 파싱하여 근사 오차를 줄입니다.

julia> big(0.1)
1.000000000000000055511151231257827021181583404541015625000000000000000000000000e-01

julia> big"0.1"
1.000000000000000000000000000000000000000000000000000000000000000000000000000002e-01

@doc_str

이 문자열 매크로는 Base.Markdown.MD 객체를 생성하며 내부 문서 시스템에서 모든 환경에 대한 서식있는 텍스트 문서를 제공하는 데 사용됩니다. 이러한 MD 개체는 터미널에서 잘 렌더링됩니다.

터미널 마크 다운 문서가 잘 표현됩니다.

또한 브라우저에서 :

브라우저 마크 다운 문서가 잘 렌더링됩니다.

@html_str

이 문자열 매크로는 브라우저에서 멋지게 렌더링되는 HTML 문자열 리터럴을 구성합니다.

브라우저에서 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 표현식이며 매크로 용도로 검사하고 분해 할 수 있습니다.

명령 매크로

0.6.0-dev

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")

그러나 여러 표현식을 처리하도록 확장하는 것은 어렵지 않습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow