যৌগিক অভিব্যক্তি কেন?


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ব্লক না না সুযোগ পরিচয় করিয়ে । অন্যদিকে, তারা বিবৃতিগুলির ক্রমকে একটি অভিব্যক্তিতে রূপান্তর করে, যা আপনি ম্যাক্রোর সাথে / থেকে কোড উত্পন্ন করলে সহজেই হতে পারে।
ফিপসগাবিলার

1
ওহ, ধন্যবাদ, সে ক্ষেত্রে আমি এটিকে বিভ্রান্ত করেছিলাম let ... endযা একটি স্থানীয় সুযোগের পরিচয় দেয়। আমার উত্তর সংশোধন করবে।
crstnbr

আমি সর্বদা একই ভুল অনুমান করি :) এটিই যা প্রত্যাশা করে।
phipsgabler

1
@crstnbr আপনার প্রথম বুলেটটি এখনও বিভ্রান্ত করছে। এটি এখনও বলে মনে হচ্ছে যে 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!, এবং এটি "traditionতিহ্যগতভাবে" এর একটি মূল্য (সি-জাতীয় ভাষায়) রাখার জন্য একটি জিনিস। একইরকম 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 আপনি ঠিক বলেছেন তবে আমি প্রথমদিকে বইয়ের উদাহরণটি ব্যবহার করেছি এবং বুদ্ধিমান ব্যবহার কী হবে তা কেবল আগ্রহী ছিলাম।
জর্জি 15

1
পছন্দ করুন, কিছু ব্যয়বহুল মধ্যবর্তী মানের দ্বিগুণ গণনা সংরক্ষণ করতে।
ফিলিপ্সেবলার

5

সহজ ভাষায়: "শুরু" কেবল একটি কোড ব্লককে বোঝায় (এটিতে ডক্সগুলি দেখুন: https://docs.julialang.org/en/v1/base/base/#begin )।

উপরের উদাহরণে এটি স্পষ্ট নয় যে কোনও ফাংশন ঘোষনা করে বনাম একটি ব্লক ব্যবহারের কোনও মূল্য আছে।

কোডটিতে কোডটি খুব বেশি ব্যবহৃত হচ্ছে দেখছি না এবং আমি ব্যক্তিগতভাবে কখনও এটি ব্যবহারে ব্যবহার করি নি। আমার পরামর্শ তাই কেবল কোনও ফাংশন ব্যবহার করার জন্য এটি একই কাজ করবে।


আমি জুলিয়া এখনও ব্যবহার করিনি, তবে আমি যা ভাবছি ঠিক এটি এটিই। তবে, যখন ভাষাটি ডিজাইন করা হয়েছিল (সম্ভবত খুব স্মার্ট) লোকেরা অবশ্যই মনে মনে ধারণা পেয়েছিল, তাই না?
জর্জ্রি

আমি @ লোগানকিলপাট্রিকের সাথে একমত যে অনেক ক্ষেত্রে আপনি পরিবর্তে ফাংশন ব্যবহার করতে চান। তবে আমি মনে করি এই ব্লকগুলির অস্তিত্বের কারণ রয়েছে (আমার উত্তর দেখুন)।
crstnbr

@ জেজরি স্টেটমেন্টের ক্রমকে একটি অভিব্যক্তিতে পরিণত করা কখনও কখনও দরকারী জিনিস (সিএফ progn। এলআইএসপিতে)।
phipsgabler

1
যেমনটি আপনি সঠিকভাবে লক্ষ্য করেছেন, এটি প্রসঙ্গে অযৌক্তিক বলে মনে হচ্ছে
মাইকেল কে। বোরেগার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.