যখন একটি ল্যাম্বডা এক্সপ্রেশন তীক্ষ্ণ-উদ্ধৃতি?


30

প্রশ্ন: তখন যদি কখনও, এটি দরকারী একটি ধারালো-উদ্ধৃত lambda, এবং যখন, যদি কখনও, আমরা উচিত না একটি ধারালো-উদ্ধৃত lambda?

লোকেরা lambdaতিনটি উপায়ে ব্যবহার করে:

  1. প্লেইন: (lambda (x) x)
  2. উদ্ধৃত: '(lambda (x) x)
  3. ধারালো-উদ্ধৃত: #'(lambda (x) x)

এই এসও থ্রেডটি তিন ধরণের আলোচনা করে, এই এসও থ্রেডটি কেন ব্যাখ্যা করবেন না তা বোঝায় (এনবি: শার্প-কোট নয় ) lambdaগুলি, এবং এই এসও থ্রেডটি উদ্ধৃতি এবং তীক্ষ্ণ-উদ্ধৃতিগুলির মধ্যে পার্থক্যগুলিও আলোচনা করে।

এখন, বেনামী ফাংশন উপর ম্যানুয়াল নোড এবং জন্য docstring lambdaদয়া করে মনে রাখবেন lambdaগুলি স্ব-উদ্ধৃত হল:

ফর্মটির একটি কল (lambda ARGS DOCSTRING INTERACTIVE BODY)স্ব-উদ্ধৃতি; ল্যাম্বডা এক্সপ্রেশন মূল্যায়নের ফলাফল হ'ল প্রকাশ expression ল্যাম্বদা এক্সপ্রেশনটি তখন একটি ফাংশন হিসাবে বিবেচিত হবে ...

সুতরাং, এটি প্রদর্শিত হয় (lambda (x) x)এবং #'(lambda (x) x)সমতুল্য, তবে '(lambda (x) x)তা নয় (সর্বাধিক গুরুত্বপূর্ণভাবে, যখন বাইট-সংকলন করা হয়)।

দেখে মনে হচ্ছে কেউ কদাচিৎ একটি উদ্ধৃতি দিতে চাইবে lambda, তবে এটি আমার কাছে অস্পষ্ট যখন কখন, আমাদের উচিত, না করা উচিত, তীক্ষ্ণ-উদ্ধৃতি:

  • তীক্ষ্ণ-উদ্ধৃতি কি lambdaকেবল একটি স্টাইলিস্টিক পছন্দ, বা এমন পরিস্থিতিতে আছে যেখানে ধারালো-উদ্ধৃতি আসলে কার্যকর?
  • এমন পরিস্থিতি রয়েছে যেখানে আমাদের অবশ্যই তীক্ষ্ণ উক্তি করা উচিত নয়lambda , অর্থাৎ এমনটি করার পরে কোডটির অর্থটি পরিবর্তিত হবে?

উত্তর:


28

একসময় , ল্যাম্বডাসের জন্য তীক্ষ্ণ উক্তিটি প্রয়োজনীয় ছিল, এখন আর সেই পরিস্থিতি নেই।

সুতরাং, এটি উপস্থিত হয় যে (ল্যাম্বদা (এক্স) এক্স) এবং # '(ল্যাম্বদা (এক্স) এক্স) সমান, তবে' (ল্যাম্বদা (এক্স) এক্স) নয় (সর্বাধিক গুরুত্বপূর্ণভাবে, বাইট-সংকলন করার সময়)।

হ্যাঁ। আসলে, মূল্যায়ন করার সময় প্রথম দুটি সম্পূর্ণ অভিন্ন completely আপনি লিখিত ম্যানুয়াল পৃষ্ঠাতে বর্ণিত হিসাবে :

নিম্নলিখিত ফর্মগুলি সমস্ত সমতুল্য:

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

দুই দশক আগে থেকে ইমাস সংস্করণগুলিকে সমর্থন করার চেষ্টা করা ছাড়াও, কোনও ল্যাম্বডাকে তীক্ষ্ণ উদ্ধৃতি দেওয়ার কোনও কারণ নেই।

তাই না।


