سؤال

وأود أن أغتنم فاصل ناقل في مخطط. أعرف أن هناك إجراءات اسمه vector->values، ولكن يبدو أنه يعود كل عنصر على حدة، وبينما كنت ترغب في الحصول على نتيجة كناقل. كيف يمكنني تحقيق ذلك؟

> (vector->values (vector 1 2 3 4 5) 0 3)
1
2
3

وبينما كنت بحاجة إلى:

#(1 2 3)
هل كانت مفيدة؟

المحلول

إذا كنت تستخدم PLT، لديك عدد قليل من الطرق السهلة للحصول على هذا:

(define (subvector v start end)
  (list->vector (for/list ([i (in-vector v start end)]) i)))

(define (subvector v start end)
  (build-vector (- end start) (lambda (i) (vector-ref v (+ i start)))))

(define (subvector v start end)
  (define new (make-vector (- end start)))
  (vector-copy! new 0 v start end)
  new)

وآخر واحد من المحتمل ان تكون أسرع. والسبب أنه لا يوجد مثل هذه العملية التي وفي المدمج هو أن الناس عادة لا تفعل ذلك. عندما كنت تتعامل مع ناقلات في مخطط، كنت تفعل عادة ذلك لأنك ترغب في تحسين شيء حتى عودته ناقلات ومجموعة بدلا من تخصيص واحد جديد هو أكثر شيوعا.

(وإذا كنت تعتقد أن هذا أمر مفيد، يرجى تشير إلى أنه على قائمة PLT البريدية.)

نصائح أخرى

ومعيار نظام R6RS تمت <م> جعل ناقلات ، <م> ناقلات المرجع ، <م> ناقلات حددت! و <م> ناقلات طول . مع أنه يمكنك كتابة وظيفة بنفسك <م> subvector ، والتي لا يبدو أن تكون جزءا من R6RS (!). بعض تنفيذ مخطط لديها شيء من هذا القبيل <م> subvector بالفعل.

ويمكنك أيضا التبديل إلى اللثغة المشتركة، والذي يوفر SUBSEQ وظيفة في المعيار.

وهنا هو R6RS النسخة المحمولة باستخدام <لأ href = "HTTP: //srfi.schemers. غزاله / srfi-43 / srfi-43.html "يختلط =" نوفولو noreferrer "> sRFI 43 :

#!r6rs

(import (rnrs base)
        (prefix (srfi :43) srfi/43:))

(srfi/43:vector-copy (vector 1 2 3 4 5) 0 3)
#lang scheme
(define (my-vector-value v l h c)
  (if (and (>= c l) (< c h))
      (cons (first v) (my-vector-value (rest v) l h (add1 c)))
      empty))

(list->vector (my-vector-value (vector->list (vector 1 2 3 4 5)) 0 3 0))

وغيتو؟ نعم جدا. ولكن لم يستغرق الأمر سوى دقيقتين لكتابة ويحصل على هذه المهمة.

و(أجد انها عموما أسهل للعب مع القوائم في مخطط)

subvector :

(subvector (vector 1 2 3 4 5) 0 3)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top