क्यों यौगिक अभिव्यक्तियाँ?


10

यह एक किताब है जो मैं पढ़ रहा हूँ, इसका एक उदाहरण है:

volume = begin
    len = 10
    breadth = 20
    height = 30
    len * breadth * height
end

मुझे यौगिक अभिव्यक्तियों की आवश्यकता क्यों है ?? मैं सिर्फ एक समारोह volume = 10 * 20 * 30या volume = len * breadth * heightउसके लिए एक फ़ंक्शन लिख या लिख सकता था ...

मैं का उपयोग क्यों करते हैं beginऔर end? या शायद बेहतर सवाल: जब मैं उनका उपयोग करता हूं, जैसा कि मुझे लगता है कि पुस्तक से ऊपर का उदाहरण शायद बहुत अच्छा नहीं है।


1
वह कौन सी किताब है? जैसा कि आप भी नहीं उदाहरण के लिए विशेष रूप से अच्छा नहीं है
माइकल के। बोरेगार्ड

"लर्निंग जूलिया", जैसा कि यहां उपलब्ध है: epdf.pub/learning-julia.html (पृष्ठ 127)
जॉर्जी

जवाबों:


4

मुझे लगता है कि ऐसी कई परिस्थितियाँ हैं जिनमें begin ... endब्लॉक काम कर रहे हैं, लेकिन जैसा कि आपने उल्लेख किया है कि आप अक्सर अन्य निर्माणों, जैसे कार्यों, आदि के साथ भी समान प्रभाव प्राप्त कर सकते हैं।

किस begin ... endब्लॉक का उपयोग किया जा सकता है?

  • बस चर और उनके नाम "हो" के लिए: len, breadth, और heightकेवल ब्लॉक के भीतर उपलब्ध नहीं होगा और आसपास के नामस्थान को दूषित नहीं।
  • मैक्रोज़ को कोड के एक ब्लॉक पर लागू करने के लिए बल्कि व्यक्तिगत कथन। उदाहरण के लिए @inbounds begin <all my code without bounds checking goes here> endया @time begin ... endकोड के एक टुकड़े के चारों ओर लपेटना ।
  • आसपास के वैश्विक दायरे में स्थानीय गुंजाइश बनाने के लिए ( उदाहरण के लिए वैश्विक गुंजाइश भ्रम से बचने के लिए)। (ध्यान दें कि के रूप में टिप्पणी में बताया गया है begin ... endकरता नहीं एक स्थानीय गुंजाइश परिचय है, लेकिन तर्क समान के लिए रखती है let ... endब्लॉक।)

विशेष रूप से दूसरा बिंदु वह है जो मैं अपने कोड में उनके लिए उपयोग करता हूं।


मैं भी अपने आप को आश्वस्त करने के लिए किया था, लेकिन beginब्लॉक करना नहीं गुंजाइश परिचय । दूसरी ओर, वे कथनों के एक क्रम को एक अभिव्यक्ति में बदलते हैं, जो किसी मैक्रो से / से कोड उत्पन्न करने पर आसान हो सकता है।
phipsgabler

1
ओह, धन्यवाद, इस संबंध में मैंने इसे उलझन में डाल दिया है let ... endजो एक स्थानीय गुंजाइश पेश करता है। मेरा उत्तर सही कर देगा।
क्रॉस्न्ब्र

मैं हर समय एक ही गलत धारणा बनाता हूं :) यह वही है जो कोई उम्मीद करेगा।
phipsgabler

1
@ क्रस्टर्न आपकी पहली गोली अभी भी भ्रामक है। यह अभी भी ऐसा लगता हैbegin ब्लॉक एक स्थानीय गुंजाइश पेश करते हैं।
कैमरून बेगनकेक

7

सामान्यीकरण करने के लिए क्या हर किसी ने कहा है: ब्लॉक आप की एक सूची रूपांतरित करने की अनुमति बयान से एक के लिए (वाक्यात्मक "वाक्यांश" कोई मान है, यानी, नहीं सौंपा जा सकता है) अभिव्यक्ति (एक "वाक्यांश" है कि मूल्यों का प्रतिनिधित्व करता है और कर सकते हैं आवंटित किया )।

उदाहरण के लिए, जब आपको नहीं करना चाहिए, आप लिख सकते हैं

x = begin
    s = 0
    for i = 1:10
        s += i^2
    end
    s
end

xलूपिंग ऑपरेशन के परिणाम के लिए असाइन करने के लिए। (इस प्रतिबंध के साथ कि अनुक्रम में अंतिम कथन वास्तव में एक अभिव्यक्ति होना चाहिए - अन्यथा, आपके पास अभिव्यक्ति के लिए कोई मूल्य नहीं होगा।)

इसका एक वैध उपयोग मामला उत्पन्न होता है। उदाहरण के लिए, आप बदल सकते हैं

x = @somthing bla blub

में

