তীক্ষ্ণ উক্তি কখন ব্যবহার করা উচিত?


10

আমি অন্যান্য ব্যক্তির ইলিস্প কোডে তীক্ষ্ণ উক্তি ব্যবহার করা দেখছি এবং আমি সেগুলি নিজেই ব্যবহার করি তবে সেগুলি কখন উপযুক্ত এবং কখন নয় সে সম্পর্কে আমি সম্পূর্ণ পরিষ্কার নই।

ধারালো উক্তি ব্যবহার করা কখন উপযুক্ত এবং এর পরিবর্তে সাধারণ একক উদ্ধৃতি কখন ব্যবহার করা উচিত তা কি কেউ স্পষ্ট করে বলতে পারেন?


3
nb এই প্রশ্নের জন্য এখানে অনেকগুলি নকল আছে বা এসও
ফিল্স


1
আমি মনে করি না এটা সদৃশ যেটির: emacs.stackexchange.com/questions/3595 ব্যবহার সম্পর্কে হয় #', ল্যামডা (যেখানে উত্তর মূলত "কখনো না" হয়) সঙ্গে যেহেতু @ izkon প্রশ্নের ব্যবহারের বরং প্রযোজ্য #'চিহ্ন প্রয়োগ করা হয়েছিল।
স্টিফান

উত্তর:


12

#'শর্টহ্যান্ডের জন্য functionঠিক যেমন 'শর্টহ্যান্ড quote

আপনি যেখানেই বাইট-সংকলক বা দোভাষী বা একজন মানব পাঠকের কাছে নির্দেশ করতে চান সেখানে এটি ব্যবহার করতে পারেন যে তার যুক্তিটি কোনও ফাংশন হিসাবে প্রত্যাশিত (হিসাবে বিবেচিত হবে)।

অনেক প্রসঙ্গে প্রসঙ্গ নির্ধারণ করে যে আর্গুমেন্টটি কীভাবে আচরণ করা হয়, উদাহরণস্বরূপ, আপনি কেবল (বা ) ব্যবহার করার পরিবর্তে এটিকে (ব্যবহার quoteবা ') উদ্ধৃতি দিন । উদাহরণস্বরূপ, এমন একটি প্রসঙ্গে যেখানে একটি প্রতীক কেবল তার সম্পত্তির জন্য ব্যবহৃত হয় , অর্থাত্ এটি একটি ফাংশন হিসাবে ব্যবহৃত হয়, আপনি কেবলমাত্র চিহ্নটি পাস করতে পারেন (উদাহরণস্বরূপ এটি উদ্ধৃত করে বা ভেরিয়েবলটি পাস করার মাধ্যমে যার মান প্রতীক)।#'functionsymbol-function

তবে কখনও কখনও কোডটি পরিষ্কার হয় যদি আপনি এই #'জাতীয় প্রসঙ্গে ব্যবহার করেন। এমনকি যদি ইমাস-লিস্প নিজেই বুঝতে পারে যে প্রতীকটি এই জাতীয় প্রসঙ্গে একটি ফাংশন হিসাবে ব্যবহৃত হয়, তবে এটি কোডের একজন মানব পাঠকের পক্ষে এটি জোর দেওয়াতে সহায়তা করতে পারে।

অন্য কিছু 'লিস্পে, ল্যাম্বদা ফর্মগুলির চিকিত্সা যা কেবল উদ্ধৃত (সাথে ) বা অব্যক্ত হয় তাদের ব্যবহারের সাথে পৃথক হতে পারে function( #') ব্যবহার করে উদ্ধৃত করার সময় একটি ফাংশন অবস্থানে use তবে ইমাস লিস্পে নয়। এ গিয়ে Emacs পাতার মর্মর আপনাকে (ব্যবহার হয় উদ্ধৃত করার প্রয়োজন নেই 'বা #') একটি ল্যামডা ফর্ম যে আপনি একটি ফাংশন হিসাবে গণ্য চান (এবং কেবল একটি তালিকা হিসাবে)। আপনি যদি চান যে এটি কেবল একটি তালিকা, কার lambdaইত্যাদি সহ পরিচালনা করে , তবে এটিকে উদ্ধৃত করুন (সহ ') - নীচের উদাহরণটি এটি চিত্রিত করে।

(এলিস্প) থেকে নামহীন ফাংশন :

- বিশেষ ফর্ম: function function-object

এই বিশেষ ফর্মটি FUNCTION-OBJECTমূল্যায়ন না করেই ফিরে আসে ।

এটিতে এটি quote(* নোট উদ্ধৃতি: :) এর মতো। তবে বিপরীতে quote, এটি ইমাক্স মূল্যায়নকারী এবং বাইট-সংকলককে FUNCTION-OBJECTএকটি ফাংশন হিসাবে ব্যবহার করার উদ্দেশ্যে তৈরি হিসাবে একটি নোট হিসাবে কাজ করে। ধরে FUNCTION-OBJECTনেওয়া একটি বৈধ ল্যাম্বডা এক্সপ্রেশন, এর দুটি প্রভাব রয়েছে:

• কোডটি বাইট-সংকলিত হয়ে গেলে, FUNCTION-OBJECTবাইট-কোড ফাংশন অবজেক্টে সংকলিত হয় (* নোট বাইট সংকলন: :)।

Le যখন লেজিকাল বাঁধাই সক্ষম হয়, তখন FUNCTION-OBJECTএকটি বন্ধে রূপান্তরিত হয়। * নোট বন্ধ করুন ::।

পঠন সিনট্যাক্সটি ব্যবহারের #'জন্য একটি স্বল্প হাত function। নিম্নলিখিত ফর্মগুলি সমস্ত সমতুল্য:

(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))

