Julia Language
स्ट्रिंग मैक्रोज़
खोज…
वाक्य - विन्यास
- मैक्रो "स्ट्रिंग" # शॉर्ट, स्ट्रिंग मैक्रो फॉर्म
- @ macro_str "स्ट्रिंग" # लंबी, नियमित मैक्रो फॉर्म
- macro`command`
टिप्पणियों
स्ट्रिंग मैक्रोज़ सादे पुराने तार के समान शक्तिशाली नहीं हैं - क्योंकि प्रक्षेप को मैक्रो के तर्क में लागू किया जाना चाहिए, स्ट्रिंग मैक्रो इंटरपोलेशन के लिए एक ही सीमांकक के स्ट्रिंग शाब्दिक को शामिल करने में असमर्थ हैं।
उदाहरण के लिए, हालांकि
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
मैक्रो रिटर्न जो भी अभिव्यक्ति के साथ प्रतिस्थापित किया जाता है। बेस जूलिया कई स्ट्रिंग मैक्रोज़ के साथ आता है, जैसे:
@b_str
इस स्ट्रिंग मैक्रो निर्माणों बाइट सरणियों के बजाय तार । स्ट्रिंग की सामग्री, यूटीएफ -8 के रूप में एन्कोडेड, बाइट्स के सरणी के रूप में उपयोग की जाएगी। यह निम्न-स्तरीय एपीआई के साथ इंटरफेस करने के लिए उपयोगी हो सकता है, जिनमें से कई स्ट्रिंग्स के बजाय बाइट सरणियों के साथ काम करते हैं।
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
सच 0.1
( 1//10
) का एक Float64
सन्निकटन है, और BigFloat
को बढ़ावा देने से BigFloat
की सन्निकटन त्रुटि Float64
। मैक्रो का उपयोग करना BigFloat
को सीधे 0.1
पार्स करेगा, सन्निकटन त्रुटि को कम करेगा।
julia> big(0.1)
1.000000000000000055511151231257827021181583404541015625000000000000000000000000e-01
julia> big"0.1"
1.000000000000000000000000000000000000000000000000000000000000000000000000000002e-01
@doc_str
यह स्ट्रिंग मैक्रो Base.Markdown.MD
ऑब्जेक्ट का निर्माण Base.Markdown.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
भावना के समान है, लेकिन इसमें कोई फैंसी स्वरूपण विशेषताएं नहीं हैं:
@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\") "
रूप में बच जाना चाहिए। इस सीमा के बारे में अधिक जानकारी के लिए टिप्पणी अनुभाग देखें।
मैन्युअल रूप से प्रक्षेप को लागू करने के लिए दो दृष्टिकोण हैं: मैन्युअल रूप से पार्सिंग लागू करें, या जूलिया को पार्स करने के लिए प्राप्त करें। पहला दृष्टिकोण अधिक लचीला है, लेकिन दूसरा दृष्टिकोण आसान है।
मैनुअल पार्सिंग
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
$
संकेतों से बच नहीं जाता है) और इसे जूलिया के पार्सर को पार्स करने के लिए वापस भेज देता है। स्ट्रिंग को बचाना यह सुनिश्चित करने के लिए आवश्यक है कि "
और \
_ स्ट्रिंग की पार्सिंग को प्रभावित न करें। परिणामी अभिव्यक्ति एक :string
अभिव्यक्ति है, जिसे मैक्रो उद्देश्यों के लिए जांच और विघटित किया जा सकता है।
कमान मैक्रों
जूलिया v0.6 में और बाद में, नियमित स्ट्रिंग मैक्रोज़ के अलावा कमांड मैक्रोज़ का समर्थन किया जाता है। एक कमांड मैक्रो इनवोकेशन की तरह
mymacro`xyz`
मैक्रो कॉल के रूप में पार्स किया जाता है
@mymacro_cmd "xyz"
ध्यान दें कि यह स्ट्रिंग मैक्रोज़ के समान है, सिवाय _cmd
बजाय _str
।
हम आम तौर पर कोड के लिए कमांड मैक्रोज़ का उपयोग करते हैं, जिसमें कई भाषाओं में अक्सर "
होता है "
लेकिन शायद ही कभी `
शामिल होते हैं। उदाहरण के लिए, कमांड मैक्रोज़ का उपयोग करते हुए क्वासिकोटिंग के एक सरल संस्करण को फिर से लागू करना काफी सरल है:
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")
हालांकि, कई भावों को संभालने के लिए इसका विस्तार करना मुश्किल नहीं है।