সুইফটকে কেন সেমিকোলনের প্রয়োজন হয় না? [বন্ধ]


20

আমি সাধারণত সি # বা অবজেক্টিভ সি তে কোড করি এবং সম্প্রতি অ্যাপলের নতুন প্রোগ্রামিং ল্যাঙ্গুয়েজ - সুইফটটি শিখতে নিজের উপরে এনেছি।

প্রথম যে বিষয়টি আমি লক্ষ্য করেছি তা হ'ল সুইফটে একটি লাইন শেষ করতে আপনাকে সেমিকোলন যুক্ত করার দরকার নেই তবে আপনি যদি কমপক্ষে যা পরীক্ষা করে থাকেন তবে এটি সংকলকটির সাথে হস্তক্ষেপ করে না।

আমি যখন লিখি:

int someNumber = 0;

অবজেক্টিভ-সিতে সেমিকোলন প্রোগ্রামটিকে বলে যে লাইনটি শেষ হয়ে গেছে এবং পরবর্তী লাইনে না পড়ে।

সুইফট দিয়ে আমি এর সাথে একটি ভেরিয়েবল ঘোষণা করতে পারি

var someNumber:Int = 5

এবং একটি সেমিকোলন যুক্ত না করে এবং সিস্টেম জানে যে এটি লাইনের শেষ।

কিছু ভাষাগুলি এটি করার অনুমতি দেয় এবং অন্যরা তা না করে? সেমিকোলনটি শেষের দিকে যুক্ত করার মতো অভিন্ন ব্যবস্থা রাখবেন না কেন?


সবাই অন্য ভাষা থেকে আসে না, তাই তারা কীভাবে জানবে যে তারা অভিন্ন নয়? আপেল কি আরও বেশি নতুন প্রোগ্রামারকে সুইফটের সাথে আকর্ষণ করতে পারবে না যে উদ্দেশ্যগুলি-সি অংশগুলি অপছন্দ করে?
জেফো

2
প্রচুর ওবজ-সি ভেটস সুইফ্টের সাথে অসন্তুষ্ট এবং অনেকগুলি ওজ-সি পছন্দ করে। এটি অ্যাপল ফোরামগুলির মাধ্যমে দেখা যায়। সুইফট কেবল ২০১৪ সালে প্রকাশিত হয়েছিল এবং যদি সুইফট ২.০ সহ এই পতনটি প্রকাশিত হয় প্রতি ভাষাতে প্রতি কয়েক মাসে পুরো বাগ এবং পরিবর্তন করা হয়। সুইফট ওজজে-সি এর উপর ভিত্তি করে তবে আরও সহজ সরল ইংরাজির মাধ্যমে কোডিং শিখতে আরও সহজ করার লক্ষ্য।
মেমজ

পুরাতন সংকলক প্রয়োগকারী কেবল অলস এবং / অথবা সরল পার্সিংয়ের সাথে আরও দক্ষ হতে হয়েছিল। এটির আর দরকার নেই। এটি স্থানীয় প্রকারের অনুমানের মতোই, আপনার সংকলক লেখক যদি অলস হন এবং বিকাশকারীদের অভিজ্ঞতার বিষয়ে চিন্তা না করেন তবে আপনার কাছে এটি নেই।
Ebuall

উত্তর:


18

কিছু ভাষাগুলি এটি করার অনুমতি দেয় এবং অন্যরা তা না করে? সেমিকোলনটি শেষের দিকে যুক্ত করার মতো অভিন্ন ব্যবস্থা রাখবেন না কেন?

রবার্ট সুইফট সম্পর্কে একটি ভাল উত্তর দিয়েছে, আমি সাধারণভাবে পার্সিং এবং কেন সেমিকোলন ব্যবহার করব বা না করব সে সম্পর্কে আরও কিছু যুক্ত করার চেষ্টা করব।

আপনি যখন প্রোগ্রামটি সংকলন করেন, তখন আপনার উত্স ফাইলটি এক্সিকিউটেবল কোডে রূপান্তরিত হওয়ার আগে বেশ কয়েকটি পদক্ষেপ রয়েছে, প্রথমটি পড়ার এবং পার্সিংয়ের একটি । পার্সিংয়ের সময় আপনার কোড অক্ষরের ক্রমিক থেকে ভাষার ব্যাকরণ অনুযায়ী কাঠামোগত উপস্থাপনায় রূপান্তরিত হয় । এর জন্য এটি প্রয়োজনীয় যে আপনার কোডগুলি রচনাগুলি (ভেরিয়েবল, ধ্রুবক, ঘোষণা ইত্যাদি) কোনওভাবে চিহ্নিত এবং পৃথক করা উচিত। আপনি যখন এই মত ঘোষণা করেন:

