这里有新的计划,我在学习循环方面遇到了一些麻烦。我试图创建一个函数,它将接受一个对象和一个向量,然后遍历向量,直到找到该对象。找到对象后,它将返回一个列表,其中包含该对象之前的向量中的所有项。我的代码如下。它将返回的是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))
答案 0 :(得分:4)
如果您正在使用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
,那么你在测试中缺少一对parens,你应该为累加器添加一个绑定。)
答案 1 :(得分:1)
使用命名循环的解决方案。更清洁(在我看来!)而不是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()