سؤال

ويمكن لأحد أن يقول لي كيفية العمل مع المعلمات المخزنة في القيمة المحددة من قبل والراحة.

ولقد قرأت حولها الكثير، ويبدو كما لو الكتاب لا يعرفون سوى كيفية سرد كافة المعلمات على انها كذلك.

(defun test (a &rest b) b)

وهذا هو الجميل أن نرى، ولكن ليس حقا أن من المفيد.

وأفضل لقد وجدت حتى الآن هو استخدام الأولى والثانية، وهلم جرا للحصول على المعلمة التي تبحث عنها.

(defun test (a &rest b)
    (first b))

ولقد لاحظت توقف هذه الطريقة تعمل على المعلمة العاشرة، ولكن مواصفات (من ما قرأت) يدعم ما لا يقل عن 50. وحتى لو هناك احتمالات ضئيلة أن سوف تستخدم 50 المعلمات، أود أن معرفة كيفية الوصول إلى كل منهم.

والشكر

هل كانت مفيدة؟

المحلول

والأولى والثانية وهلم جرا وظائف استرجاع هم "مجرد" وظائف فائدة على رأس CAR / CDR أو NTH. SO، أعتقد أن الإجابة على سؤال محدد هو "استخدام NTH أو ELT" (أو بناء الخاصة ظائف acccessor محددة).

إذا أردت، يمكنك تعريف الحادي عشر على النحو التالي:

<اقتباس فقرة> (defun الحادي عشر (القائمة)   (النونية 10 قائمة))

وأجد، ومع ذلك، وأنني في الغالب استخدام الحجج و الراحة عندما يكون هناك 0 أو أكثر من الأمور أريد أن تفعل شيئا مع، غير مبالين حقا عن موقف محدد من حجة التي وردت في وقائمة REST. التي عادة ما تنطوي على استخدام LOOP، DO أو DOLIST لاجتياز الحجج وتفعل شيئا مع كل واحد؛ الأسرة MAP أو (أحيانا) الحد.

نصائح أخرى

والراحة المعلمة هي مجرد قائمة. يمكنك التعامل معها باستخدام العمليات القائمة العادية.

(defun test (a &rest b))
  (dolist (s b)
    (when (> s 1)
      (print s)
      (do-something-else b)))

وفعلا هي وظيفة مفيدة. لديك فقط لمحاولة ذلك.

CL-USER 1 > (defun test (a &rest b) b)
TEST

CL-USER 2 > (test 1 2 3 4)
(2 3 4)

وهكذا ترون أن B هو مجرد قائمة من الحجج. لذا تنطبق كل قائمة وتسلسل العملية. لا يوجد شيء السحر. هناك وظائف للوصول إلى العنصر NTH، وظائف لإزالة العناصر، الخ ..

في اللثغة HyperSpec المشتركة يتم سرد الوظائف ذات الصلة:

14. وConses قاموس

17. تسلسل قاموس

لواللثغة التعليمي الأساسي تحقق من كتاب Touretzky:

اللثغة المشتركة: لطيف مقدمة إلى رمزي الحساب

وهذا الكتاب هو للتحميل في PDF والتذييل. وهو يعلم اللثغة المشتركة الأساسية.

ويمكنك أيضا استخدام الإتلاف-مأزق:

(defun my-function (&rest arguments)
  (destructuring-bind (a b &rest c) arguments
    (format nil "~A,~A followed with ~A" a b c)))

CL-USER> (my-function 1 2 "Give" 'me "more" 'arguments!!)
==> "1,2 followed with (Give ME more ARGUMENTS!!)"

ولدي مجرد أعاد عودي للذهاب من خلال كل منهم، واعتقد dolist هو أفضل ولكن أنا أحب باستخدام الطريقة القديمة

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