int someNumber = 0;

এটি কেবলমাত্র অক্ষরের একটি অনুক্রম যা কোনওভাবে " someNumberধরণের একটি 'জিনিস তৈরি করুন intএবং তাকে নির্ধারিত করুন ' ধারণাটিতে পরিণত 0করা দরকার

এর জন্য বিবৃতিটি ঠিক কোথায় শুরু এবং শেষ হয় তা সনাক্তকরণের প্রয়োজন। আপনার যদি এটি থাকে তবে ভাবুন:

int someNumber = 0;
int otherNumber = 1;

আপনার জানা দরকার যে এগুলি দুটি পৃথক ঘোষণা। ;C-র মত ভাষাতে তাই পার্সার অক্ষর পর্যন্ত এটি এক খুঁজে বের সার্চ, এবং বুঝতে কি কেবলমাত্র একটি বিবৃতি হিসাবে পাঠ করা হয় প্রচেষ্টা, যে জন্য ব্যবহার করা হয়। রবার্ট যেমন বলেছিলেন, এটি একই লাইনে একাধিক বক্তব্য রাখার অনুমতি দেয়, যেমন:

int someNumber = 0; int otherNumber = 1;

যা তাদের দুটি লাইনে লেখার মতো একই প্রভাব ফেলে।

পাইথনের মতো অন্যান্য ভাষায়ও আপনি প্রতিটি বিবৃতি আলাদা লাইনে রেখে দেবেন বলে আশা করা হচ্ছে।

x = 3
if x < 10:
   print 'x smaller than 10'
else:
   print 'x is bigger than 10 or equal'

সুতরাং একটি যুক্ত করার দরকার নেই ;, কারণ ভাষা নিজেই আপনাকে একই লাইনে বিবৃতি যুক্ত করতে বাধা দেয়!

তবুও অন্যান্য ভাষাগুলির মতো, এলআইএসপি বা স্কিমের , বিবৃতি গোষ্ঠীকরণের একটি খুব আলাদা পদ্ধতি রয়েছে (ঠিক আছে, তারা আসলে বিবৃতি নয়, তবে আপাতত এটিকে উপেক্ষা করুন)। সুতরাং আপনার কাছে সমস্ত কিছুর জন্য প্রথম বন্ধনী রয়েছে:

(define (do-stuff x)
  (begin
    (display (format "value: ~a" x))
    x))

আবার, আপনি প্রয়োজন নেই ;শুধু কারণ আপনি একই প্রতীক (ব্যবহার ), (জিনিসের জন্য) যে অন্যান্য ভাষা {, }, :, ইত্যাদি যিনি শুধুমাত্র পাতার মর্মর সিনট্যাক্স জানেন তোমরা জিজ্ঞেস করতে পারেন: কেন আপনি প্রয়োজন ;আপনার বিবৃতি শেষে ?

কেবলমাত্র একটি অপরিচিত উদাহরণ যুক্ত করতে: ওক্যামেলের বিবৃতি শেষে কেবল অর্ধবৃত্ত থাকে না ... এটির দুটি রয়েছে!

let rec fact x =
    if x <= 1 then 1 else x * fact (x - 1);;

কেন? আমি জানি না। :)

বিভিন্ন ভাষা বিভিন্ন উদ্দেশ্য এবং বিভিন্ন দর্শনের সাথে ডিজাইন করা হয়েছে। যদি সমস্ত ভাষায় একই বাক্য গঠন এবং কনভেনশনগুলি ভাগ করা হয় তবে তারা সম্ভবত আপনাকে একই জিনিস একই পদ্ধতিতে করার অনুমতি দেবে।


4
ভাল সমাপ্ত বাক্য।
টমাস এডিং

ভাল উদাহরণ, কিন্তু আপনি প্রশ্নের উত্তর দেয় নি।
রোবো রোবক

অতিরিক্ত ডেটা পয়েন্ট: কিছু ভাষা সি-স্টাইল পরিবারে এক ধরণের বিপরীত-পদ্ধতির গ্রহণ করে: উদাহরণস্বরূপ হাইপারটালক একটি লাইনের শক্ত প্রান্ত হিসাবে (সেমিকোলনের পরিবর্তে) লাইন বিরতি ব্যবহার করে এবং যদি আপনি কোনও বিবৃতি অবিরত করতে চান তবে লাইন ব্রেকগুলি রক্ষা করতে হবে বিভিন্ন লাইন উপর। মজাদারভাবে, সি এর নিজস্ব নিজস্ব প্রিপ্রোসেসরও সেভাবে কাজ করে।
uliwitness

