2009-10-23 2 views
2

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

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

в то время как мне нужно:

#(1 2 3) 

ответ

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) 

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

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

+0

Это в 100 раз лучше, чем мое решение. –

+0

Похож на PLT. Как насчет портативной версии схемы? –

+1

Rainer, если вам это нравится, не стесняйтесь делать это самостоятельно. просто проигнорируйте пламя mpts и выполнить настоящую работу. –

0

вы хотите subvector:

(subvector (vector 1 2 3 4 5) 0 3) 
+1

кажется, DrScheme не процедуру подвектора :( – Hellnar

+0

MIT Схема, но не в стандарте Схемы –

2

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

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

1
#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

Похоже, что * add1 * и * empty * не соответствуют стандарту Scheme. –

2

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

#!r6rs 

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

(srfi/43:vector-copy (vector 1 2 3 4 5) 0 3) 
Смежные вопросы