লিস্প সম্প্রদায় কেন ফাংশন শেষে সমস্ত বন্ধনী জড়ো করতে পছন্দ করে?


26

লিস্প সম্প্রদায় কেন ফাংশন শেষে সমস্ত বন্ধনী জমা করতে পছন্দ করে:

(defn defer-expensive [cheap expensive]
  (if-let [good-enough (force cheap)]
    good-enough
    (force expensive)))

সি বা জাওয়ার মতো কনভেনশন কেন নিয়োগ করবেন না?
ঠিক আছে, লিস্প এই ভাষাগুলির চেয়ে অনেক বেশি বয়স্ক, তবে আমি সমসাময়িক লিস্পারদের নিয়ে কথা বলছি।

(defn defer-expensive [cheap expensive]
  (if-let [good-enough (force cheap)]
    good-enough
    (force expensive)
  )
)

দ্রষ্টব্য: কোড স্নিপেটটি "দ্য জয় অফ ক্লোজার" বইটি থেকে এসেছে।


13
আমাকে বলা হয়েছে যে পাঞ্চ কার্ডের দিনগুলিতে, একটি অতিরিক্ত কার্ডের সাথে একটি লিপ্প প্রোগ্রামের সমাপ্তি একটি সাধারণ অনুশীলন ছিল যার উপর 80 টি ডান বন্ধনী ছিল, কেবলমাত্র নিশ্চিত করার জন্য যে প্রোগ্রামে সমস্ত খালি বন্ধনীর সাথে ম্যাচের যথেষ্ট পরিমাণ রয়েছে? ।
মধ্যে Alger

2
বাহ আমি এটা পছন্দ. আমি সর্বদা প্রথম বন্ধনীকে ঘৃণা করেছি, তবে আপনার দ্বিতীয় উদাহরণটি আমার কাছে সুন্দর দেখাচ্ছে looks পাইথনের মতো সুন্দর নয়, উন্নতি।
এরিক উইলসন

5
কারণ তারা পারে?
Muad'Dib

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

উত্তর:


28

অ্যালগল-ভিত্তিক ভাষাগুলি তাদের নিজস্ব লাইনে বন্ধনীগুলিকে উত্সাহিত করে তা হ'ল বন্ধনীগুলি সরিয়ে না নিয়ে সীমানাঙ্কিত ব্রেসগুলির মধ্যে আরও লাইন যুক্ত করতে উত্সাহ দেওয়া। অর্থাত, যদি কেউ শুরু করে

if (pred)
{
  printf("yes");
}

ধনুর্বন্ধনীগুলির মধ্যে বরাবর আসা এবং অন্য বিবৃতি যুক্ত করা সহজ :

if (pred)
{
  printf("yes");
  ++yes_votes;
}

মূল ফর্ম ছিল

if (pred)
{ printf("yes"); }

তারপরে আমাদের দুটি ধনুর্বন্ধনী "চালিত" করতে হবে , তবে আমার উদাহরণটি পরবর্তীটির সাথে আরও সম্পর্কিত। এখানে, ধনুর্বন্ধনীগুলি বিবৃতিগুলির ক্রম হিসাবে চিহ্নিত করার জন্য সীমিত করা হচ্ছে, বেশিরভাগই পার্শ্ব প্রতিক্রিয়াটির জন্য অনুরোধ করা হয়েছে।

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

কমন লিস্পে, prognফর্মটি ব্যতিক্রম (যেমন তার ভাইবোনদের মতো):

(progn
  (exp-ignored-return-1)
  (exp-ignored-return-2)
  (exp-taken-return))

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

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

বন্ধনী বন্ধ হওয়ার ফলে তারা যে ফর্মটি খুলবে তার প্রসারণের চেয়ে অনেক কম আমদানি is সময়ের সাথে সাথে, কেউ বন্ধনীগুলি উপেক্ষা করতে এবং আকারে লিখতে এবং পড়তে শেখে — অনেকটা পাইথন প্রোগ্রামারদের মতো। যাইহোক, এই উপমাটি আপনাকে এই ভাবতে পরিচালিত করতে দেবেন না যে বন্ধনীগুলি পুরোপুরি সরানো সার্থক হবে। না, এটি বিতর্কটি সবচেয়ে ভালভাবে সংরক্ষণ করা comp.lang.lisp


