Elixir 1.7

Sigils




elixir

Sigils

हम पहले ही जान चुके हैं कि एलिक्सिर दोहरे-उद्धृत स्ट्रिंग्स और एकल-उद्धृत चार सूचियां प्रदान करता है। हालाँकि, यह केवल उन संरचनाओं की सतह को कवर करता है जिनका भाषा में पाठीय प्रतिनिधित्व है। उदाहरण के लिए, :atom अधिकतर :atom प्रतिनिधित्व के माध्यम से बनाए जाते हैं।

एलिक्जिर का एक लक्ष्य विलुप्तता है: डेवलपर्स को किसी विशेष डोमेन को फिट करने के लिए भाषा का विस्तार करने में सक्षम होना चाहिए। कंप्यूटर विज्ञान इतना व्यापक क्षेत्र बन गया है कि भाषा के लिए कई क्षेत्रों को अपने मूल के हिस्से के रूप में बनाना असंभव है। इसके बजाय, हमारी सबसे अच्छी शर्त भाषा को व्यापक बनाना है, इसलिए डेवलपर्स, कंपनियां और समुदाय भाषा को अपने प्रासंगिक डोमेन तक बढ़ा सकते हैं।

इस अध्याय में, हम सिगिल्स का पता लगाने जा रहे हैं, जो कि पाठकीय निरूपण के साथ काम करने के लिए भाषा द्वारा प्रदान किए गए तंत्रों में से एक है। सिगिल्स की शुरुआत टिल्ड ( ~ ) वर्ण से होती है, जो एक अक्षर (जिसके बाद सर्जन की पहचान करता है) और फिर एक सीमांकक होता है; वैकल्पिक रूप से, संशोधक को अंतिम सीमांकक के बाद जोड़ा जा सकता है।

नियमित अभिव्यक्ति

एलिक्सिर में सबसे आम सर्जिल है ~r , जिसका उपयोग नियमित अभिव्यक्ति बनाने के लिए किया जाता है:

# A regular expression that matches strings which contain "foo" or "bar":
iex> regex = ~r/foo|bar/
~r/foo|bar/
iex> "foo" =~ regex
true
iex> "bat" =~ regex
false

PCRE लाइब्रेरी द्वारा कार्यान्वित एलिक्जिर पर्ल-संगत रेग्युलर एक्सप्रेशन (रेग्जेस) प्रदान करता है। रेग्जेस भी संशोधक का समर्थन करते हैं। उदाहरण के लिए, i संशोधक एक नियमित अभिव्यक्ति मामले को असंवेदनशील बनाता है:

iex> "HELLO" =~ ~r/hello/
false
iex> "HELLO" =~ ~r/hello/i
true

अन्य मॉडिफ़ायर्स के बारे में अधिक जानकारी के लिए Regex मॉड्यूल और नियमित एक्सप्रेशन के साथ समर्थित ऑपरेशन देखें।

अब तक, सभी उदाहरणों ने नियमित अभिव्यक्ति का प्रयोग किया है। हालांकि, सिगिल 8 अलग-अलग सीमांकक का समर्थन करते हैं:

~r/hello/
~r|hello|
~r"hello"
~r'hello'
~r(hello)
~r[hello]
~r{hello}
~r<hello>