নিম্নলিখিত উদাহরণে, আমরা একটি change-propertyফাংশনটিকে সংজ্ঞায়িত করি যা একটি ফাংশনকে এর তৃতীয় আর্গুমেন্ট হিসাবে গ্রহণ করে, এর পরে একটি double-property ফাংশন যা change-propertyএটি একটি বেনাম ফাংশন পাস করে ব্যবহার করে:

(defun change-property (symbol prop function)
   (let ((value (get symbol prop)))
     (put symbol prop (funcall function value))))

(defun double-property (symbol prop)
   (change-property symbol prop (lambda (x) (* 2 x))))

মনে রাখবেন যে আমরা lambdaফর্মটি উদ্ধৃত করি না ।

আপনি যদি উপরের কোডটি সংকলন করেন তবে বেনামে ফাংশনটিও সংকলিত হয়। এটি হবে না যদি, বলুন আপনি বেনামে ফাংশনটি তালিকা হিসাবে উদ্ধৃত করে নির্মাণ করেছেন:

(defun double-property (symbol prop)
   (change-property symbol prop '(lambda (x) (* 2 x))))

সেক্ষেত্রে, বেনামে ফাংশন সংকলিত কোডে ল্যাম্বডা এক্সপ্রেশন হিসাবে রাখা হয়। বাইট-সংকলকটি এই তালিকাটিকে একটি দেখতে দেখতে একটি ফাংশন বলে ধরে নিতে পারে না, যেহেতু এটি জানে না যে change-propertyএটি কোনও ফাংশন হিসাবে ব্যবহার করতে চায়।


9

#'(ওরফে function) সামনে ব্যবহার করা যেতে পারে (lambda ...)তবে এটি অনর্থক, সুতরাং যেখানে এটি সত্যই অর্থবহ একমাত্র জায়গাটি প্রতীকের সামনে যেমন রয়েছে #'car। ইলিস্পে #'carএবং 'carপ্রায় সম্পূর্ণ সমতুল্য, সুতরাং মূল উদ্দেশ্যগুলির মধ্যে একটি হ'ল উদ্দেশ্যটি ডকুমেন্ট করা (অর্থাত্ এই কোডটি যে পড়বে তাকে বোঝানো যে আপনি এই চিহ্নটিকে একটি ফাংশন হিসাবে ব্যবহার করতে চান)। তবুও কয়েকটি পরিস্থিতি রয়েছে, যেখানে পার্থক্যটি আরও তাত্পর্যপূর্ণ:

  • বাইট-সংকলক এই নথিভুক্ত অভিপ্রায়টির সুবিধা গ্রহণ করে এবং আপনি #'carএটি লেখার সময় এটি carকোনও ফাংশন হিসাবে উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখবে এবং এটি যদি এটি খুঁজে না পায় তবে এটি একটি সতর্কতা নির্গত করবে, ঠিক যেমন আপনার যদি সেই ফাংশনে কোনও কল থাকে if ।
  • ভিতরে cl-fletএবং cl-labels, কেবল #'fস্থানীয়ভাবে সংজ্ঞায়িত ফাংশনটি উল্লেখ করতে পারে f, কারণ 'fএখনও বিশ্বব্যাপী প্রতীক f(এবং যে কোনও ফাংশন তার symbol-functionস্লটে সংরক্ষিত থাকতে পারে ) উল্লেখ করবে। যেমন

    (cl-flet ((car (x y) (+ x y)))
      (list #'car 'car))
    =>
    ((closure nil (x y) (+ x y)) car)
    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.