11

স্টেটমেন্টের শেষটি সীমিত করতে সেমিকোলনের পরিবর্তে লাইন ব্রেকগুলি ব্যবহার করা হয়।

ইন ভাষা গাইড: বুনিয়াদি এটা বলেছেন:

অন্যান্য অনেক ভাষার মতো নয়, আপনার কোডে প্রতিটি বিবৃতি দেওয়ার পরে সুইফটকে আপনাকে একটি সেমিকোলন (;) লেখার প্রয়োজন হয় না, যদিও আপনি যদি চান তবে এটি করতে পারেন। আপনি যদি একটি লাইনে একাধিক পৃথক বিবৃতি লিখতে চান তবে সেমিকোলনগুলির প্রয়োজন।

কেন? কারণ ভাষা ডিজাইনাররা এটি এটি করতে চেয়েছিলেন।

উপরের দ্বিতীয় বাক্যটি আপনাকে কেন সেমিকোলনের প্রয়োজন নেই তা ইঙ্গিত দেয়; বেশিরভাগ বিবৃতি একক লাইন হয়। এই বুদ্বুদ সাজানোর উদাহরণটি পর্যবেক্ষণ করুন; একক-লাইন স্টেটমেন্ট এবং কোনও সেমিকোলনের সংমিশ্রণটি খুব পরিষ্কার বাক্য গঠন করে যা ভিবি-এর মতো, তবে কম ভার্বোস:

func bubbleSort<T:Comparable>(inout list:[T]) {
    var done = false
    while !done {
        done = true
        for i in 1..<list.count {
            if list[i - 1] > list[i] {
                (list[i], list[i - 1]) = (list[i - 1], list[i])
                done = false
            }
        }
    }
}

যেহেতু সুইফ্টে স্টেটমেন্টগুলি সাধারণত একটি লাইন বিরতিতে শেষ হয়, তাই বিবৃতিটির শেষে চিহ্নিত করার জন্য সেমিকোলনের প্রয়োজনীয়তা হ্রাস পায়। অন্যান্য ভাষাগুলি যা সেমিকোলন ব্যবহার করে সেগুলি এভাবে কাজ করে না; আপনি অবাধে বহু-লাইন বিবৃতি লিখতে পারেন, তবে সংকলকটি জানেন যে বিবৃতিটি শেষ হয়েছে কেবলমাত্র যখন আপনি তার সেমিকোলনটি এর শেষে রাখেন।

যখন বিবৃতিগুলি কোনও লাইন বিরতিতে শেষ না হয়, আপনাকে সুইফ্ট সংকলকটি আগের লাইনের ধারাবাহিকতা হিসাবে স্বীকৃতি দিতে পারে এমন জায়গায় লাইন বিরতি রাখতে হবে:

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")

2
সর্বশেষ বিবৃতিটি মিথ্যা, লাইন বিরতি স্থাপনের জন্য নির্দিষ্ট কোনও অবস্থান নেই। আপনার কোডের লাইনগুলিকে ইন্টেন্ট করা এবং পাঠযোগ্যতার উন্নতির জন্য সারিবদ্ধ রাখা ভাল।
এনেকো অ্যালোনসো

মজাদার ঘটনা: ত্রুটি প্রতিবেদন করার ক্ষেত্রে এটির একটি নকআউট প্রভাব রয়েছে। অনেকগুলি সি সংকলক (বিশেষত ঝাঁকুনি সে ক্ষেত্রে খুব ভাল) একটি বাক্য বিন্যাসের ত্রুটিযুক্ত একটি বিবৃতিটির শেষ সন্ধান করতে সেমিকোলন ব্যবহার করে এবং সেই তথ্যটি ব্যবহার করতে পারে উদাহরণস্বরূপ তারা যে অনুপস্থিত রয়েছে তার কাছাকাছি নিখোঁজ বন্ধের বন্ধনীগুলি রিপোর্ট করার জন্য। সেমিকোলনগুলির অভাব, সুইফটে একটি ত্রুটি তৈরির ফলে প্রায়শই নীচের লাইনটিকে ত্রুটিযুক্ত পূর্বসূরির সাথে সংকোচিত হতে পারে এবং সত্যই অদ্ভুত ত্রুটি বার্তা নিয়ে যেতে পারে।
uliwitness 13
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.