একটি প্রাথমিক পরিচিতি লিস্প বইয়ের প্রধান অংশগুলির মাধ্যমে এটি তৈরি করার পরেও আমি এখনও বুঝতে পারি না যে বিশেষ অপারেটর (quote)
(বা সমতুল্য '
) ফাংশনটি কী করে, তবুও এটি আমার দেখা লিস্প কোডের পুরোটা ছিল।
এটার কাজ কি?
একটি প্রাথমিক পরিচিতি লিস্প বইয়ের প্রধান অংশগুলির মাধ্যমে এটি তৈরি করার পরেও আমি এখনও বুঝতে পারি না যে বিশেষ অপারেটর (quote)
(বা সমতুল্য '
) ফাংশনটি কী করে, তবুও এটি আমার দেখা লিস্প কোডের পুরোটা ছিল।
এটার কাজ কি?
উত্তর:
সংক্ষিপ্ত উত্তর ডিফল্ট মূল্যায়নের নিয়মগুলিকে বাইপাস করুন এবং টাইপ করা ঠিক মতো ফাংশনটিতে প্রেরণ করে এক্সপ্রেশনটিকে (প্রতীক বা এস-এক্সপ্রেস) মূল্যায়ন করবেন না ।
দীর্ঘ উত্তর: ডিফল্ট মূল্যায়ন বিধি
যখন কোনও নিয়মিত (আমি পরে আসব) ফাংশনটি শুরু করা হয়, তখন এতে প্রেরিত সমস্ত যুক্তি মূল্যায়ন করা হয়। এর অর্থ আপনি এটি লিখতে পারেন:
(* (+ a 2)
3)
যা পরিবর্তে মূল্যায়ন (+ a 2)
করে a
এবং মূল্যায়ন করে ২. প্রতীকটির মান a
বর্তমান চলক বাইন্ডিং সেটটিতে দেখা হয় এবং তারপরে প্রতিস্থাপন করা হয়। বলুন a
বর্তমানে মান 3:
(let ((a 3))
(* (+ a 2)
3))
আমরা পেতে চাই (+ 3 2)
, তারপরে 3 এবং 2 ফলনকারী 5 এ আহ্বান জানানো হবে Our আমাদের আসল ফর্মটি এখন (* 5 3)
15 উপার্জন করছে।
quote
ইতিমধ্যে ব্যাখ্যা করুন !
ঠিক আছে. উপরে যেমনটি দেখা গেছে, কোনও ফাংশনের সমস্ত যুক্তি মূল্যায়ন করা হয়, সুতরাং আপনি যদি প্রতীকটি পাস করতে চান a
এবং এর মানটি না চান তবে আপনি এটি মূল্যায়ন করতে চান না। লিস্প প্রতীকগুলি তাদের মান হিসাবে দু'বার দ্বিগুণ করতে পারে এবং আপনি যেখানে অন্যান্য ভাষায় হ্যাশ টেবিলের কীগুলির মতো স্ট্রিং ব্যবহার করেছেন সেখানে চিহ্নিতকারীগুলি দ্বিগুণ করতে পারে।
এইটি যেখানে quote
আসে Say বলুন যে আপনি পাইথন অ্যাপ্লিকেশন থেকে সংস্থানগুলি বরাদ্দ করতে চান, বরং লিস্পে প্লটিং করুন। আপনার পাইথন অ্যাপ্লিকেশনটিকে এরকম কিছু করতে দিন:
print("'(")
while allocating:
if random.random() > 0.5:
print(f"(allocate {random.randint(0, 20)})")
else:
print(f"(free {random.randint(0, 20)})")
...
print(")")
আপনাকে এরূপ দেখায় আউটপুট দেওয়া (সামান্য সুন্দর করে তোলা):
'((allocate 3)
(allocate 7)
(free 14)
(allocate 19)
...)
quote
ডিফল্ট নিয়মটি প্রয়োগ না করার কারণে আমি ("টিক") কী বলেছিলাম তা মনে রাখবেন ? ভাল. অন্যথায় যা ঘটবে তা হ'ল মান allocate
এবংfree
তাকিয়ে হয়, এবং আমরা যে চাই না। আমাদের লিস্পে, আমরা এটি করতে ইচ্ছুক:
(dolist (entry allocation-log)
(case (first entry)
(allocate (plot-allocation (second entry)))
(free (plot-free (second entry)))))
উপরে দেওয়া তথ্যের জন্য, ফাংশন কলগুলির নিম্নলিখিত ক্রমটি তৈরি করা হত:
(plot-allocation 3)
(plot-allocation 7)
(plot-free 14)
(plot-allocation 19)
কিন্তু কি ব্যাপারে list
?
ভাল, কখনও কখনও আপনি যুক্তি মূল্যায়ন করতে চান। বলুন যে আপনি একটি নিফটি ফাংশনটি একটি সংখ্যা এবং একটি স্ট্রিং ম্যানিপুলেট করে এবং ফলস্বরূপ ... জিনিসগুলির একটি তালিকা ফিরিয়ে দেন। আসুন একটি ভ্রান্ত সূচনা করা যাক:
(defun mess-with (number string)
'(value-of-number (1+ number) something-with-string (length string)))
Lisp> (mess-with 20 "foo")
(VALUE-OF-NUMBER (1+ NUMBER) SOMETHING-WITH-STRING (LENGTH STRING))
হে! আমরা যা চেয়েছিলাম তা তা নয়। আমরা কিছু যুক্তি নির্বাচনীভাবে মূল্যায়ন করতে এবং অন্যকে প্রতীক হিসাবে রেখে যেতে চাই। # 2 চেষ্টা করুন!
(defun mess-with (number string)
(list 'value-of-number (1+ number) 'something-with-string (length string)))
Lisp> (mess-with 20 "foo")
(VALUE-OF-NUMBER 21 SOMETHING-WITH-STRING 3)
শুধুই না quote
, তবেbackquote
অনেক ভাল! ঘটনাচক্রে, এই প্যাটার্নটি (বেশিরভাগ) ম্যাক্রোগুলিতে এতটাই সাধারণ যে এটি করার জন্য বিশেষ বাক্য গঠন রয়েছে। ব্যাককোট:
(defun mess-with (number string)
`(value-of-number ,(1+ number) something-with-string ,(length string)))
এটি ব্যবহার করার মতো quote
, তবে কমা দিয়ে প্রিফিক্স করে কিছু যুক্তি সুস্পষ্টভাবে মূল্যায়নের বিকল্পের সাথে। ফলাফলটি ব্যবহারের সমতুল্য list
, তবে আপনি যদি ম্যাক্রো থেকে কোড তৈরি করে থাকেন তবে আপনি কেবলমাত্র ফিরে আসা কোডটির ছোট্ট অংশগুলি মূল্যায়ন করতে চান, সুতরাং ব্যাককোটিটি আরও উপযুক্ত। সংক্ষিপ্ত তালিকার জন্য, list
আরও পঠনযোগ্য হতে পারে।
আরে, আপনি সম্পর্কে ভুলে গেছেন quote
!
সুতরাং, এটি আমাদের ছেড়ে কোথায়? ওহ ঠিক আছে, quote
আসলে কি করে? এটি কেবল তার যুক্তি (গুলি) অবমূল্যায়ন করে! নিয়মিত কার্যাবলী সম্পর্কে আমি শুরুতে যা বলেছিলাম তা মনে আছে? আউট যে কিছু অপারেটার / ফাংশন প্রয়োজন সক্রিয় করতে না তাদের আর্গুমেন্ট নির্ণয় করা। যেমন আইএফ - আপনি অন্য শাখাটি যদি তা না নেওয়া হয় তবে তা মূল্যায়ন করা চাই না, তাই না? তথাকথিত বিশেষ অপারেটররা , ম্যাক্রোগুলির সাথে একসাথে কাজ করে। বিশেষ অপারেটররা হ'ল ভাষার "অ্যাক্সিয়াম" - ন্যূনতম ন্যূনতম সেট - যার উপর নির্ভর করে আপনি বিভিন্ন উপায়ে একত্রিত হয়ে বাকী লিস্প প্রয়োগ করতে পারেন।
ফিরে যান quote
, যদিও:
Lisp> (quote spiffy-symbol)
SPIFFY-SYMBOL
Lisp> 'spiffy-symbol ; ' is just a shorthand ("reader macro"), as shown above
SPIFFY-SYMBOL
এর সাথে তুলনা করুন (স্টিল-ব্যাংক কমন লিস্পে):
Lisp> spiffy-symbol
debugger invoked on a UNBOUND-VARIABLE in thread #<THREAD "initial thread" RUNNING {A69F6A9}>:
The variable SPIFFY-SYMBOL is unbound.
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(SB-INT:SIMPLE-EVAL-IN-LEXENV SPIFFY-SYMBOL #<NULL-LEXENV>)
0]
কারণ নেই spiffy-symbol
বর্তমানের সুযোগ নেই!
সাতরে যাও
quote
, backquote
(কমা সহ) এবং list
আপনি তালিকাগুলি তৈরির জন্য ব্যবহার করেন এমন কয়েকটি সরঞ্জাম যা কেবলমাত্র মানগুলির তালিকাগুলিই নয়, আপনি যেমন দেখেছেন তেমন হালকা ওজন হিসাবে ব্যবহার করা যেতে পারে (ক এর সংজ্ঞা দেওয়ার প্রয়োজন নেই struct
) ডেটা স্ট্রাকচার!
আপনি যদি আরও শিখতে চান তবে আমি ইতিমধ্যে বড় আকারের প্রোগ্রামিংয়ের ক্ষেত্রে লিস্প শেখার ব্যবহারিক পদ্ধতির জন্য পিটার সেবেলের বই প্রাকটিক্যাল কমন লিস্পের পরামর্শ দিচ্ছি । অবশেষে আপনার লিস্প যাত্রায় আপনি প্যাকেজগুলিও ব্যবহার শুরু করবেন। রন গ্যারেটের দ্য ইডিয়টস গাইড টু কমন লিস্প প্যাকেজগুলি আপনাকে সেগুলির ভাল ব্যাখ্যা দেবে।
শুভ হ্যাকিং!
this
, তারপর is
, তারপর true
, কিন্তু আপনি শুধুমাত্র ফিরে গত এক দেখুন। (এটি সত্য এবং সত্য পৃথক বিবৃতি)
এটি "আমাকে মূল্যায়ন করবেন না" বলে। উদাহরণস্বরূপ, আপনি কোড হিসাবে নয়, ডেটা হিসাবে একটি তালিকা ব্যবহার করতে চান, আপনি এটির সামনে একটি উক্তি রাখতে চাই। উদাহরণ স্বরূপ,
(print '(+ 3 4))
প্রিন্টগুলি "(+ 3 4)", যেখানে
(print (+ 3 4))
"7" প্রিন্ট করে
unquote
আদেশ আছে?
eval
: (print (eval '(+ 3 4)))
। এটিই লিসপ্সকে এত দুর্দান্ত করে তোলে: তালিকাগুলি কোডগুলি এবং কোডগুলি তালিকাভুক্ত হয়, সুতরাং একটি লিস্প প্রোগ্রাম নিজেই ম্যানিপুলেট করতে পারে।
অন্যান্য ব্যক্তিরা এই প্রশ্নের প্রশংসাসূচক উত্তর দিয়েছেন, এবং ম্যাথিয়াস বেনকার্ড একটি দুর্দান্ত সতর্কতা এনেছে।
আপনি তালিকা পরিবর্তন করতে পারেন যে তালিকা তৈরি করতে কোট ব্যবহার করবেন না। অনুমানটি সংকলককে উদ্ধৃত তালিকাগুলিকে ধ্রুবক হিসাবে গণ্য করতে দেয়। প্রায়শই, একটি সংকলক স্মৃতিতে তাদের জন্য একটি একক মান তৈরি করে এবং তারপরে ধ্রুবক উপস্থিত সমস্ত স্থান থেকে সেই একক মানটিকে উল্লেখ করে স্থিরদের অনুকূল করতে পারে। অন্য কথায়, এটি অবিচ্ছিন্ন গ্লোবাল ভেরিয়েবলের মতো ধ্রুবকটিকে আচরণ করতে পারে।
এটি সুস্পষ্ট সমস্যা তৈরি করতে পারে। আপনি যদি একটি ধ্রুবক পরিবর্তন করেন তবে এটি সম্পূর্ণরূপে সম্পর্কযুক্ত কোডে একই ধ্রুবকের অন্যান্য ব্যবহারগুলি খুব ভালভাবে সংশোধন করতে পারে। উদাহরণস্বরূপ, আপনি কিছু ফাংশনে কিছু পরিবর্তনশীলকে '(1 1) এর সাথে তুলনা করতে পারেন এবং সম্পূর্ণ আলাদা ফাংশনে' (1 1) দিয়ে একটি তালিকা শুরু করুন এবং তারপরে এতে আরও স্টাফ যুক্ত করুন। এই ফাংশনগুলি চালানোর পরে, আপনি দেখতে পাবেন যে প্রথম ফাংশনটি এখন আর জিনিসগুলির সাথে সঠিকভাবে মেলে না, কারণ এটি এখন পরিবর্তনশীলকে '(1 1 2 3 5 8 13) এর সাথে তুলনা করার চেষ্টা করছে, যা দ্বিতীয় ফাংশনটি ফিরে আসল। এই দুটি ফাংশন সম্পূর্ণরূপে সম্পর্কিত নয় তবে ধ্রুবকগুলির ব্যবহারের কারণে এগুলি একে অপরের উপর প্রভাব ফেলে। এমনকি ক্রেজিয়ার খারাপ প্রভাবগুলি ঘটতে পারে, পুরোপুরি স্বাভাবিক তালিকার মতো হঠাৎ অসীম লুপিং।
তুলনা করার মতো আপনার যখন ধ্রুবক তালিকার প্রয়োজন হয় তখন উদ্ধৃতিটি ব্যবহার করুন। আপনি যখন ফলাফলটি পরিবর্তন করবেন তখন তালিকাটি ব্যবহার করুন।
(list (+ 1 2))
বেশিরভাগ সময় ব্যবহার করা উচিত বলে মনে হচ্ছে । যদি তাই হয় তবে আপনি কীভাবে এই (+ 1 2)
জাতীয় উদাহরণের অভ্যন্তরের মূল্যায়ন রোধ করবেন ? কোন unquote
আদেশ আছে?
'((3))
, বা এর সমতুল্য '((+ 1 2))
? তাহলে আধুনিক, আপনি আরো ব্যবহার করতে হবে list
: (list (list '+ 1 2))
। অথবা আপনি যদি '(+ 1 2)
ঠিক এর সমতুল্য চান (list '+ 1 2)
। এবং মনে রাখবেন, আপনি যদি তালিকাটি সংশোধন না করে থাকেন তবে নির্দ্বিধায় উদ্ধৃতিটি ব্যবহার করুন: '(+ 1 2)
আপনি যদি কেবল এটির সাথে বা অন্য কিছুটির সাথে তুলনা করেন তবে কিছুই ভুল হবে না।
এই প্রশ্নের একটি উত্তর বলছে যে কোয়েট "তালিকার ডেটা স্ট্রাকচার তৈরি করে"। এটি বেশ সঠিক নয়। এর চেয়ে কোয়েট আরও মৌলিক। আসলে, কোট একটি তুচ্ছ অপারেটর: এর উদ্দেশ্য প্রতিরোধ করা সব সময়ে ঘটা থেকে কিছু। বিশেষত, এটি কিছুই তৈরি করে না।
(কোট এক্স) যা বলে তা হ'ল মূলত "কিছু করো না, শুধু আমাকে এক্স দাও।" এক্স এর (কোয়েট (এবিসি)) হিসাবে বা কোয়েট ফুও হিসাবে প্রতীক হিসাবে কোনও তালিকা থাকা উচিত নয়। এটি যে কোনও বস্তু হতে পারে। প্রকৃতপক্ষে (তালিকা 'কোয়েট কিছু-ওবিজেসিটি) উত্পাদিত তালিকার মূল্যায়নের ফলাফল সর্বদা কেবল কিছু-ওবিজেসিটি ফিরিয়ে দেবে, যা কিছু হোক না কেন।
এখন, যে কারণে (কোয়েট (এবিসি)) মনে হচ্ছে এটি এমন একটি তালিকা তৈরি করেছে যার উপাদানগুলি এ, বি, এবং সি, তা হল এই জাতীয় তালিকা সত্যই এটি ফিরে আসে; তবে কোয়েট ফর্মটি মূল্যায়ন করার সময়, তালিকাটি সাধারণত কোডটির প্রয়োগের পূর্বে লোডার বা পাঠক দ্বারা তৈরি হওয়া কিছু সময়ের জন্য (কোয়েট ফর্মের উপাদান হিসাবে!) অস্তিত্ব লাভ করে।
এর প্রায়শই প্রায়শই প্রায়শই নতুন বৌকে ঘুরে দেখার প্রবণতা হ'ল কোয়েট ফর্মে ফিরে আসা তালিকাটি পরিবর্তন করা খুব বুদ্ধিমানের কাজ নয়। কোটায় ফিরিয়ে দেওয়া ডেটা হ'ল সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে, কোডটি কার্যকর করা হচ্ছে এমন একটি অংশ হিসাবে বিবেচনা করা এবং তাই কেবলমাত্র পঠনযোগ্য হিসাবে বিবেচনা করা উচিত!
উক্তিটি কোনও ফর্মের সম্পাদন বা মূল্যায়ন বাধা দেয়, পরিবর্তে এটি ডেটাতে পরিণত করে। সাধারণভাবে আপনি ডেটা এটিকে পরিষ্কার করে চালিয়ে দিতে পারেন।
উদ্ধৃতি তালিকার ডাটা স্ট্রাকচার তৈরি করে, উদাহরণস্বরূপ, নিম্নলিখিতটি সমতুল্য:
(quote a)
'a
এটি তালিকা (বা গাছ) তৈরি করতেও ব্যবহার করা যেতে পারে:
(quote (1 2 3))
'(1 2 3)
প্রাক্পিকাল কমন লিস্পের ( যেমনটি অনলাইনে পড়ার জন্য উপলব্ধ) লিপ্পে একটি প্রাথমিক বই পেয়ে আপনি সম্ভবত সেরা ।
ইমাস লিস্পে:
কী উদ্ধৃত করা যেতে পারে?
তালিকা এবং প্রতীক।
কোনও সংখ্যার উদ্ধৃতি দিয়ে সংখ্যাটি নিজেই মূল্যায়ন করে:
'5
ঠিক তেমন 5
।
আপনি তালিকা উদ্ধৃতি যখন কি হবে?
উদাহরণ স্বরূপ:
'(one two)
মূল্যায়ন
(list 'one 'two)
যা মূল্যায়ন
(list (intern "one") (intern ("two")))
।
(intern "one")
"একটি" নামের একটি প্রতীক তৈরি করে এবং এটি একটি "কেন্দ্রীয়" হ্যাশ-মানচিত্রে সংরক্ষণ করে, তাই আপনি যে কোনও সময় বলবেন 'one
তখন নামের প্রতীকটি "one"
সেই কেন্দ্রীয় হ্যাশ-মানচিত্রে সন্ধান করা হবে।
তবে প্রতীক কী?
উদাহরণস্বরূপ, ওও-ভাষায় (জাভা / জাভাস্ক্রিপ্ট / পাইথন) একটি চিহ্ন একটি name
ক্ষেত্র রয়েছে এমন একটি বস্তুরূপে উপস্থাপিত হতে পারে , যা প্রতীকটির নামটির মতো"one"
উপরের , এবং ডেটা এবং / বা কোডটি এই বস্তুর সাথে যুক্ত হতে পারে।
সুতরাং পাইথনে একটি প্রতীক হিসাবে প্রয়োগ করা যেতে পারে:
class Symbol:
def __init__(self,name,code,value):
self.name=name
self.code=code
self.value=value
ইমাস লিস্পে উদাহরণস্বরূপ একটি চিহ্নের সাথে 1) ডেটা যুক্ত থাকতে পারে এবং (একই সাথে - একই প্রতীকের জন্য) 2) এর সাথে সম্পর্কিত কোড - প্রসঙ্গের উপর নির্ভর করে, ডেটা বা কোডটি কল হয়।
উদাহরণস্বরূপ, এলিস্পে:
(progn
(fset 'add '+ )
(set 'add 2)
(add add add)
)
মূল্যায়ন 4
।
কারণ (add add add)
হিসাবে মূল্যায়ন:
(add add add)
(+ add add)
(+ 2 add)
(+ 2 2)
4
সুতরাং, উদাহরণস্বরূপ, Symbol
উপরের পাইথনে আমরা যে ক্লাসটি সংজ্ঞায়িত করেছি তা ব্যবহার করে , এই add
এলিস্প-চিহ্নটি পাইথন হিসাবে লেখা যেতে পারেSymbol("add",(lambda x,y: x+y),2)
।
আমাকে আইআরসি #emacs প্রতীক এবং উদ্ধৃতি ব্যাখ্যা করার জন্য অনেক ধন্যবাদ।
আমরা যখন আর্গুমেন্টের মানটি পাস করার পরিবর্তে নিজেই একটি যুক্তি পাস করতে চাই তখন আমরা উদ্ধৃতিটি ব্যবহার করি। এটি বেশিরভাগ সি, প্রোগ্রামিং ল্যাঙ্গুয়েজে পাওয়া যায় না এমন তালিকা, জোড়া এবং পরমাণু ব্যবহারের সময় পাস করার পদ্ধতি সম্পর্কিত (বেশিরভাগ লোক সি প্রোগ্রামিং ব্যবহার করে প্রোগ্রামিং শুরু করে, তাই আমরা বিভ্রান্ত হয়ে পড়ে) এটি স্কিম প্রোগ্রামিং ল্যাঙ্গুয়েজে কোড যা লিস্পের উপভাষা এবং আমার ধারণা আপনি এই কোডটি বুঝতে পারবেন understand
(define atom? ; defining a procedure atom?
(lambda (x) ; which as one argument x
(and (not (null? x)) (not(pair? x) )))) ; checks if the argument is atom or not
(atom? '(a b c)) ; since it is a list it is false #f
সর্বশেষ লাইন (পরমাণু? 'এবিসি) অ্যাবিসি পাস করছে যেমন এটি পরীক্ষা করার পদ্ধতি হিসাবে এটি ছিল যে অ্যাবসি একটি পরমাণু কিনা তা যাচাই করা হয়, তবে আপনি যখন (অ্যাটম? এবিসি) পাস করেন তখন এটি আবকের মানটি পরীক্ষা করে এবং মানটি পাস করে এটা। যেহেতু, আমরা এটির কোনও মূল্য সরবরাহ করি নি
উক্তিটি তার যুক্তিগুলির অভ্যন্তরীণ উপস্থাপনা প্রদান করে। লাঙল দেওয়ার পরে কোটটি কী করে না তার অনেকগুলি ব্যাখ্যা , সেই সময় যখন লাইট-বাল্বটি চলেছিল। REPL যদি আমি ফটোগুলির নামগুলি UPPER-CASE এ রূপান্তর না করি তবে আমি সেগুলি উদ্ধৃত করেছিলাম।
So. সাধারণ লিস্প ফাংশনগুলি তাদের যুক্তিগুলিকে অভ্যন্তরীণ উপস্থাপনায় রূপান্তর করে, যুক্তিগুলি মূল্যায়ন করে এবং ফাংশনটি প্রয়োগ করে। উদ্ধৃতি তার যুক্তিগুলিকে অভ্যন্তরীণ উপস্থাপনে রূপান্তরিত করে এবং কেবল এটি ফিরিয়ে দেয়। প্রযুক্তিগতভাবে এই উক্তিটি সঠিকভাবে বলা সঠিক, "মূল্যায়ন করবেন না", তবে যখন আমি এটি কী হয়েছিল তা বোঝার চেষ্টা করছিলাম, যখন এটি কী করে না তা আমাকে হতাশার কারণ বলেছিল। আমার টোস্টার লিস্প ফাংশনগুলিও মূল্যায়ন করে না; তবে টোস্টার কী করে তা আপনি কীভাবে ব্যাখ্যা করবেন তা নয়।
অ্যানোটার সংক্ষিপ্ত উত্তর:
quote
এর অর্থ মূল্যায়ন না করেই, এবং ব্যাককোটি হল উদ্ধৃতি তবে পিছনের দরজা ছেড়ে দিন ।
একটি ভাল রেফারেন্স:
ইমাস লিস্প রেফারেন্স ম্যানুয়াল এটিকে খুব পরিষ্কার করে
9.3 উদ্ধৃতি
বিশেষ ফর্মের উদ্ধৃতিটি এটির মূল্যায়ন না করে লিখিত হিসাবে তার একক যুক্তি প্রদান করে। এটি কোনও প্রোগ্রামে ধ্রুবক চিহ্ন এবং তালিকাগুলি অন্তর্ভুক্ত করার একটি উপায় সরবরাহ করে যা স্ব-মূল্যায়নকারী বস্তু নয়। (সংখ্যা, স্ট্রিং এবং ভেক্টরগুলির মতো স্ব-মূল্যায়নকারী অবজেক্টের উদ্ধৃতি দেওয়ার প্রয়োজন হয় না))
বিশেষ ফর্ম: উদ্ধৃতি অবজেক্ট
This special form returns object, without evaluating it.
প্রোগ্রামগুলিতে কোটটি প্রায়শই ব্যবহৃত হয় বলে লিস্প এর জন্য একটি সুবিধাজনক পঠন বাক্য গঠন সরবরাহ করে। একটি অ্যাডাস্ট্রোফ চরিত্র ('' ') এর পরে লিস্প অবজেক্ট (রিড সিনট্যাক্সে) একটি তালিকায় প্রসারিত হয় যার প্রথম উপাদানটি উদ্ধৃতি, এবং যার দ্বিতীয় উপাদানটি বস্তু। সুতরাং, পঠিত সিনট্যাক্স 'x' (উদ্ধৃতি এক্স) এর একটি সংক্ষেপণ।
এখানে উদ্ধৃতি ব্যবহারের মত প্রকাশের কয়েকটি উদাহরণ রয়েছে:
(quote (+ 1 2))
⇒ (+ 1 2)
(quote foo)
⇒ foo
'foo
⇒ foo
''foo
⇒ (quote foo)
'(quote foo)
⇒ (quote foo)
9.4 ব্যাককোট
ব্যাককোট কনস্ট্রাক্টস আপনাকে একটি তালিকা উদ্ধৃত করার অনুমতি দেয়, তবে সেই তালিকার উপাদানগুলিকে বেছে বেছে মূল্যায়ন করে। সহজতম ক্ষেত্রে এটি বিশেষ ফর্মের উদ্ধৃতিটির সাথে সমান (পূর্ববর্তী বিভাগে বর্ণিত; উদ্ধৃতি দেখুন)। উদাহরণস্বরূপ, এই দুটি ফর্মগুলি অভিন্ন ফলাফল দেয়:
`(a list of (+ 2 3) elements)
⇒ (a list of (+ 2 3) elements)
'(a list of (+ 2 3) elements)
⇒ (a list of (+ 2 3) elements)
ব্যাককোয়টে আর্গুমেন্টের ভিতরে বিশেষ চিহ্নিতকারী ',' এমন মানকে নির্দেশ করে যা স্থির নয়। ইমাস লিস্প মূল্যায়নকারী ',' এর যুক্তিটি মূল্যায়ন করে এবং তালিকা কাঠামোতে মান রাখে:
`(a list of ,(+ 2 3) elements)
⇒ (a list of 5 elements)
তালিকা কাঠামোর গভীর স্তরে ',' সহ প্রতিস্থাপন অনুমোদিত। উদাহরণ স্বরূপ:
`(1 2 (3 ,(+ 4 5)))
⇒ (1 2 (3 9))
আপনি বিশেষ চিহ্নিতকারী ', @' ব্যবহার করে ফলাফলের তালিকায় মূল্যায়িত মানটিও বিভক্ত করতে পারেন। বিভক্ত তালিকার উপাদানগুলি ফলাফলের তালিকার অন্যান্য উপাদানগুলির মতো একই স্তরে উপাদান হয়ে যায়। '`' ব্যবহার না করে সমতুল্য কোডটি প্রায়শই অপঠনযোগ্য। এখানে কিছু উদাহরন:
(setq some-list '(2 3))
⇒ (2 3)
(cons 1 (append some-list '(4) some-list))
⇒ (1 2 3 4 2 3)
`(1 ,@some-list 4 ,@some-list)
⇒ (1 2 3 4 2 3)
Code is data and data is code. There is no clear distinction between them.
এটি কোনও ধ্রুপদী বিবৃতি যা কোনও লিসপ প্রোগ্রামার জানে।
আপনি যখন কোনও কোড উদ্ধৃত করেন, তখন সেই কোডটি ডেটা হবে।
1 ]=> '(+ 2 3 4)
;Value: (+ 2 3 4)
1 ]=> (+ 2 3 4)
;Value: 9
আপনি যখন একটি কোড উদ্ধৃত করেন, ফলাফলটি সেই কোডটি উপস্থাপন করে এমন ডেটা হবে। সুতরাং, যখন আপনি এমন ডেটা নিয়ে কাজ করতে চান যা কোনও প্রোগ্রাম উপস্থাপন করে আপনি সেই প্রোগ্রামটির উদ্ধৃতি দিন। এটি কেবলমাত্র তালিকার জন্য নয়, পারমাণবিক ভাবের জন্যও বৈধ valid
1 ]=> 'code
;Value: code
1 ]=> '10
;Value: 10
1 ]=> '"ok"
;Value: "ok"
1 ]=> code
;Unbound variable: code
ধরা যাক আপনি লিস্পে এম্বেড হওয়া একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি করতে চান - আপনি প্রোগ্রামগুলির সাথে কাজ করবেন যা স্কিমে (যেমন '(+ 2 3)
) উদ্ধৃত হয় এবং যা আপনার তৈরি করা ভাষায় কোড হিসাবে ব্যাখ্যা করা হয়, প্রোগ্রামগুলিকে একটি অর্থপূর্ণ ব্যাখ্যা দিয়ে by এই ক্ষেত্রে ডেটা রাখতে আপনার উদ্ধৃতি ব্যবহার করা উচিত, অন্যথায় এটি বাহ্যিক ভাষায় মূল্যায়ন করা হবে।