2012-06-22 2 views
3

Давайте предположим, что я создаю вектор/массив в схеме:Получить первый элемент вектора на схеме

(let* ((x #(1 2 3))) 
    (list-ref x 0)) ; returns error 

Какой синтаксис или функции можно использовать вместо этого списка-реф получить 1?

EDIT: Я использую Script-Fu с GIMP 2.8, где array-ref, похоже, не работает.

+3

Попробуйте 'vector-ref' ... (например, http://people.csail.mit.edu/jaffer/r5rs_8.html) – Dirk

ответ

7

Выражение (define v #(1 2 3)) является сокращением для создания нового вектора, в стандартной схеме это эквивалентно следующему:

(define v (list->vector '(1 2 3))) 

Или это:

(define v (make-vector 3)) 
(vector-set! v 0 1) 
(vector-set! v 1 2) 
(vector-set! v 2 3) 

После того, как вектор создается (с помощью любого из указанных процедур), правильный способ доступа к элементу в векторе - это вызов процедуры vector-ref - очевидно, потому что это вектор , а не список элементов:

(vector-ref v 0) 

В предыдущем выражении, v вектор и 0 индекс которого элемент мы хотим получить. Взгляните на documentation для более подробного объяснения описанных выше процедур.

+0

Это будет придирчиво, но когда вы упоминаете «стандартную схему», такая придирка оправдана ... По крайней мере, r5rs и up, '# (...)' не указывается. Вместо этого вы должны указать его: '' # (...) '. (Это похоже на '()', не являющееся допустимым сокращением для ''() '.) И поскольку оно цитируется, существует обычное различие между таким литералом и выражением, которое создает новый вектор. –

4

Для этой цели вы можете использовать vector-ref. Например:

(vector-ref x 0) 

Here является ссылка на R секции RS SPEC на векторах, что обеспечивает больше информации.

+0

О, ничего себе. Это то, что я должен был бы выяснить. – wecsam