আমি কখন / কেন অগ্রগতি ব্যবহার করব?


19

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

(use-package undo-tree
  :defer t
  :ensure t
  :diminish undo-tree-mode
  :config
  (progn
    (global-undo-tree-mode)
    (setq undo-tree-visualizer-timestamps t)
    (setq undo-tree-visualizer-diff t)))

উপরের কনফিগারেশন এবং এর মধ্যে কোনও বড় পার্থক্য রয়েছে কি?

(use-package undo-tree
  :defer t
  :ensure t
  :diminish undo-tree-mode
  :config
  (global-undo-tree-mode)
  (setq undo-tree-visualizer-timestamps t)
  (setq undo-tree-visualizer-diff t))

আমি মনে করি প্রথম উদাহরণটি একরকম ক্লিনার, যদিও এটির আরও বেশি বাক্য গঠন রয়েছে, এবং আমার অন্তর্নিহিততাটি হ'ল ব্যবহার থেকে কিছুটা পারফরম্যান্স বাড়ানো হতে পারে prognতবে আমি নিশ্চিত নই। কোন অন্তর্দৃষ্টি জন্য আপনাকে ধন্যবাদ!


7
এই বিশেষ ক্ষেত্রে কোনও পার্থক্য নেই: এটি অনুপস্থিত থাকলে আপনার: কনফিগার ফর্মগুলির চারপাশে use-packageএকটি আবৃত করবে progn। এটি ব্যবহার করে দেখুন: আপনি এ এর ​​শেষে পয়েন্ট রাখতে পারেন এবং ম্যাক্রো কীভাবে প্রসারিত হয় তা দেখতে (use-package ...)কল M-x pp-macroexpand-last-sexpকরতে পারেন। আপনি দেখতে পাবেন যে এই দুটি উদাহরণের জন্য এটি অভিন্ন।
গ্লুকাস

যেখানে prognপ্রয়োজন সেখানে একটি উদাহরণ : emacs.stackexchange.com/questions/39172/…
npostavs

উত্তর:


11

prognসাধারণত ম্যাক্রোগুলির সাথে ডিল করার সময় ব্যবহৃত হয়। কিছু ম্যাক্রো ( use-packageএকটি ম্যাক্রো, সর্বশেষ আমি পরীক্ষা করে দেখেছি) কেবলমাত্র 1 টি ফর্ম গ্রহণ করে , যেখানে অন্যরা সমস্ত অবশিষ্ট ফর্ম গ্রাস করে

progn ফর্মগুলির ক্রমটিকে একক ফর্মে রূপান্তর করতে প্রাক্তন ক্ষেত্রে ব্যবহৃত হয়।

আপনার উদাহরণগুলিতে, প্রথমটি ব্যবহার করে prognএবং এভাবে 1 টি ফর্ম পরে থাকে :config। দ্বিতীয়টিতে 3 টি ফর্ম রয়েছে । যদি use-packageম্যাক্রো কেবল 1 টি ফর্ম অনুসরণের প্রত্যাশা করে :config, তবে এটি ত্রুটির কারণ হবে।

এটি লক্ষণীয় যে prognউভয় ক্ষেত্রেই কাজ করে , যখন বাদ দেওয়া কেবল তখনই কাজ করে যদি ম্যাক্রো একাধিক ফর্ম গ্রহণ করে। এর ফলস্বরূপ, কিছু লোক কেবল সর্বদা ব্যবহার করতে পছন্দ করে progn, কারণ এটি সর্বদা কার্যকর হবে।


15
ম্যাক্রোগুলির সাথে এর আসলে কোনও সম্পর্ক নেই। কিছু ফাংশন এবং ম্যাক্রোগুলির একটি তথাকথিত "অন্তর্নিহিত progn" থাকে যার অর্থ তারা যে কোনও সংখ্যক সেক্সপসকে পৃথক যুক্তি হিসাবে স্বীকার করে এবং ক্রমানুসারে তাদের মূল্যায়ন করে। অন্যরা তা দেয় না এবং পরিবর্তে কেবল একক যুক্তির প্রত্যাশা / মঞ্জুরি দেয় যেখানে আপনি একাধিক সেক্সপকে ক্রমানুসারে মূল্যায়ন করতে চাইতে পারেন। যে সব prognকাজ করে: এটা আপনি একটি একক sexp প্রদান করতে দেয় কখন মূল্যায়ন মূল্যায়ণ sexp args prognক্রমানুসারে। (if true (progn a b c))সঙ্গে তুলনা করুন (when true a b c)। উভয় ক্ষেত্রেই, a, b, এবং cক্রমানুসারে মূল্যায়ন করা হয়।
ড্র


