ক্লোজারের "চিহ্নগুলি" ছাড়াও কেন "কীওয়ার্ড" রয়েছে?


130

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

অন্যান্য লিপসের কীওয়ার্ড রয়েছে? কীওয়ার্ডগুলি আলাদা আলাদা স্বরলিপি (অর্থাত্: কলোন) ব্যতীত চিহ্নগুলির চেয়ে আলাদা কীভাবে?


উত্তর:


139

কীওয়ার্ড এবং প্রতীকগুলির জন্য ক্লোজার ডকুমেন্টেশন এখানে Here

কীওয়ার্ডগুলি প্রতীকী শনাক্তকারী যা নিজেরাই মূল্যায়ন করে। তারা খুব দ্রুত সাম্যতা পরীক্ষা প্রদান করে ...

প্রতীকগুলি শনাক্তকারী যা সাধারণত অন্য কোনও কিছু উল্লেখ করতে ব্যবহৃত হয়। এগুলি ফাংশন পরামিতিগুলি উল্লেখ করার জন্য, বাইন্ডিংগুলি, শ্রেণীর নামগুলি এবং বিশ্বব্যাপী ভার্সগুলি ব্যবহার করার জন্য প্রোগ্রাম আকারে ব্যবহার করা যেতে পারে ...

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

পার্থক্য দেখতে করার সবচেয়ে সহজ উপায় পড়া Keyword.javaএবং Symbol.javaClojure উৎস হবে। বাস্তবের কয়েকটি বাস্তব পার্থক্য রয়েছে। উদাহরণস্বরূপ ক্লোজারের একটি চিহ্নের মেটাডেটা থাকতে পারে এবং একটি কীওয়ার্ড থাকতে পারে না।

একক-কোলন সিনট্যাক্স ছাড়াও, আপনি একটি নেমস্পেস-যোগ্য কীওয়ার্ড তৈরি করতে ডাবল-কোলন ব্যবহার করতে পারেন।

user> :foo
:foo
user> ::foo
:user/foo

কমন লিস্পের মূল শব্দ রয়েছে, যেমন রুবি এবং অন্যান্য ভাষাগুলি। অবশ্যই সেই ভাষাগুলিতে কিছুটা আলাদা। সাধারণ লিস্প কীওয়ার্ড এবং ক্লোজার কিওয়ার্ডগুলির মধ্যে কিছু পার্থক্য:

  1. ক্লোজারে কীওয়ার্ডগুলি প্রতীক নয়।

    user> (symbol? :foo)  
    false
  2. কীওয়ার্ডগুলি কোনও নির্দিষ্ট জায়গার সাথে সম্পর্কিত নয় যদি আপনি তাদের নির্দিষ্টভাবে যোগ্য করে না:

    user> (namespace :foo)
    nil
    user> (namespace ::foo)
    "user"

( রাইনার জোসভিগ ধন্যবাদ আমাকে দেখার বিষয় সম্পর্কে ধারণা দেওয়ার জন্য।)


10
এটি ব্যাখ্যা করে যে পার্থক্যগুলি কী, তবে কেন নয় দুটি পৃথক কনস্ট্রাক্টের প্রয়োজন। ক্লোজার কীওয়ার্ড এবং সিম্বল উভয়ের ক্ষমতার মিলনের সাথে কিছু তৈরি করতে পারত না?

25
কীওয়ার্ডগুলি লাইটওয়েট এবং একটি সুবিধাজনক বাক্য গঠন রয়েছে, আমার মনে হয় এটি প্রায় যা আছে। ভাষাগুলি এগুলি ব্যতীত দুর্দান্ত কাজ করবে তবে তারা ভাল লাগবে এবং সেগুলি ব্যাপকভাবে ব্যবহৃত হয়। আপনার দক্ষতার একটি ইউনিয়ন আপনি রাখতে পারবেন না কারণ কীওয়ার্ডগুলি সর্বদা স্ব-মূল্যায়ন হয় (যেমন আপনি এগুলি পরিবর্তনশীল বা ফাংশন নাম হিসাবে ব্যবহার করতে পারবেন না) এবং সাধারণভাবে প্রতীকগুলি সর্বদা স্ব-মূল্যায়ন করতে পারে না।
ব্রায়ান কার্পার

