Сделать итерационный цикл в схеме - PullRequest
4 голосов
/ 11 ноября 2010

Впервые на схеме здесь, и у меня возникли проблемы с обучением делать циклы.Я пытаюсь создать функцию, которая будет принимать объект и вектор, а затем выполнять итерацию по вектору, пока не найдет этот объект.Когда объект найден, он возвращает список, содержащий все элементы в векторе перед объектом.Мой код ниже.Все, что он вернет, - это количество итераций, которые прошел цикл do, вместо списка, который я хочу.Если бы кто-нибудь мог помочь мне с синтаксисом, я был бы очень признателен.Спасибо!(в идеале это вернет (1 2))

    (define(vector-test-iterative X Vector)    
      (do ((i 0 (+ i 1))) (< i (vector-length Vector))
          (if (eqv? X (vector-ref Vector i))
              (= i (vector-length Vector))
              (cons (vector-ref Vector i) (ls '())))
          ls))


(vector-test-iterative '4 #(1 2 4 3 5))

Ответы [ 2 ]

4 голосов
/ 11 ноября 2010

Если вы используете Racket, тогда нет необходимости использовать do, который так или иначе никогда не был популярен среди интриганов.Существует целый ряд итераторов - ищите в документах for и все, что начинается с for.Например, ваш код сводится к

#lang racket
(define (values-before x vector)
  (for/list ([y (stop-before (in-vector vector)
                             (lambda (y) (eqv? x y)))])
    y))

(Если вы действительно хотите использовать do, то вам не хватает пары символов в тесте, и вы должны добавить привязку для аккумулятора.)

1 голос
/ 11 ноября 2010

Решение, которое использует именованный цикл. Более чистый (на мой взгляд!), Чем версия do и должен работать на любой схеме R5RS:

;; Extracts the sublist of `lst` up to `val`. 
;; If `val` is not found, evaluates to an empty list.
(define (upto val lst)
  (let loop ((res null) (lst lst))
    (cond ((null? lst) null)
          ((eq? val (car lst)) (reverse res))
          (else (loop (cons (car lst) res) (cdr lst))))))

;; Adapts the above procedure to work with vectors.
(define (vector-upto val vec)
  (list->vector (upto val (vector->list vec))))

;; test
(vector-upto 6 #(1 2 3 4 5))
=> #0()
(vector-upto 5 #(1 2 3 4 5))
=> #4(1 2 3 4)
(vector-upto 3 #(1 2 3 4 5))
=> #2(1 2)
(vector-upto 1 #(1 2 3 4 5))
=> #0()
...