4
আমি একমত নই যে ব্যবহারের 99% ক্ষেত্রে ম্যাক্রোস ইত্যাদি Any কোনও ফাংশন বা ম্যাক্রোprogn এমন একটি সেক্সপ পাস হতে পারে যা এর একাধিক সেক্সপ রয়েছে যা তাদের পার্শ্ব প্রতিক্রিয়াগুলির জন্য মূল্যায়ন করা হয়, এর মধ্যে শেষের ফলাফলটি ফেরার আগে। ম্যাক্রোগুলির সাথে এর আসলে কোনও সম্পর্ক নেই। ম্যাক্রোস "উদাহরণ হিসাবে" ঠিক আছে। prognআইএমও, ম্যাক্রোগুলির জন্য উপস্থিত থাকা এবং এটির 99% ব্যবহার ম্যাক্রোগুলির জন্য বিভ্রান্তিকর, এমন ধারণা প্রদান করা । মূল্যায়ন prognএকটি ক্রম একটি একক সেক্সপ (একটি প্রত্যাশিত যুক্তি মাপসই) ফিট করে, এবং এটি তাই পার্শ্ব প্রতিক্রিয়া সম্পর্কে ।
ড্রিউ

5
১. লিপ্পে ম্যাক্রোগুলি যুক্ত হওয়ার অনেক আগে ১৯২২ prognসালে লিস্প ১.৫ এ ( প্রোগ্রামটির বৈশিষ্ট্যটি বিভাগটি দেখুন ) চালু হয়েছিল । উদ্দেশ্যটি ক্রমান্বয়ে তাদের পার্শ্ব প্রতিক্রিয়াগুলির জন্য প্রকাশগুলি মূল্যায়ন করা। 2. দেখুন কিভাবে ইমাস নিজেরাই এলিসপ প্রোগ্রামারগুলিতে পরিচিত হয়। সাধারণ ব্যবহারের ক্ষেত্রে কোডটি দেখুন । prognprognzap-to-char
ড্রিউ

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

10

অগ্রগতির জন্য সর্বাধিক গুরুত্বপূর্ণ কারণটি পূর্ববর্তী ডকুমেন্টেশনের প্রথম লাইনে বর্ণিত হয়েছে (জোর দেওয়া হয়েছে):

প্রগন একটি বিশেষ ফর্ম যা এর প্রতিটি আর্গুমেন্টকে ক্রমানুসারে মূল্যায়িত করে এবং তারপরে শেষটির মান দেয়।

সংযোজন:

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

অন্তর্নির্মিত নিয়ন্ত্রণ কাঠামো বিশেষ ফর্ম কারণ তাদের সাবফর্মগুলি প্রয়োজনীয়ভাবে মূল্যায়ন করা হয় না বা ক্রমানুসারে মূল্যায়ন করা হয় না

কি progn বুস্ট কর্মক্ষমতা?

পার্সিং পারফরম্যান্স, না। কার্য সম্পাদন, না। সর্বোপরি এটি সমান হতে পারে তবে ম্যাজিকালি কখনই পারফরম্যান্স বাড়ায় না।

অগ্রগতি কখন ব্যবহৃত হয় ?

... বেশিরভাগ ক্ষেত্রেই অনিচ্ছাকৃত-সুরক্ষার ভিতরে , এবং, বা , বা যদি একটি আইএফ- এর পরে থাকে


আমি নিশ্চিত নই কেন এটি এত গুরুত্বপূর্ণ। ইমাস সর্বদা ক্রমানুসারে মূল্যায়ন করে।
লুনারিওর্ন

2
@ লুনারিয়র্ন আপডেট হওয়া উত্তরটি দেখুন।
ইমাক্স ব্যবহারকারী

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

আমি মনে করি আপনি যে এলিস্প ম্যানুয়াল নোডটি (elisp) Sequencingসংযুক্ত করেছেন এটি সব বলে says
তুলসী

10

prognপরিবারের সাথে তুলনা করে কী কী তা বোঝার একটি আরও ভাল উপায় : prog1এবং prog2। নামের nবা 1বা 2অংশটি সেই তালিকাটি থেকে বিবৃতিটির পক্ষে দাঁড়িয়েছে যার ফলস্বরূপ আপনি আগ্রহী। অন্য কথায়, prognএটিতে রয়েছে সর্বশেষ বিবৃতিটির ফলাফলটি ফিরিয়ে দেবে, যেখানে prog1প্রথমটি এবং একইরকম ফিরে আসবে prog2

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

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

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

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