Scheme 学习向量
我正在学习向量的工作原理。 我有两个向量,一个包含姓名,另一个包含“电话号码”。我编写了一个函数,将所有姓名和电话号码显示在一起:Scheme 学习向量,scheme,lisp,racket,Scheme,Lisp,Racket,我正在学习向量的工作原理。 我有两个向量,一个包含姓名,另一个包含“电话号码”。我编写了一个函数,将所有姓名和电话号码显示在一起: (define v4 (vector 'Tom 'Michael 'John 'Julia)) (define v5 (vector 2343 1343 2112 372637)) (define db (λ (n) (cond ((equal? (vector-length v4) n ) "stop" )
(define v4 (vector 'Tom 'Michael 'John 'Julia))
(define v5 (vector 2343 1343 2112 372637))
(define db (λ (n)
(cond
((equal? (vector-length v4) n ) "stop" )
(equal? 0 (display (vector-ref v4 n))
(display " ")
(display (vector-ref v5 n ))
(displayln " ")
(set! n (+ n 1))
(db n)
))))
(db 0)
结果是:
Tom 2343
Michael 1343
John 2112
Julia 372637
"stop"
这样做对吗?有没有更好的方法呢?这里有一个更简单的方法,在球拍,使用和。可以说,这更惯用,更容易理解:
(define (db v1 v2)
(for ([name (in-vector v1)]
[phone (in-vector v2)])
(printf "~a ~a~n" name phone))
"stop")
即使我们只使用显式递归和标准过程来编写实现,也最好避免使用set
要增加索引,请传递参数-包括要迭代的向量,无需参考全局定义:
(define (db v1 v2)
(let loop ((idx 0))
(cond ((>= idx (vector-length v1)) "stop")
(else
(display (vector-ref v1 idx))
(display " ")
(display (vector-ref v2 idx))
(newline)
(loop (+ idx 1))))))
无论哪种方式,假设两个向量具有相同的长度,它都会按预期工作:
(define v1 (vector 'Tom 'Michael 'John 'Julia))
(define v2 (vector 2343 1343 2112 372637))
(db v1 v2)
Tom 2343
Michael 1343
John 2112
Julia 372637
"stop"
太棒了!非常感谢。