2
আমি মনে করি যে শেষে যুক্ত করা খুব বিরল নয়, উদাহরণস্বরূপ (let ((var1 expr1) more-bindings-to-be-added) ...), বা(list element1 more-elements-to-be-added)
অ্যালেক্সি

14

কারণ এটি সাহায্য করে না। আমরা কোড স্ট্রাকচার দেখানোর জন্য ইনডেন্টেশন ব্যবহার করি। যদি আমরা কোডের ব্লকগুলি পৃথক করতে চাই, আমরা সত্যই ফাঁকা লাইন ব্যবহার করি।

যেহেতু লিসপ সিনট্যাক্সটি এতটা সামঞ্জস্যপূর্ণ, তাই প্রথম বন্ধনী হ'ল প্রোগ্রামার এবং সম্পাদক উভয়ের জন্য ইনডেন্টেশনের স্থিতিশীল গাইড।

(আমার জন্য, প্রশ্নটি বরং সি এবং জাভা প্রোগ্রামাররা কেন তাদের ধনুর্বন্ধনী কাছাকাছি নিক্ষেপ করতে পছন্দ করে is)

কেবল প্রদর্শন করতে, ধরে নিই যে এই অপারেটরগুলি সি-জাতীয় ভাষায় উপলব্ধ ছিল:

Foo defer_expensive (Thunk cheap, Thunk expensive) {
    if (Foo good_enough = force (cheap)) {
        return good_enough; }
    else {
        return force (expensive); }}

দুটি সমাপ্তি বন্ধনী দুটি নীড়ের স্তর বন্ধ করে দেয় close বাক্য গঠনটি অবশ্যই স্পষ্টভাবে সঠিক। পাইথন সিনট্যাক্সের উপমা অনুসারে, ধনুর্বন্ধনীগুলি কেবল স্পষ্টভাবে INDENT এবং DEDENT টোকেন।

অবশ্যই এটি "ওয়ান ট্রু ব্রেস স্টাইল" টিএম নাও হতে পারে তবে আমি বিশ্বাস করি এটি কেবল historicতিহাসিক দুর্ঘটনা এবং অভ্যাস।


2
এছাড়াও, প্রায় সব পাতার মর্মর সম্পাদকদের ম্যাচিং প্রথম বন্ধনী চিহ্নিত যখন (কিছু এছাড়াও সঠিক বন্ধ )করার ], বা বিপরীতভাবে ভাইস) তাই আপনি জানেন আপনি সঠিক পরিমাণ এমনকি আপনি যদি খাঁজ মাত্রা চেক করবেন না বন্ধ।
কনফিগারকারী

6
ডাব্লুআরটি "প্রশ্ন", কারণ দ্বিতীয় উদাহরণের শৈলীতে টোকেনগুলি "কাছাকাছি নিক্ষেপ করা" আপনাকে সহজেই এগুলি আপনার চোখের সাথে সংযুক্ত করে দেয় এবং কী কী বন্ধ হয় তা দেখতে দেয়, এমনকি আপনি কোনও পাঠ্য সম্পাদকের সাথে কোনও স্বয়ংক্রিয় মিলে না থাকলেও / হাইলাইট বৈশিষ্ট্য।
ম্যাসন হুইলার 16 ই

1
@ ম্যাসন হুইলার হ্যাঁ, ঠিক আছে।
চিরন

3
টিবিএইচ, এটি আমার কাছে যা বলে তা হ'ল এলআইএসপি-তে প্যারেনগুলি বেশিরভাগই অপ্রয়োজনীয়, সম্ভাবনার সাথে (সি ++ এর সাথে) যে इंडেন্টেশনটি বিভ্রান্ত হতে পারে - যদি ইন্ডেন্টেশন আপনাকে জানার দরকার তা বলে দেয় তবে এটি কম্পাইলারকেও একই কথা বলা উচিত, যেমন হাস্কেল এবং পাইথন বিটিডাব্লু - যদি / সুইচ / যখন / সি ++ তে যাই থাকে তবে একই ইনডেন্ট স্তরে ধনুর্বন্ধনী থাকা যেহেতু ইনডেন্টেশনটি বিভ্রান্তিকর তা রোধ করতে সহায়তা করে - এলএইচএসের একটি ভিজ্যুয়াল স্ক্যান আপনাকে জানায় যে প্রতিটি ওপেন-ব্রেস একটি বন্ধনী-ব্রেসের সাথে মিলে যায় এবং সেই ইন্ডেন্টেশনটি সেই ধননীগুলির সাথে সামঞ্জস্যপূর্ণ।
স্টিভ 314

