তালিকাতে ভেরিয়েবলগুলি যুক্ত করার আগে কীভাবে মূল্যায়ন করবেন?


30

নীচের স্পষ্টতই কাজ করে না এবং তাই এই প্রশ্ন।

আমি নীচের কোডটি কীভাবে সংশোধন করব যাতে মানটি somelistহয় '(("abc" . 123))?

(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))

5
আপনি কি কোয়াসিকোটিং চেষ্টা করেছেন? ব্যবহার করে দেখুন `(,x . ,y)
ড্যান

আহ, এটাই আমি মিস করেছি। আমি গুগল করার জন্য জানতাম না :)। আমি চেষ্টা করেছি (add-to-list 'somelist '(,x . ,y))কিন্তু ব্যাককোয়টি ভুলে গেছি।
কুশল মোদী 21

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

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

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

উত্তর:


30

সাধারণ সমস্যাটি হ'ল আপনার দরকার হয় xএবং yএগুলি প্রবেশ করানোর আগে তাদের মূল্যায়ন করা উচিত somelist। সমস্যাটির উদ্ধৃত তালিকা (সঙ্গে 'যেমন পাঠক সিনট্যাক্স) যে quoteএকটি বিশেষ ফর্ম যে তার যুক্তি মূল্যায়ন না। দস্তাবেজ অনুসারে:

(quote ARG)

যুক্তিটি মূল্যায়ন না করেই ফিরিয়ে দিন। (quote x)ফলন x। সতর্কতা: quoteতার রিটার্ন মানটি তৈরি করে না, তবে কেবলমাত্র সেই মানটি ফিরিয়ে দেয় যা লিস্প পাঠক দ্বারা প্রাক-নির্মিত হয়েছিল ...

অতএব, আপনি হয় ব্যাককোটা বা আর্গুমেন্ট মূল্যায়ন একটি ফাংশন ব্যবহার করতে হবে।

ব্যাককোটিং আপনাকে ,বাক্য উদ্ধৃত তালিকার উপাদানগুলিকে সিন্টেক্স সহ নির্বাচিতভাবে মূল্যায়ন করতে দেয় :

(setq x "x-val" y "y-val" z "z-val" somelist nil)
'(x  y z)                            ; => (x y z)
`(x ,y z)                            ; => (x "y-val" z)
(add-to-list 'somelist `(x y ,z))    ; => ((x y "z-val"))

পর্যায়ক্রমে, আপনি ব্যবহার করতে পারেন cons(@ উত্তর হিসাবে উত্তর তারশী হিসাবে) বা, স্বেচ্ছাসেবী সংখ্যার জন্য list,:

(add-to-list 'somelist (cons x y))   ; => (("x-val" . "y-val"))
(setq somelist nil)                  ; reset
(add-to-list 'somelist (list x y z)) ; => (("x-val" "y-val" "z-val"))

কোনটি ব্যবহার করতে হবে তা উপাদানগুলির সাথে আপনার কী করা দরকার তার উপর নির্ভর করে।


19

কনস সেলটি উদ্ধৃত করবেন না, কারণ উদ্ধৃত প্রকাশগুলি মূল্যায়ন করা হয় না। ঠিক এই কারণেই একটি উদ্ধৃতি - মূল্যায়ন রোধ করতে। তবে আপনি যা চান তা তা নয়, তাই করবেন না।

পরিবর্তে দুটি ফর্ম যা তার মূল্য যুক্তি থেকে একটি কনস সেল তৈরি করে সেই ফর্মটি ব্যবহার করুন।

(cons x y)

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

কোয়াসিকোটিং ব্যবহার করে এটি দেখতে এরকম দেখাচ্ছে:

`(,x . ,y)

এটি আরও খারাপ কারণ এটি অতিরিক্ত সিনট্যাক্স ব্যবহার করে যা এক্ষেত্রে মোটেই প্রয়োজন হয় না এবং যেটি consব্যবহৃত হচ্ছে তা বিস্মৃত হয়।


3
consআইএনএন ভাল পয়েন্ট । কোয়াজিকোটিং আমাকে পাঠ্যতার চেয়ে তালিকার বিষয়বস্তুগুলিকে সূক্ষ্ম-নিয়ন্ত্রণযুক্ত নিয়ন্ত্রণ হিসাবে চিহ্নিত করে, তবে আমি সম্মত হই যে ব্যবহারের ক্ষেত্রে এটি কার্যকরভাবে তৈরি হয়েছে cons
ড্যান

আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। এটা আমার জন্য একটি দুর্দান্ত টিআইএল মুহূর্ত ছিল। আমি অন্ধভাবে তালিকা এবং কনস এর সামনে উদ্ধৃতি রাখছিলাম।
দক্ষ মোদী

@ ড্যান, ভাল হ্যাঁ - এবং না। Quasiquoting কিছু আপনার সাথে শুধু যেত না করতে পারবেন না cons, listএবং nconc। প্রিটিয়ার বাদে এটি সিনট্যাকটিক চিনি যা আপনার যখন "তালিকার সামগ্রীর সূক্ষ্ম কন্ট্রোল নিয়ন্ত্রণ" প্রয়োজন হিসাবে কার্যকর (যেমন "শুরুতে একটি পরমাণু বা তালিকা যুক্ত করার চেয়ে আরও জটিল কিছু করছেন") হিসাবে কার্যকর) এবং এই সিনট্যাকটিক চিনির ব্যবহারের অতিরিক্ত সুবিধা হ'ল: পঠনযোগ্যতা। কোয়াজিকোটিং আপনাকে অতিরিক্ত আরও সূক্ষ্ম-নিয়ন্ত্রণযুক্ত নিয়ন্ত্রণ দেয় না - এটি আপনাকে প্রাথমিক প্রচেষ্টাতে কম বাগ সহ একই জিনিসটি করার অনুমতি দেয়। :-)
তারসিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.