अलग-अलग सीमांकक का समर्थन करने के पीछे का कारण भागे हुए परिसीमन के बिना शाब्दिक लिखने का एक तरीका प्रदान करना है। उदाहरण के लिए, आगे के स्लैश जैसे ~r(^https?://) साथ एक नियमित अभिव्यक्ति यकीनन ~r/^https?:\/\// । इसी तरह, यदि नियमित अभिव्यक्ति में स्लैश और कैप्चर करने वाले समूह हैं (जो उपयोग () ) करते हैं, तो आप कोष्ठक के बजाय दोहरे उद्धरण चुन सकते हैं।

स्ट्रिंग्स, चार सूचियाँ, और शब्द सूचियाँ लिपि

नियमित अभिव्यक्तियों के अलावा, अमृत तीन अन्य sigils के साथ जहाज है।

स्ट्रिंग्स

~s sIG का उपयोग स्ट्रिंग्स उत्पन्न करने के लिए किया जाता है, जैसे डबल कोट्स हैं। ~s sigil तब उपयोगी होता है जब एक स्ट्रिंग में दोहरे उद्धरण हों:

iex> ~s(this is a string with "double" quotes, not 'single' ones)
"this is a string with \"double\" quotes, not 'single' ones"

चार सूचियाँ

~c sIG चार उद्धरणों को शामिल करने के लिए उपयोगी है जिसमें एकल उद्धरण हैं:

iex> ~c(this is a char list containing 'single quotes')
'this is a char list containing \'single quotes\''

शब्द सूची

~w sigil का प्रयोग शब्दों की सूची उत्पन्न करने के लिए किया जाता है ( शब्द केवल नियमित तार होते हैं)। ~w sigil के अंदर, शब्दों को व्हाट्सएप द्वारा अलग किया जाता है।

iex> ~w(foo bar bat)
["foo", "bar", "bat"]

~w sigil भी c , s और a संशोधक (चार सूचियों, तार और परमाणुओं के लिए क्रमशः) को स्वीकार करता है, जो परिणामी सूची के तत्वों के डेटा प्रकार को निर्दिष्ट करता है:

iex> ~w(foo bar bat)a
[:foo, :bar, :bat]

प्रक्षेप और सिगिल में बचना

लोअरकेस सिगिल्स के अलावा, एलिक्सिर बचने के पात्रों और प्रक्षेप से निपटने के लिए अपरकेस सिगल्स का समर्थन करता है। हालांकि, दोनों ~s और ~S तार वापस आ जाएंगे, जबकि पूर्व भागने के कोड और प्रक्षेप की अनुमति देता है जबकि बाद वाला नहीं:

iex> ~s(String with escape codes \x26 #{"inter" <> "polation"})
"String with escape codes & interpolation"
iex> ~S(String without escape codes \x26 without #{interpolation})
"String without escape codes \\x26 without \#{interpolation}"

निम्नलिखित एस्केप कोड का उपयोग स्ट्रिंग्स और चार सूचियों में किया जा सकता है:

  • \\ - एकल बैकस्लैश
  • \a - घंटी / अलर्ट
  • \b - बैकस्पेस
  • \d - हटाएं
  • \e - बच
  • \f - फ़ॉर्म फ़ीड
  • \n - न्यूलाइन
  • \r - गाड़ी वापसी
  • \s - अंतरिक्ष
  • \t - टैब
  • \v - ऊर्ध्वाधर टैब
  • \0 - अशक्त बाइट
  • \xDD - हेक्साडेसिमल में एक बाइट का प्रतिनिधित्व करता है (जैसे कि \x13 )
  • \uDDDD और \u{D...} - हेक्साडेसिमल (जैसे \u{1F600} ) में एक यूनिकोड \uDDDD का प्रतिनिधित्व करता है

उन लोगों के अलावा, एक दोहरे उद्धरण वाले स्ट्रिंग के अंदर एक दोहरे उद्धरण को \" रूप में भाग जाने की आवश्यकता है, और, अनुरूप, एकल-उद्धृत चार सूची के अंदर एक एकल उद्धरण को \' रूप में भाग जाने की आवश्यकता है। फिर भी, यह बेहतर है। के रूप में ऊपर से बचने के लिए सीमांकक को बदलने के लिए।

सिगिल्स वंशानुगत का भी समर्थन करते हैं, यानी ट्रिपल डबल- या एकल-उद्धरण विभाजक के रूप में:

iex> ~s"""
...> this is
...> a heredoc string
...> """

हेरेडोक सिगिल के लिए सबसे आम उपयोग का मामला है जब प्रलेखन लिखना। उदाहरण के लिए, दस्तावेज़ में भागने के पात्रों को लिखना जल्द ही त्रुटि हो जाएगा क्योंकि कुछ पात्रों को डबल-भागने की आवश्यकता होती है:

@doc """
Converts double-quotes to single-quotes.

## Examples

    iex> convert("\\\"foo\\\"")
    "'foo'"

"""
def convert(...)

~S का उपयोग करके, इस समस्या से पूरी तरह बचा जा सकता है:

@doc ~S"""
Converts double-quotes to single-quotes.

## Examples

    iex> convert("\"foo\"")
    "'foo'"

"""
def convert(...)

कस्टम सिगिल

जैसा कि इस अध्याय की शुरुआत में संकेत दिया गया है, अमृत में सिगिल्स एक्स्टेंसिबल हैं। वास्तव में, sigil ~r/foo/i का sigil_r करना द्विआधारी और char सूची के साथ sigil_r को कॉल करने के बराबर है:

iex> sigil_r(<<"foo">>, 'i')
~r"foo"i

हम ~r sigil के लिए प्रलेखन को sigil_r माध्यम से एक्सेस कर सकते हैं:

iex> h sigil_r
...

हम अपने कार्यों को लागू करके अपने स्वयं के सिगिल भी प्रदान कर सकते हैं जो sigil_{identifier} पैटर्न का पालन करते हैं। उदाहरण के लिए, आइए ~i sigil को लागू करें जो पूर्णांक देता है (इसे नकारात्मक बनाने के लिए वैकल्पिक n संशोधक के साथ):

iex> defmodule MySigils do
...>   def sigil_i(string, []), do: String.to_integer(string)
...>   def sigil_i(string, [?n]), do: -String.to_integer(string)
...> end
iex> import MySigils
iex> ~i(13)
13
iex> ~i(42)n
-42

मैग्रोस की मदद से सिगिल-टाइम काम करने के लिए सिगिल का भी इस्तेमाल किया जा सकता है। उदाहरण के लिए, एलिक्सिर में नियमित अभिव्यक्ति स्रोत कोड के संकलन के दौरान एक कुशल प्रतिनिधित्व में संकलित की जाती है, इसलिए रनटाइम पर इस कदम को छोड़ दिया जाता है। यदि आप विषय में रुचि रखते हैं, तो हम आपको मैक्रोज़ के बारे में और जानने की सलाह देते हैं और यह जाँचते हैं कि Kernel मॉड्यूल में sigil_* कैसे लागू किए जाते हैं (जहाँ sigil_* फ़ंक्शन परिभाषित हैं)।