কীভাবে তৈরি করবেন: কীওয়ার্ড?


16

প্রশ্ন: একজন কীভাবে তৈরি এবং ব্যবহার করে :keywords?

নিম্নলিখিত খেলনা তালিকাকে অ্যাক্সেস করার জন্য একটি (নিষ্পাপ, স্পষ্টতই) চেষ্টা বিবেচনা করুন:

(setf alist '((:key-1 "Key no. 1")
              (:key-2 "Key no. 2")))

(assq :key-1 alist)                 ; => (:key-1 "Key no. 1")
(assq (make-symbol ":key-1") alist) ; => nil

প্রথম কীটি প্রত্যাশার মতো কাজ করে তবে দ্বিতীয় কীটি তা কার্যকর করে না। প্রকৃতপক্ষে কোনও সুস্পষ্ট make-keywordকার্যকারিতা না থাকায় কীভাবে কোনও কীওয়ার্ড তৈরি এবং ব্যবহার করে?

আসল প্রেরণা: আমার একটি স্ট্রিংকে একটি লুপিং কীতে রূপান্তর করতে putহবে যা প্রতীক যেখানে আমি বৈশিষ্ট্য পেতে পারি।

এই প্রশ্নটি গঠনের প্রক্রিয়াতে, আমি উত্তরটির কমপক্ষে একটি অংশ পেয়েছি, যা আমি আলাদাভাবে পোস্ট করছি। আমি আশা করছি আমার চেয়ে বেশি উজ্জ্বল মন এতে উন্নতি করতে পারে।


1
(eq :foo (read ":foo"))
Abo-abo

উত্তর:


9

আপনি ঠিক বলেছেন যে make-symbolএমন একটি কীওয়ার্ড তৈরি করবে যা eqকোনও বিদ্যমান কীওয়ার্ডের নয়, এবং internনতুন প্রতীক সহ গ্লোবাল ওবাড়িকে দূষিত করতে পারে। এর মধ্যে, আপনার কাছে intern-soft, যা প্রতীকটি এটি ইতিমধ্যে তৈরি করা হয়েছে, বা nilএটি না থাকলে তা প্রদান করে:

ELISP> (intern-soft ":key-1")
nil
ELISP> :key-1
:key-1
ELISP> (intern-soft ":key-1")
:key-1

এটি আপনার উদ্দেশ্যে উপযুক্ত হতে হবে: কীওয়ার্ডটি উপস্থিত না থাকলে এটি তালিকায় উপস্থিত থাকতে পারে না, সুতরাং এটি আছে কিনা তা খতিয়ে দেখার জন্য এটি তৈরি করার দরকার নেই। কিছুটা এইরকম:

(let ((maybe-keyword (intern-soft ":key-1")))
  (and maybe-keyword (assq maybe-keyword alist)))

চতুর - আমি দেখেছি intern-softকিন্তু এটি এইভাবে ব্যবহার করার চিন্তা করিনি ।
ড্যান

6

সম্ভবত আমি প্রশ্নটি সঠিকভাবে বুঝতে পারছি না। কিন্তু আপনি যদি একটি শব্দ চান (অর্থাত, আপনাকে সন্তুষ্ট করতে চান keywordp) তারপর আপনি চান প্রতীক বিশ্বব্যাপী obarray অন্তরীণ করা , obarray

এটি সন্তুষ্ট করার জন্য অবশ্যই সেখানে অভ্যন্তরীণ থাকতে হবে keywordp, এএএএফসিটি, এবং C-h f keywordpতাই বলে।

সুতরাং আপনার প্রশ্নের উত্তর, এএএএএফসিটি কেবল ব্যবহারের জন্যintern

আমার মনে হচ্ছে আপনি সম্ভবত আপনার আসল প্রশ্ন জিজ্ঞাসা করছেন না - মনে হচ্ছে এটি কোনও এক্সওয়াই প্রশ্নের মতো। আপনি সত্যিই কি করতে চেষ্টা করছেন? (সম্ভবত এটি পৃথক প্রশ্ন হিসাবে প্রকাশ করুন))

[আপনার মন্তব্যের উত্তরে যে ইন্টার্নিং " নির্দিষ্ট নয় :keyword, কারণ এটি সমস্ত চিহ্নগুলির ক্ষেত্রে প্রযোজ্য ": সঠিক, ইন্টার্নিং কীওয়ার্ডগুলির সাথে নির্দিষ্ট নয়। তবে ইন্টার্নিং (ইন obarray) করা এবং এর symbol-nameসাথে শুরু হওয়া একটি ব্যবহার :কীওয়ার্ডের সাথে নির্দিষ্ট]


এটি অবশ্যই এই অর্থে একটি এক্সওয়াই প্রশ্ন যা আমি ওয়াইয়ের সাথে চেষ্টা করে যাচ্ছি, তবে ওয়াইয়ের কাছে যাওয়ার আমার প্রয়াসে এক্সের প্রতি সত্যই আগ্রহী হয়ে উঠেছে Y অন্যদের জন্যও দরকারী।
ড্যান

গ্রেট। এটা সহায়ক হবে। ধন্যবাদ.
ড্রিউ

2

এই প্রশ্নের একটি আংশিক উত্তর এখানে। সংক্ষিপ্ত এবং পুরোপুরি সন্তোষজনক সংস্করণটি মনে হচ্ছে: ব্যবহার intern

:key-1 উভয় সন্তুষ্ট:

(symbolp :key-1)                    ; => t
(keywordp :key-1)                   ; => t

যদিও (make-symbol ":key-1")প্রথমটি সন্তুষ্ট তবে দ্বিতীয়টি নয়:

(symbolp (make-symbol ":key-1"))    ; => t
(keywordp (make-symbol ":key-1"))   ; => nil

এখন, জন্য দস্তাবেজ make-symbolবলছে যে এটি হবে:

একটি নতুন বরাদ্দযুক্ত নিরবচ্ছিন্ন প্রতীকটি প্রত্যাবর্তন করুন যার নাম NAME।

ম্মমকে, এবং এর জন্য ডক্টরসিং keywordpবলেছেন যে এটি হবে:

tওবিজেইসিটি একটি কীওয়ার্ড হলে ফিরে আসুন । এর অর্থ এটি প্রারম্ভিক নামের সাথে প্রারম্ভিক নামের সাথে : প্রাথমিক ওভারেতে অভ্যন্তরীণভাবে শুরু হয় ।

সুতরাং এটি প্রদর্শিত হবে যে internকাজ করবে:

(assq (intern ":key-1") alist)      ; => (:key-1 "Key no. 1")

কারণ internহবে:

ক্যানোনিকাল প্রতীক যার নাম STRING হয় তা ফিরিয়ে দিন। যদি কিছুই না থাকে তবে একটি এই ফাংশনটি তৈরি করে ফিরে আসে returned একটি দ্বিতীয় alচ্ছিক আর্গুমেন্ট ব্যবহারের জন্য ওবারে নির্দিষ্ট করে; এটির মান ডিফল্ট হয় obarray

তবে এটি :keywordসুনির্দিষ্ট বলে মনে হচ্ছে না , কারণ এটি সমস্ত চিহ্নের ক্ষেত্রে প্রযোজ্য। ডিফল্টরূপে, এটি বিশ্বব্যাপী দূষিত obarrayহতে দেখা যায়, যা একটি বড় চুক্তি হতে পারে বা নাও হতে পারে।

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