'(ক। খ) কি আসলেই একটি তালিকা?


15

স্বীকৃতি নিয়ে আমি সত্যিই বিভ্রান্ত হয়ে পড়েছি .। Is '(a . b)একটি তালিকা?

(listp '(a . b))ফিরে আসে tতবে আমি যখন জানতে চাই এর দৈর্ঘ্য (length '(a . b))একটি ত্রুটি দেয় Wrong type argument: listp, b। অন্যান্য ফাংশনগুলির জন্য একই nth,mapcarইত্যাদি they তারা সবাই একই ত্রুটি দেয়

এমন কোন ফাংশন আছে যা আমি '(a b)এবং এর মধ্যে পার্থক্য করতে পারি '(a . b)?


প্রসঙ্গ: আমি যখন পুনরাবৃত্ত সংস্করণটির বাস্তবায়ন করতে চেয়েছিলাম তখন আমি এই সমস্যার মুখোমুখি হয়েছি mapcar। এখানে আমার বাস্তবায়ন

(defun true-listp (object)
"Return non-`nil' if OBJECT is a true list."
(and (listp object)  (null (cdr (last object)))))

(defun recursive-mapcar (func list)
"Evaluates func on elements of the list, then on elements of elements  of the list and so forth." 
(let ((output nil))
(flet ((comp (a b) nil)
       (call-fun-and-save (x) (add-to-list 'output (funcall func x) t 'comp))
       (recursion (l)
                  (mapcar
                   (lambda (x)
                     (call-fun-and-save x)
                     (if (and (true-listp x))  ;; HERE I use true-listp, testing for list or cons is not sufficient
                         (recursion x)))
                    l)))
   (recursion list))
  output))

আমি পার্সড এইচটিএমএল থেকে সমস্ত নির্দিষ্ট ট্যাগগুলি বের করতে এটি ব্যবহার করি। htmlপার্স করার উদাহরণ

;; buffer 'html'
<html>
<body>
<table style="width:100%">
  <tr>  <td>Jill</td>  <td>Smith</td>  <td>50</td> </tr>
  <tr>  <td>Eve</td>   <td>Jackson</td>   <td>94</td> </tr>
</table>
</body>
</html>

তারপরে আমি সমস্ত <td>হিসাবে নিষ্কাশন