1
দেখে মনে হচ্ছে কীওয়ার্ডগুলি হ্যাশম্যাপস ইত্যাদির চাবি হিসাবে বেশি কার্যকর কারণ সেগুলি একবার মূল্যায়ন না করে পরিবর্তিত হয়: (eval (eval ':a))বনাম (eval (eval ''a))। অন্যান্য সুবিধা আছে? পারফরম্যান্স অনুযায়ী তারা কি অভিন্ন?
ক্রিস্টিয়ানালম

5
(অভিন্ন?: Qwe: qwe) -> সত্য। (অভিন্ন? 'কিউই' কিউও) -> মিথ্যা। প্রতীকগুলি ভিতরে অভ্যন্তরীণ স্ট্রিং ব্যবহার করে, তাই তুলনাটিও খুব দ্রুত।
দেশসুডু

29

কমন লিস্পে মূলশব্দ চিহ্ন রয়েছে।

কীওয়ার্ডগুলিও প্রতীক।

(symbolp ':foo) -> T

কীওয়ার্ডগুলি বিশেষ করে তোলে:

  • : foo প্রতীক কীওয়ার্ড হিসাবে সাধারণ লিস্প পাঠক দ্বারা পার্স করা হয়েছে :: foo
  • কীওয়ার্ডগুলি তাদের কাছে মূল্যায়ন করে:: foo ->: foo
  • কীওয়ার্ড প্রতীকগুলির হোম প্যাকেজটি কীওয়ার্ড প্যাকেজ: কীওয়ার্ড: foo ->: foo
  • কীওয়ার্ড প্যাকেজ থেকে কীওয়ার্ডগুলি রফতানি করা হয়
  • কীওয়ার্ডগুলি ধ্রুবক, এটি আলাদা মান নির্ধারণের অনুমতি দেয় না

অন্যথায় কীওয়ার্ডগুলি সাধারণ প্রতীক। সুতরাং কীওয়ার্ডগুলি ফাংশনের নাম রাখতে পারে বা সম্পত্তি তালিকাগুলি রাখতে পারে।

মনে রাখবেন: সাধারণ লিস্পে প্রতীকগুলি একটি প্যাকেজের অন্তর্ভুক্ত। এটি এই হিসাবে লেখা যেতে পারে:

  • foo, যখন বর্তমান প্যাকেজে প্রতীক অ্যাক্সেসযোগ্য
  • foo: বার, যখন প্রতীক FOO প্যাকেজ বার থেকে রফতানি হয়
  • foo :: বার, যখন প্রতীক FOO প্যাকেজ বারে থাকে

কীওয়ার্ড প্রতীকগুলির জন্য এর অর্থ হ'ল: ফু, কীওয়ার্ড: ফু এবং কীওয়ার্ড :: ফু সব একই প্রতীক। সুতরাং পরবর্তী দুটি স্বরলিপি সাধারণত ব্যবহৃত হয় না।

সুতরাং: foo কেইওয়ার্ড প্যাকেজটিতে কেবল বিশ্লেষণ করা হয়েছে, ধরে নেওয়া হয়েছে যে প্রতীক নামের আগে কোনও প্যাকেজের নাম না দেওয়ার অর্থ ডিফল্টরূপে KYYWORD প্যাকেজ রয়েছে।


6

কীওয়ার্ডগুলি এমন প্রতীক যা সেগুলি নিজেরাই মূল্যায়ণ করে, তাই আপনাকে সেগুলি উদ্ধৃত করতে মনে রাখতে হবে না।


5
এইটাই কি সেইটা? টাইপিং: এর চেয়ে 'বড় জয়ের মতো বলে মনে হয় না, বিশেষত যেহেতু: বেশিরভাগ কীবোর্ডগুলিতে একটি অতিরিক্ত কী থাকে।
লরেন্স গনসাল্ভেভস

11
ঠিক আছে, এটি সত্যিকারের চরিত্রের চেয়ে আরও বেশি কিছু। কীওয়ার্ডগুলি মূল্যায়নের পরে কীওয়ার্ড রাখে, এবং প্রতীকগুলি যা কিছু বেঁধে দেয় তার মূল্যায়ন করা হয়। এটি আরও একটি অর্থগত পার্থক্যের মতো, কারণ তারা সাধারণত বিভিন্ন উদ্দেশ্যে ব্যবহৃত হয়।
গ্রেগ হিউগিল

13
কীওয়ার্ডগুলি ক্লোজারে প্রতীক নয়
ডেভিড প্লাম্পটন

4

: কীওয়ার্ডগুলি বেশ কয়েকটি সংগ্রহের দ্বারা বিশেষভাবে চিকিত্সা করা হয়, কিছু সত্যিকারের সুবিধাজনক সিনট্যাক্সের অনুমতি দেয়।

(:user-id (get-users-map))

হিসাবে একই

((get-users-map) :user-id)

এটি জিনিসগুলিকে আরও কিছুটা নমনীয় করে তোলে


21
এটি চিহ্নগুলির জন্যও সত্য, ('a {' a 1 'b 2}) => 1 এবং ({' এ 1 'বি 2}' বি) => ২
জোনাস

4

কীওয়ার্ডগুলির জন্য, হ্যাশ মানগুলি নির্ণয় করা হয় এবং কীওয়ার্ডটি প্রথম তৈরি হওয়ার পরে ক্যাশে করা হয়। কোনও কীওয়ার্ডটিকে হ্যাশ কী হিসাবে সন্ধান করার সময় এটি প্রাক্পম্পিউটেড হ্যাশ মানটি দেয়। স্ট্রিং এবং চিহ্নগুলির জন্য, হ্যাশটি প্রতিটি অনুসন্ধানে পুনরায় গণনা করা হয়।

কেন একই নামযুক্ত কীওয়ার্ডগুলি সর্বদা অভিন্ন, সেগুলিতে তাদের নিজস্ব হ্যাশ মান রয়েছে। যেমন হ্যাশ কীগুলি থেকে মানচিত্র এবং সেটগুলি অনুসন্ধান করা হয়, এটি অনুসন্ধানে নয়, অসংখ্য অনুসন্ধানের ক্ষেত্রে আরও ভাল দক্ষতার দক্ষতা তৈরি করে।


0

কীওয়ার্ডগুলি বিশ্বব্যাপী , প্রতীকগুলি নয়

এই উদাহরণটি জাভাস্ক্রিপ্টে লেখা হয়েছে, তবে আমি আশা করি এটি পয়েন্টটি অতিক্রম করতে সহায়তা করবে।

const foo = Symbol.for(":foo") // this will create a keyword
const foo2 = Symbol.for(":foo") // this will return the same keyword
const foo3 = Symbol(":foo") // this will create a new symbol
foo === foo2 // true
foo2 === foo3 // false

আপনি যখন Symbolফাংশনটি ব্যবহার করে একটি প্রতীক তৈরি করেন আপনি প্রতিবার একটি স্বতন্ত্র / ব্যক্তিগত প্রতীক পাবেন। আপনি যখন Symbol.forফাংশনটির মাধ্যমে একটি প্রতীক চাইবেন , আপনি প্রতিবার একই প্রতীকটি ফিরে পাবেন।

(println :foo) ; Clojure
System.out.println(RT.keyword(null, "foo")) // Java
console.log(System.for(":foo")) // JavaScript

এই সব একই।


ফাংশন যুক্তির নাম স্থানীয়। অর্থাত্ কীওয়ার্ড নয়।

(def foo (fn [x] (println x))) ; x is a symbol
(def bar (fn [x] (println x))) ; not the same x (different symbol)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.