كيف تأخذ شريحة من قائمة (أ sublist) في المخطط ؟
سؤال
قائمة, كيف يمكنني تحديد قائمة جديدة تحتوي على شريحة من القائمة الأصلية (تعطى الإزاحة عدد من العناصر) ?
تحرير:
اقتراحات جيدة حتى الآن.ليس هناك شيء محدد في واحدة من SRFI ؟ يبدو أن هذا هو شيء هام للغاية ، لذلك أنا مندهش التي يجب أن تنفذ في الأرض المستخدم.
المحلول
التعليمة البرمجية التالية سوف تفعل ما تريد:
(define get-n-items
(lambda (lst num)
(if (> num 0)
(cons (car lst) (get-n-items (cdr lst) (- num 1)))
'()))) ;'
(define slice
(lambda (lst start count)
(if (> start 1)
(slice (cdr lst) (- start 1) count)
(get-n-items lst count))))
على سبيل المثال:
> (define l '(2 3 4 5 6 7 8 9)) ;'
()
> l
(2 3 4 5 6 7 8 9)
> (slice l 2 4)
(3 4 5 6)
>
نصائح أخرى
الغريب ، slice
يتم توفير ذلك مع SRFI-1 ولكن يمكنك أن تجعل من أقصر طريق استخدام SRFI-1 take
و drop
:
(define (slice l offset n)
(take (drop l offset) n))
أعتقد أن واحدة من امتداد لقد استعملت مع النظام ، مثل معاهدة قانون البراءات نظام المكتبة أو خداع ، وقد بني هذا, ولكن لا يبدو أن هذا هو الحال.إنه لا يعرف حتى في R6RS المكتبات.
يمكنك أن تجرب هذه الوظيفة:
subseq تسلسل بداية &نهاية اختياري
على تبدأ المعلمة تعويض الخاصة بك.على نهاية المعلمة يمكن أن تحول بسهولة إلى عدد من العناصر لانتزاع ببساطة عن طريق إضافة ابدأ + عدد من العناصر.
مكافأة صغيرة هو أن subseq يعمل على جميع متواليات ، ويشمل هذا لا يسرد فقط ولكن أيضا سلسلة النواقل.
تحرير:يبدو أن ليس كل اللثغة تطبيقات قد subseq ، على الرغم من أنه سيتم القيام بهذه المهمة على ما يرام إذا كان لديك.
(define (sublist list start number)
(cond ((> start 0) (sublist (cdr list) (- start 1) number))
((> number 0) (cons (car list)
(sublist (cdr list) 0 (- number 1))))
(else '())))
هنا هو بلدي تنفيذ slice
يستخدم السليم ذيل استدعاء
(define (slice a b xs (ys null))
(cond ((> a 0) (slice (- a 1) b (cdr xs) ys))
((> b 0) (slice a (- b 1) (cdr xs) (cons (car xs) ys)))
(else (reverse ys))))
(slice 0 3 '(A B C D E F G)) ;=> '(A B C)
(slice 2 4 '(A B C D E F G)) ;=> '(C D E F)
محاولة شيء من هذا القبيل:
(define (slice l offset length)
(if (null? l)
l
(if (> offset 0)
(slice (cdr l) (- offset 1) length)
(if (> length 0)
(cons (car l) (slice (cdr l) 0 (- length 1)))
'()))))