(with-current-buffer (get-buffer "html")
  (let ((data (libxml-parse-html-region (point-max) (point-min))))

    ;; gat only <td> tags
    (-non-nil
     (recursive-mapcar
      (lambda(x) (and (consp x) (equal 'td (car x)) x))
      data))
    data
    )
  )

1
true-list-pএলিস্পে কেবল কোনও কারণ নেই কারণ এটি সরবরাহের জন্য এটি যথেষ্ট কার্যকর হিসাবে পাওয়া যায় নি। প্রকৃতপক্ষে, কোনও তালিকা যথাযথ ছিল কিনা তা পরীক্ষা করার জন্য আমি শেষবারের মতো মনে করতে পারছি না, তাই আপনি যদি আপনার ব্যবহারের ক্ষেত্রে আমাদের কিছুটা বেশি তথ্য দেন আমরা আপনাকে অন্যভাবে আপনার সমস্যা সমাধানে সহায়তা করতে পারি।
স্টিফান

@ স্টেফান সংক্ষেপে, আমি পুনরাবৃত্ত ম্যাপকার বাস্তবায়ন করতে চাই, আমি প্রদত্ত তালিকার উপাদানগুলির উপর, পরে তালিকার উপাদানগুলির উপাদানগুলির পরে, তালিকার উপাদানগুলির উপাদানগুলির উপর এবং এর বাইরে মূল্যায়ন করি। সুতরাং আমার জানা দরকার যে কোনও উপাদান একটি সত্য তালিকা কিনা।
টম

উদাহরণস্বরূপ, যখন আমি এইচটিএমএলকে পার্স libxml-parse-html-regionকরি এবং আমি সমস্ত <td>ট্যাগগুলি বের করতে চাই use
টম

আপনি কি আমাদের একটি নিখুঁত উদাহরণ দেখাতে পারেন যেখানে আপনি সঠিক তালিকা, অথবা একটি অনুচিত তালিকা, বা অন্য কোনও কিছু পেতে পারেন এবং যেখানে আপনাকে 3 টি কেস আলাদাভাবে পরিচালনা করতে হবে? বেশিরভাগ ক্ষেত্রে আমাকে মোকাবেলা করতে হয়েছিল, "যথাযথ" এবং "অনুচিত" কেসগুলি সত্যিকারের অনুচিত লেজ না পাওয়া পর্যন্ত ভাগ করা যায়, সুতরাং আপনার আবার পরীক্ষা করার দরকার নেই এটি যথাযথ বা না: কেবল পরীক্ষা যদি conspপরিবর্তে এটি
স্টিফান

1
libxML কেবলমাত্র তালিকাগুলির তালিকা ফেরত দেয় না। একটি এক্সএমএল উপাদান প্রতিনিধিত্ব করে প্রতিটি তালিকার ফর্ম (প্রতীক বৈশিষ্ট্য। বিষয়বস্তু) রয়েছে। সুতরাং আপনার কোডটি তালিকার সমস্ত উপাদানগুলির উপরে কেবল তালিকার উপরের cddr(উপাদানটির নাম এবং বৈশিষ্ট্যগুলি এড়াতে) পুনরাবৃত্তভাবে ম্যাপকার প্রয়োগ করা উচিত নয় । একবার আপনি এটি করেন, আপনার খুঁজে পাওয়া উচিত যে সমস্ত তালিকা যথাযথ এবং আপনার সমস্যাটি অদৃশ্য হয়ে যাবে। এটি আপনার কোডে একটি বাগও ঠিক করবে যেখানে আপনি tdকোনও tdউপাদানের জন্য কোনও বৈশিষ্ট্যকে বিভ্রান্ত করতে পারেন ।
স্টিফান

উত্তর:


22

এটি সন্তুষ্ট listp, সুতরাং সেই অর্থে এটি একটি তালিকা। listpকেবল একদিকে কিছু কনস বা nil(ওরফে ()), বা অন্যদিকে কিছু আছে কিনা তা পরীক্ষা করে দেখুন ।

একটি সঠিক তালিকা বা সত্য তালিকা (বা একটি তালিকা যা একটি বিন্দু তালিকা বা একটি বিজ্ঞপ্তি তালিকা নয়) এমন একটি বিষয় যা এর শেষ সিডিআর হিসাবে listpরয়েছে nil। অর্থাৎ একটি তালিকা XSকরা হয় সঠিক যদি (cdr (last XS))হয় nil(এবং যে কিভাবে আপনি আলাদা যায়)।

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

হ্যাঁ, আপনি কিনা তা পরীক্ষা করুন একটি প্রদত্ত listpএকটি সঠিক ব্যবহার তালিকা (cdr (last XS))হয় nil। দেখতে এটি কিনা গত কনস, - অর্ডার কিনা Critter এর CDR নিজেই একটি সঠিক তালিকা পরীক্ষা করতে, আপনি তার CDR চেক, শেষ নিচে চালিয়ে যেতে হবে nil। আপনি চাইলে নীচে এটির জন্য একটি শিকারী সংজ্ঞায়িত করতে পারেন:

(defun true-listp (object)
  "Return non-`nil' if OBJECT is a true list."
  (and (listp object)  (null (cdr (last object)))))

যদিও একটি বিজ্ঞপ্তি তালিকার কোনও শেষ নেই, ইমাকস (ইমাস 24 দ্বারা শুরু হওয়া) lastসঠিকভাবে যাচাই করার জন্য যথেষ্ট স্মার্ট , সুতরাং এই কোডটি একটি বিজ্ঞপ্তি তালিকার জন্যও কাজ করে (তবে কেবল ইমাক্স 24.1 এবং পরবর্তী ক্ষেত্রে; পূর্ববর্তী সংস্করণগুলির জন্য আপনি একটি "অসীম" পুনরাবৃত্তি পান স্ট্যাক ওভারফ্লো পর্যন্ত)

আপনি lengthকেবল যথাযথ তালিকা এবং অন্যান্য ক্রম হিসাবে ফাংশন ব্যবহার করতে পারেন । ফাংশন দেখুন safe-length

এলিসপ ম্যানুয়াল, নোড কনস সেলগুলি দেখুন

স্বরলিপি হিসাবে, (a b)কেবল সিনট্যাকটিক চিনির জন্য (a . (b . nil))- এলিসপ ম্যানুয়ালটি দেখুন, নোড ডটেড পেয়ার নোটেশন


সঠিক তালিকার জন্য যাচাই করার জন্য সেরা অনুশীলন কী? চূর্ণবিচূর্ণ কিনা (cdr (last XS))তা পরীক্ষা করা nilহচ্ছে। মত কোন ফাংশন নেই proper-list-p?
tom

@ টম: এটি বা সমতুল্য কিছু প্রয়োজনীয় - আপনাকে অবশ্যই সর্বশেষ কনস সেলটি পরীক্ষা করতে হবে। আমি এখনই উত্তরে এ সম্পর্কে আরও যুক্ত করেছি।
ড্র হয়েছে

@ ড্র আমি ফাংশনটির বডিটি পরিবর্তন করব (unless (atom x) (not (cdr (last x))))যাতে আপনি কল করতে পারেন (true-list-p "text")এবং nilত্রুটি নাও পেতে পারেন ।
tom

@ টম: ডান; ধন্যবাদ. আসলে এটি কনস বা nil(অর্থাত্ listp) নিশ্চিত হওয়ার জন্য প্রথমে এটি পরীক্ষা করা উচিত । (এছাড়াও, FWIW, আমি ব্যবহার করব না unlessবা whenতাদের ফেরত মান আমি ব্যবহার করি। and, orএবং ifযে জন্য।)
ড্রিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.