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")
그러나 여러 표현식을 처리하도록 확장하는 것은 어렵지 않습니다.