لغة اللثغة الشائعة - هل هناك طريقة أفضل؟

StackOverflow https://stackoverflow.com/questions/38571

  •  09-06-2019
  •  | 
  •  

سؤال

أجد نفسي أفعل هذا النوع من الأشياء طوال الوقت.لقد كنت أفكر في كتابة ماكرو/وظيفة لجعل هذا النوع من الأشياء أسهل، ولكن يخطر لي أنني ربما أعيد اختراع العجلة.

هل هناك وظيفة موجودة تسمح لي بإنجاز هذا النوع من الأشياء بشكل أكثر إيجازًا؟

(defun remove-low-words (word-list)   
  "Return a list with words of insufficient score removed."
  (let ((result nil))
    (dolist (word word-list)  
      (when (good-enough-score-p word) (push word result)))                                      
    result))  
هل كانت مفيدة؟

المحلول

هناك عدة طرق مدمجة للقيام بذلك.طريقة واحدة ستكون:

(remove-if-not 'good-enough-score-p word-list)

وآخر:

(loop for word in word-list  
      when (good-enough-score-p word)
      collect word)

وآخر:

(mapcan (lambda (word)
          (when (good-enough-score-p word)
            (list word)))
        word-list)

إلخ...هناك ايضا مسلسل و أعاد.إصدار Iterate مطابق لإصدار LOOP، لكن إصدار SERIES مثير للاهتمام:

(collect (choose-if 'good-enough-score-p (scan word-list))))

لذا، نعم، من المحتمل جدًا أن تقوم بإعادة الاختراع بعض عجلة.:-)

نصائح أخرى

الوظيفة التي تريدها هي remove-if-not, ، وهو مدمج.

(defun remove-low-words (word-list)
  (remove-if-not #'good-enough-score-p word-list))

إذا كنت تشعر وكأنك تعيد اختراع شيء يتعلق بالقوائم، فمن المحتمل أنك كذلك.تحقق من Hyperspec لترى.

هناك طريقتان يمكنك من خلالهما القيام بذلك.أولاً، وربما الأكثر سهولة، يمكنك القيام بذلك بشكل متكرر.

(defun remove-low-words (word-list)
  (if (good-enough-score-p (car word-list))
      (list word (remove-low-words (cdr word-list)))
      (remove-low-words (cdr word-list))))

يمكنك أيضًا القيام بذلك باستخدام mapcar و reduce, ، حيث يمكن للأول أن ينشئ لك قائمة بالعناصر الفاشلة التي تم استبدالها بـ nil ويمكن استخدام الأخير لتصفية nil.

إما أن يكون مرشحًا جيدًا لماكرو "مرشح" أو وظيفة تأخذ قائمة وترجع القائمة التي تمت تصفيتها بواسطة بعض المسندات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top