学习载体

时间:2014-12-04 22:56:38

标签: 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" )
               (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"

这是正确的方法吗?有没有更好的方法呢?

1 个答案:

答案 0 :(得分:3)

这是使用iterations and comprehensionsformat strings在Racket中更简单的方法。可以说,这更加惯用,更容易理解:

(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"