1
@ স্টিভ 314: না, ইন্ডেন্টেশনটি নিরর্থক। পাইথন এবং হাস্কেলতেও ইন্ডেন্টেশন বিভ্রান্ত করতে পারে (এক-অফ ইন্ডেন্টেশন বা ট্যাবুলারগুলি সম্পর্কে ভাবুন), এটি কেবল পার্সারকেও বিভ্রান্ত করা। আমি মনে করি যে প্রথম বন্ধনী লেখক এবং বিশ্লেষককে একটি হাতিয়ার, অন্যদিকে ইনডেন্টেশন লেখক এবং (মানব) পাঠকের জন্য একটি সরঞ্জাম। অন্য কথায়, ইন্ডেন্টেশন একটি মন্তব্য, বন্ধনীগুলি সিনট্যাক্স।
সান্তে

11

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


আপনার কাছ থেকে একটি উত্তর পেতে কি সম্মান :) ধন্যবাদ।
চিরন

কোন সম্পাদক এস-এক্সপ্রেশন দ্বারা সরানো? আরও সুনির্দিষ্টভাবে, আমি কীভাবে এটি vimকরতে পারি?
হেসেন

2
@ হাসেনজে আপনার হয়ত vimacs.vim প্লাগইন লাগবে । : পি
মার্ক সি সি

5

Lispers, আপনি জানেন, ঘৃণিতভাবে bletcherous এটা হতে পারে যেমন, সেখানে হয় একটি নির্দিষ্ট আমি জানি না quoi দ্বিতীয় উদাহরণ:

(defn defer-expensive [cheap expensive]
  (if-let [good-enough (force cheap)]
    good-enough
    (force expensive)
  )
)

প্রথমে আমি প্রলুব্ধার উত্সটিতে একটি আঙুল রাখতে পারি না, তাই বলতে গেলে এবং তখন আমি বুঝতে পারি যে এটি কেবল একটি ট্রিগার হারিয়েছে:

(defn defer-expensive [cheap expensive]      
  (if-let [good-enough (force cheap)]
    good-enough   ;   )
    (force expensive) 
  )
)

ভাল খবর!

আমি এখন আমার লিস্প গ্যাংস্টার গ্রিপ অনুশীলন করতে যাচ্ছি!


2
এটি আমি এই সাইটে দেখেছি এমন মজাদার এবং সবচেয়ে আন্ডাররেটেড উত্তরগুলির মধ্যে একটি। আমি আমার টুপি টিপছি।
বাইসোর

0

আমার ক্ষেত্রে আমি পর্দার স্থানের অপচয় নষ্টকারীদের জন্য উত্সর্গীকৃত রেখাগুলি খুঁজে পাই এবং আপনি সি-তে কোড লেখার সময় সেখানে স্টাইলও রয়েছে

if (pred) {
   printf("yes");
   ++yes_votes;
}

লোকেরা কেন স্থান বাঁচাতে "যদি" এর একই লাইনে উদ্বোধনী ব্রেস রাখে এবং "যদি" এর নিজস্ব লাইন থাকে তখন এটির নিজস্ব লাইন থাকা অপ্রয়োজনীয় বলে মনে হয়।

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

{if (pred)
    printf("yes");
}

এটি শেষের মতো বন্ধ বন্ধনীটির মতো, জায়গাটির বাইরে দেখায়। এটি এভাবে খোলে

if (pred) {
    printf("yes");
}

আপনাকে '{' & '}' দ্বারা ব্লকটির সীমাবদ্ধতা এবং এর সীমাবদ্ধতার একটি স্পষ্ট দর্শন দেবে

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

(defn defer-expensive [cheap expensive]
    _(if-let [good-enough (force cheap)]
    good-enough
    (force expensive)_))

আপনি আপনার কার্সারটি মাঝের ক্লোজিং পেরেনে রেখে দিতে পারেন এবং যদি ই-লাইটটি হাইলাইট করা হয় তবে তার উদ্বোধনী পেরেন রাখতে পারেন।

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