পার্শ্ববর্তী হিসাবে:

  • একটি ল্যাম্বডা (এর সাথে ') শক্ত উদ্ধৃতি দিয়ে কোনও পার্থক্য আসে, এটি বাইট সংকলন প্রতিরোধ করে। আমি এমন কোন দৃশ্যের কথা ভাবতে পারি না যেখানে এটি দরকারী, তবে কে জানে।

  • ব্যাকটিক একমাত্র উদ্ধৃতি যা ল্যাম্বডাসের সাথে খাঁটিভাবে দরকারী, তবে কেবল যদি আপনি কোনও কারণে লেজিকাল বাইন্ডিং ব্যবহার না করেন।


ম্যানুয়ালটির বেনামি ফাংশন বিভাগে একটি লিঙ্ক যুক্ত করার বিষয়ে বিবেচনা করুন যা বাইট সংকলনে উদ্ধৃতি প্রদানের প্রভাব ব্যাখ্যা করার একটি উদাহরণ রয়েছে।
কনস্টান্টাইন

@ কনস্ট্যান্টাইন সম্পন্ন আমি অলস কারণ পেয়েছি যে আমি একটি ফোনে আছি এবং ওপি ইতিমধ্যে যেভাবেই এটি লিঙ্ক করেছে।
মালাবারবা

লেক্সিকাল বাইন্ডিং এবং ব্যাকটিক ব্যবহার না করার বিষয়ে আপনার অর্থ কি আপনি স্পষ্ট করতে পারেন? ধন্যবাদ।
coredump

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

বিটিডাব্লু, আমি মনে করি না "একবারে" সত্যিই প্রযোজ্য: আমি যখন এই বিষয়টিকে পুনর্বিবেচনার ইতিহাসে তদন্ত করেছি, তখন আমি দেখতে পেলাম যে lambdaম্যাক্রো হিসাবে সংজ্ঞায়িত করা হয়েছে যা functionআমি যেতে পারার পিছনে যুক্ত করেছিলাম। আইডাব্লু যদি #'কোনও পর্যায়ে প্রয়োজন হয়, এটি খুব প্রাথমিক বিকাশ কোড ছিল। এটি নিশ্চিত হয়ে গেছে যে ইতিমধ্যে Emacs-18 এ প্রয়োজন ছিল না।
স্টেফান

5

যেহেতু lambdaএটি উদ্ধৃত হয়নি তখন কোনও অর্থবোধ করে না, তাই ইম্যাকস লিস্পের সাম্প্রতিক সংস্করণগুলি (এএনএসআই) অব্যক্ত (lambda...)হিসাবে ব্যাখ্যা করার জন্য কমন লিস্প অনুসরণ করে #'(lambda...)। দুটি স্বরলিপি প্রায় একই সমতুল্য (উদ্ধৃত কাঠামোর বাইরে)।

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


এটি এলিজপ ম্যানুয়ালটির বিরোধিতা করে: "ইমাস লিস্পে, এই জাতীয় তালিকা একটি বৈধ এক্সপ্রেশন যা কোনও ফাংশন অবজেক্টকে মূল্যায়ন করে।"
djechlin

8
"সাম্প্রতিক সংস্করণগুলি" যেমন "1990 বা তার পরে প্রকাশিত সংস্করণগুলি" ;-)
স্টিফান

0

কিছু অতিরিক্ত ইতিহাস যোগ করা, দেখার কারণে # '(ল্যাম্বদা ...) historicalতিহাসিক উত্তরাধিকার?

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=4290 পরামর্শ দেয় যে:

ইমাসস 22 দিয়ে শুরু করে, কোনও lambdaফর্ম যখন এটি ফাংশন হিসাবে ব্যবহৃত হয় তখন বাইটায়-সংকলন করা হয়, এর আগে functionবা আগে তা নির্বিশেষে #'। 22 এর আগে ইমাস সংস্করণগুলি সহ, আপনাকে অবশ্যই স্পষ্টভাবে ব্যবহার করতে হবে #' বা functionআপনি যদি ফর্মটি বাইট-সংকলিত করতে চান।

আমি বাইট-সংকলক সম্পর্কে জানি না, তবে আমি দেখতে পাব যে 1993 সালের মতো lambdaম্যাক্রো নিজেই একটি (function (lambda ...))ফর্ম ফিরিয়ে দিয়েছে ।

https://www.iro.umontreal.ca/~monnier/hopl-4-emacs-lisp.pdf আরও বলেছে:

মজার কথা (ম্যাকলিস্পের বিপরীতে), lambda১৯৯১ সাল নাগাদ ইম্যাকস -১৯-এর বিকাশের সময় ম্যাক্রো হিসাবে যুক্ত হওয়ার পরে প্রযুক্তিগতভাবে এলিস্প ভাষার অংশ ছিল না। Emacs-18 এ, বেনামে ফাংশনগুলি ফর্মের উদ্ধৃত মান হিসাবে লেখা হয়েছিল:

'(lambda (..ARGS..) ..BODY..)

যদিও lambdaম্যাক্রো প্রায় 30 বছর ধরে এই উদ্ধৃতিটিকে অপ্রয়োজনীয় করে তুলেছে, এই অনুশীলনের অনেকগুলি উদাহরণ এখনও এলিসপ কোডে দেখা যায়, যদিও এটি শরীরের বাইট-সংকলন প্রতিরোধ করে। কিছুটা সম্পর্কিতভাবে, শুধুমাত্র 1993 সালে লুসিড এম্যাকস 19.8 ম্যাকলিস্প থেকে #'...পাঠক শর্টহ্যান্ড আমদানি করেছিল (function ...)। ইমাকরা পরের বছর অনুসরণ করেছিল।


0

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

;; -*- lexical-binding:t -*-
(let ((my-variable "Random old"))
  (funcall `(lambda()
             (let ((my-variable "Random"))
               (message ,my-variable)))))

M-x [RET] eval-buffer "র্যান্ডম পুরানো" ফলাফল

;; -*- lexical-binding:t -*-
(let ((my-variable "Random old"))
  (funcall (lambda()
             (let ((my-variable "Random"))
               (message my-variable)))))

M-x [RET] eval-buffer আউটপুটস "র্যান্ডম"

গ্লোবাল ভেরিয়েবল এবং ভেরিয়েবলের স্থানীয় ভেরিয়েবলের সংমিশ্রণের তৃতীয় উদাহরণ

;; -*- lexical-binding:t -*-
(let ((my-variable "Random old"))
  (funcall `(lambda()
              (let ((my-variable "Random"))
                (message my-variable)
                (message ,my-variable)))))

M-x [RET] eval-buffer "এলোমেলো" "র্যান্ডম পুরানো" আউটপুটস


@ এনপোস্টাভগুলি যে আমার উদাহরণের সাথে বিন্দু ছিল না তবে সেই খারাপ অভ্যাসটি এড়াতে আমি আমার উদাহরণটিও সংশোধন করেছি
সিওহানসন

আরও ভাল, যদিও আমি এখনও নিশ্চিত নই যে এটি কেবল অভ্যন্তরীণ বাইন্ডিংয়ের জন্য আলাদা নাম চয়ন করার চেয়ে উন্নতি।
npostavs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.