سؤال

لقد تم البحث في كل مكان عن الوظائف التالية في اللثغة ، و قد حصلت على أي مكان:

  1. تجد مؤشر شيء في القائمة.على سبيل المثال:

    (index-of item InThisList)
    
  2. استبدال شيء في بقعة محددة في قائمة.على سبيل المثال:

    (replace item InThisList AtThisIndex) ;i think this can be done with 'setf'?
    
  3. عودة عنصر في مؤشر محدد.على سبيل المثال:

    (return InThisList ItemAtThisIndex)
    

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

هذا هو كيف تم تزوير رقم 1:

(defun my-index (findMe mylist)
  (let ((counter 0) (found 1))
    (dolist (item mylist)
      (cond
        ((eq item findMe) ;this works because 'eq' checks place in memory, 
                  ;and as long as 'findMe' was from the original list, this will work.
         (setq found nil)
        (found (incf counter))))
  counter))
هل كانت مفيدة؟

المحلول

يمكنك استخدام setf و nth استبدال واسترجاع القيم من قبل المؤشر.

(let ((myList '(1 2 3 4 5 6)))
     (setf (nth 4 myList) 101); <----
     myList)

(1 2 3 4 101 6)

العثور على مؤشر يمكنك استخدام على position وظيفة.

(let ((myList '(1 2 3 4 5 6)))
     (setf (nth 4 myList) 101)
     (list myList (position 101 myList)))

((1 2 3 4 101 6) 4)

لقد وجدت كل هذه في هذا المؤشر من الوظائف.

نصائح أخرى

  1. تجد مؤشر شيء في القائمة.

في Emacs Lisp و Common Lisp لديك position وظيفة:

> (setq numbers (list 1 2 3 4))
(1 2 3 4)
> (position 3 numbers)
2

في المخطط ، وهنا ذيل تنفيذ العودية من DrScheme's doc:

(define list-position 
  (lambda (o l)
    (let loop ((i 0) (l l))
      (if (null? l) #f
          (if (eqv? (car l) o) i
              (loop (+ i 1) (cdr l)))))))

----------------------------------------------------

> (define numbers (list 1 2 3 4))
> (list-position 3 numbers)
2
> 

ولكن إذا كنت تستخدم قائمة مجموعة من فتحات لتخزين البيانات المهيكلة ، ربما يجب أن يكون لديك نظرة على defstruct أو حتى نوع من يسب وجوه النظام مثل كلوس.

إذا كنت تعلم اللثغة ، تأكد من أن لديك نظرة على عملية Common Lisp و / أو قليلا متآمر.

هتاف!

الإجابات:

  1. (موقف البند تسلسل &key من نهاية (تبدأ 0) end مفتاح اختبار اختبار-لا)
    http://lispdoc.com/?q=position&search=Basic+search

  2. (setf (elt تسلسل فهرس) قيمة)

  3. (elt تسلسل فهرس)
    http://lispdoc.com/?q=elt&search=Basic+search
    ملاحظة:elt هو الأفضل الألف لأن elt يعمل على أي تسلسل ، ليس فقط القوائم

جيريمي إجابات يجب العمل ؛ ولكن إذا كنت تجد نفسك في كتابة التعليمات البرمجية مثل

(setf (النونية أنا بلدي-قائمة) جديدة-elt)

ربما كنت تستخدم الخطأ datastructure.القوائم هي ببساطة القوائم المرتبطة ، حتى انهم O(N) إلى وصول المؤشر.قد تكون أفضل حالا باستخدام المصفوفات.

أو ربما كنت تستخدم قوائم الصفوف.في هذه الحالة ينبغي أن يكون على ما يرام.ولكن ربما كنت تريد أن اسم accessors حتى شخص يقرأ التعليمات البرمجية الخاصة بك لا يجب أن تذكر ما "النونية 4" من المفترض أن يعني.شيء مثل

(defun my-attr (list)
  (nth 4 list))

(defun (setf my-attr) (new list)
  (setf (nth 4 list) new))

+2 عن "عملية Common Lisp".هو خليط من Common Lisp طبخ و جودة تعليم نفسك اللثغة الكتاب.

هناك أيضا "ناجحة Common Lisp" (http://www.psg.com/~dlamkins/sl/cover.html و http://www.psg.com/~dlamkins/sl/contents.html) الذي بدا لسد بعض الثغرات / تمديد الأمور في "عملية Common Lisp".

لقد قرأت أيضا بول جراهام "ANSI Common Lisp" الذي هو أكثر حول أساسيات اللغة, ولكن قليلا أكثر من دليل مرجعي.

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

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