পুশ এবং অ্যাড-টু-লিস্টের মধ্যে পার্থক্য কী?


28

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


1
আমি কোড ব্যবহার add-to-listকরে কোড ব্যবহার করে কোড রূপান্তর করার জন্য সংগ্রাম করে cl-pushnewযাচ্ছিলাম এবং এই ব্লগ পোস্টটি বেশ আলোকপাতকারী বলে খুঁজে পেয়েছি: yoo2080.wordpress.com/2013/09/11/…
ডাংম

উত্তর:


22

# জ্যাক যা উল্লেখ করেছে তা হ'ল একটি পার্থক্য। তবে যদি এটিই কেবল তফাত ছিল তবে আপনি সম্পর্কে cl-pushnewএবং জিজ্ঞাসা করতে পারেন add-to-list

আর একটি গুরুত্বপূর্ণ পার্থক্য: add-to-listএকটি ফাংশন, যার অর্থ এটি এর সমস্ত যুক্তি বিশেষত প্রথমটি মূল্যায়ন করে। pushএটি একটি ম্যাক্রো (যেমনটি cl-pushnew) - এটি তার দ্বিতীয় যুক্তিকে মূল্যায়ন করে না; পরিবর্তে, এটি এটিকে একটি সাধারণ স্থান হিসাবে ব্যাখ্যা করে।

উদাহরণস্বরূপ, দ্বিতীয় আর্গুমেন্টটি যদি একটি প্রতীক হয় তবে এটি একটি পরিবর্তনশীল হিসাবে বিবেচিত হবে এবং প্রথম আর্গুমেন্টের মানটি একটি ভেরিয়েবল হিসাবে প্রতীকটির মানকে সংযুক্ত করা হয় এবং ভেরিয়েবলটি নতুন কনসকে সেট করা হয়।

যেমন ডক স্ট্রিং add-to-listবলেছেন:

This is handy to add some elements to configuration variables,
but please do not abuse it in Elisp code, where you are usually
better off using `push' or `cl-pushnew'.

6
বাইট-সংকলক অনুসারে:add-to-list can't use lexical var ...; use push or cl-pushnew
মালবারবা

(push (5 6) my-list)তবুও আমাকে ত্রুটি দেয় - 5এটি কোনও ফাংশন নয়। add-to-listএটির আচরণের চেয়ে কীভাবে আলাদা ?
মার্কাসোফটওয়্যার

@মার্কাসফটওয়্যার: আপনি কী করার চেষ্টা করছেন? আপনি যদি তালিকায় (5 6)স্থানটি ধাক্কা দিতে চান (ভেরিয়েবলের মান) my-listতবে আপনার তালিকা তৈরি করতে হবে (5 6)। এটি করার একটি উপায় হ'ল ব্যবহার করা '(5 6); অন্যটি হ'ল ব্যবহার করা (list 5 6)pushযুক্তি মূল্যায়ন।
ড্র হয়েছে

@ আপনি এখনই বলেছেন যে এটি যুক্তির মূল্যায়ন করে তবে আপনার উত্তরটি আক্ষরিকভাবে বলেছে "এটি এর প্রথম যুক্তির মূল্যায়ন করে না", যা আমার বিভ্রান্তির উত্স।
মার্কাসফল্টওয়্যার

@মার্কাসফটওয়্যার: আমি দুঃখিত; আমার একটি টাইপ ছিল - আমি "প্রথম যুক্তি" লিখেছিলাম যেখানে আমার "দ্বিতীয় যুক্তি" লেখা উচিত ছিল। এখনই সংশোধন করা হয়েছে - ধন্যবাদ। দ্বিতীয় আরগটি pushএমন একটি স্থান যেমন ভেরিয়েবল। প্রথম আরগটি মূল্যায়ন করা হয়, সেই ভেরিয়েবলের মানকে কেন্দ্র করে এবং ভেরিয়েবলটি নতুন কনসকে সেট করা হয়। add-to-listভেরিয়েবলটি উত্পাদন করতে তার প্রথম আরগের মূল্যায়ন করে যার মান আপডেট হয়। pushএটির দ্বিতীয় আর্গটি মূল্যায়ন করে না, যা আপডেটের ক্ষেত্রে পরিবর্তনশীল। আরগ অর্ডার দুটির মধ্যে বিপরীত হয়।
ড্র

15

থেকে এ গিয়ে Emacs ডকুমেন্টেশন , অথবা C-h f push:

ম্যাক্রো: পুস্তকের তালিকার নাম

এই ম্যাক্রো একটি নতুন তালিকা তৈরি করে যার গাড়ী উপাদান এবং যার সিডিআর তালিকা নাম দ্বারা নির্দিষ্ট করা তালিকা, এবং সেই তালিকাটি তালিকাতে সংরক্ষণ করে।

একই পৃষ্ঠা থেকে, বা C-h f add-to-list:

ফাংশন: অ্যাড-টু-লিস্টের প্রতীক উপাদান এবং alচ্ছিক সংযোজন-এফএন

যদি উপাদানটি ইতিমধ্যে সেই মানটির সদস্য না হয় তবে এই ফাংশনটি পুরানো মানটিতে উপাদানটি ধারণ করে পরিবর্তনশীল প্রতীক সেট করে।

সুতরাং add-to-listকেবলমাত্র পুশ করে যদি উপাদানটি ইতিমধ্যে না থাকে।


cl-pushnewমত আচরণ করে add-to-list
সাম বুসালিস

15

আর একটি পার্থক্য:

pushযোগ করা উপাদান শুরুতে তালিকা

add-to-listআপনি যোগ করতে পারেন উপাদান পারেন শুরুতে বা শেষে তালিকা

(setq testasdf nil)

(push 'a testasdf)

testasdf
(a)

(add-to-list 'testasdf 'b)

testasdf
(b a)

;; add element to the end
(add-to-list 'testasdf "hello" t)

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