получить интервал вектора - PullRequest
2 голосов
/ 24 октября 2009

Я хочу взять интервал вектора в Схеме. Я знаю, что есть процедура с именем vector->values, но похоже, что она возвращает каждый элемент отдельно, а я хочу получить результат как вектор Как мне этого добиться?

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

пока мне нужно:

#(1 2 3)

Ответы [ 5 ]

3 голосов
/ 24 октября 2009

Если вы используете 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)

Последний, вероятно, будет самым быстрым. Причина, по которой нет такой встроенной операции, заключается в том, что люди обычно этого не делают. Когда вы имеете дело с векторами в Scheme, вы обычно делаете это, потому что вы хотите что-то оптимизировать, поэтому более распространенным является возврат вектора и диапазона вместо выделения нового.

(И если вы считаете, что это полезно, пожалуйста, предложите это в списке рассылки PLT.)

2 голосов
/ 24 октября 2009

Вот портативная R6RS версия с использованием SRFI 43 :

#!r6rs

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

(srfi/43:vector-copy (vector 1 2 3 4 5) 0 3)
2 голосов
/ 24 октября 2009

Стандарт Scheme R6RS имеет make-vector , vector-ref , vector-set! и vector-length . При этом вы можете написать свою собственную функцию subvector , которая, похоже, не является частью R6RS (!). В некоторых реализациях Scheme уже есть что-то вроде subvector .

Вы также можете переключиться на Common Lisp, который предоставляет функцию SUBSEQ в стандарте.

1 голос
/ 24 октября 2009
#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))

Ghetto? Да очень. Но это заняло всего две минуты, чтобы написать и выполнить работу.

(мне кажется, что со списками в схеме проще играть)

0 голосов
/ 24 октября 2009

Вы хотите subvector:

(subvector (vector 1 2 3 4 5) 0 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...