x = begin
   (stuff involving bla and blub)
end

पारदर्शी रूप से उपयोगकर्ता के लिए, जबकि @somethingस्वतंत्र रूप से किसी भी भाषा का निर्माण कर सकते हैं।

या यदि आप एक लंबे शरीर के साथ एक अनाम फ़ंक्शन लिखना चाहते हैं (और functionफ़ॉर्म का उपयोग न करें ):

f = x -> begin
   ...
end

1
एक मामूली स्पष्टीकरण: जूलिया में, बयानों में मूल्य होते हैं और उन्हें सौंपा जा सकता है। तो आप कर सकते हैं x = y = 1, a = if false endऔर b = for i in 1:2 end, जिसके बाद xमूल्य है 1, aऔर bदोनों का मूल्य है nothing
कैमरन बेगनगन मार्क

ओह, यहां एक if-elseबयान के मूल्य को निर्दिष्ट करने का एक और अधिक उपयोगी उदाहरण है a = if false; 1 else 2 end:। इस मामले में, aबराबर है 2
कैमरून बेगनकेक

1
ठीक है, उनके पास मूल्य हैं और टेचीनील भाव भी हैं। असाइनमेंट एक अभिव्यक्ति है, क्योंकि यह मूल रूप से है setproperty!/ setindex!, और यह "पारंपरिक रूप से" इसके लिए एक मूल्य है (सी-जैसी भाषाओं में)। उसी के लिए if-else, जो कि कुछ भाषाओं में एक अभिव्यक्ति है। लेकिन forऔर "डिफ़ॉल्ट" मान के ifबिना , मुझे लगता है कि केवल एक कलाकृति के रूप में। elsenothing
phipsgabler

6

इन ब्लॉकों का एक उपयोग समझ में आता है:

A = [ begin
           x = y^2
           x - x^2 + 2
         end
         for y = 1:5 ]

आप एक समारोह बना सकते हैं और इसका उपयोग इसके बजाय समझ के अंदर कर सकते हैं, लेकिन कभी-कभी यह सुविधाजनक होता है। जब भी आप किसी कोड के मल्टीलाइन ब्लॉक का उपयोग करना चाहते हैं, उदाहरण के लिए मैक्रो के लिए एक तर्क के रूप में पास करने के लिए इसका उपयोग करें (जो आमतौर पर @testsetटेस्ट मानक पुस्तकालय से उपयोग किया जाता है )।


अपनी बात का विरोध करने के लिए नहीं बल्कि y^2 - y^4 + 2इस मामले में सिर्फ एक ही लिख सकता है । शायद एक उदाहरण दिखाना बेहतर होगा जहां दो (या अधिक) चरणों की वास्तव में आवश्यकता है।
crstnbr

@ crstnbr आप सही हैं, लेकिन मैंने अभी शुरुआत में किताब से उदाहरण का उपयोग किया था और बस दिलचस्पी थी कि एक समझदार उपयोग क्या होगा।
जॉर्जी

1
जैसे, दो बार कुछ महंगे मध्यवर्ती मूल्य की गणना करने के लिए।
phipsgabler

5

सीधे शब्दों में कहें: "शुरू" सिर्फ एक कोड ब्लॉक को दर्शाता है (इस पर डॉक्स देखें: https://docs.julialang.org/en/v1/base/base/#begin )।

ऊपर दिए गए उदाहरण में, यह स्पष्ट नहीं है कि किसी फ़ंक्शन को घोषित करने के लिए एक शुरुआत ब्लॉक बनाम का उपयोग करने का कोई मूल्य है।

मुझे यह नहीं दिख रहा है कि कोड में कीवर्ड का बहुत अधिक उपयोग किया जा रहा है और मैंने व्यक्तिगत रूप से इसका इस्तेमाल कभी नहीं किया है। मेरा सुझाव तो बस एक समारोह का उपयोग करने के लिए के रूप में यह एक ही बात करेंगे।


मैंने अभी तक जूलिया का उपयोग नहीं किया है, लेकिन यह वही है जो मैं सोच रहा हूं। हालाँकि, जब भाषा डिजाइन की गई थी (संभवतः बहुत ही स्मार्ट) लोगों को मन में एक विचार आया होगा, है ना?
जॉर्जी

मैं @logankilpatrick से सहमत हूं कि कई मामलों में आप इसके बजाय फ़ंक्शन का उपयोग करना चाहते हैं। लेकिन मुझे लगता है कि इन ब्लॉकों के अस्तित्व के कारण हैं (मेरा उत्तर देखें)।
क्रस्टर्नब्र

@Georgery बयानों के क्रम को एक अभिव्यक्ति में बदलना एक उपयोगी बात है कभी-कभी (LISP prognमें cf. )।
phipsgabler

1
जैसा कि आप सही ढंग से ध्यान दें, यह संदर्भ में निरर्थक लगता है
माइकल के बोरेगार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.