球拍数据处理问题:Vector Pointer is Void
Racket Data Processing Issue: Vector Pointer is Void
问题
我有一个作业要编写球拍函数:
takes an origin, a destination (both as 3-character airport codes),
and the list of flight data and returns a list of lateness statistics
for all flights from the origin to the destination, with a the cons
cell (origin . destination) as the first element.
必须将数据格式化为六个比例,航班至少晚点 1、15、30、60、120 和 180 分钟的比例。
在我下面的代码中,我编写了一个尾部优先递归函数,每次找到匹配的飞行数据时,它都会在长度为 6 的向量中递增一个值。然后,一旦递归检查了数据列表,就会返回一个比例列表。
我收到以下错误,表明在达到增量代码时 part
无效。 part
不应该在整个函数中指向生成的向量吗?
错误
vector-ref: contract violation
expected: vector?
given: #<void>
argument position: 1st
other arguments...: 3
代码
(require "ontime.rkt")
(define (ontime-stats-by-route orig dest data)
(define (aux orig dest data part)
(if (null? data)
(let ([sum (foldl + 0 (vector->list part))])
(list (cons orig dest)
(/ (vector-ref part 0) sum)
(/ (vector-ref part 1) sum)
(/ (vector-ref part 2) sum)
(/ (vector-ref part 3) sum)
(/ (vector-ref part 4) sum)
(/ (vector-ref part 5) sum)))
(if (and
(eq? orig (car (car (cdr (car data)))))
(eq? dest (car (cdr (car (cdr (car data)))))))
(let ([late (car (cdr (cdr (cdr (car data)))))])
(cond
[(>= late 180) (aux orig dest (cdr data)
(vector-set! part 5 (vector-ref part 5)))]
[(>= late 120) (aux orig dest (cdr data)
(vector-set! part 4 (vector-ref part 4)))]
[(>= late 60) (aux orig dest (cdr data)
(vector-set! part 3 (vector-ref part 3)))]
[(>= late 30) (aux orig dest (cdr data)
(vector-set! part 2 (vector-ref part 2)))]
[(>= late 15) (aux orig dest (cdr data)
(vector-set! part 1 (vector-ref part 1)))]
[(>= late 1) (aux orig dest (cdr data)
(vector-set! part 0 (vector-ref part 0)))]
[else (aux orig dest (cdr data) part)]))
(aux orig dest (cdr data) part))))
(let ([count (make-vector 6 0)])
(aux orig dest data count)))
(ontime-stats-by-route "BWI" "BDL" ontime)
问题是突变函数像 vector-set!
、set-box!
等 return #<void>
因为它们用于突变,而不是 return 值。这很好,因为它鼓励在清晰的功能代码(你可以随意操作和重新排序)和清晰的命令式代码(你必须更加小心)之间进行一些分离。这也是为什么这些函数通常以 !
.
结尾的原因
因此,与其将 (vector-set! part ....)
作为新的 part
参数传入,不如单独执行此更改,然后将 part
本身作为参数传递,因为它现在已更改:
(cond
[(>= late 180)
(vector-set! part 5 (vector-ref part 5))
(aux orig dest (cdr data) part)]
[(>= late 120)
(vector-set! part 4 (vector-ref part 4))
(aux orig dest (cdr data) part)]
[(>= late 60)
(vector-set! part 3 (vector-ref part 3))
(aux orig dest (cdr data) part)]
[(>= late 30)
(vector-set! part 2 (vector-ref part 2))
(aux orig dest (cdr data) part)]
[(>= late 15)
(vector-set! part 1 (vector-ref part 1))
(aux orig dest (cdr data) part)]
[(>= late 1)
(vector-set! part 0 (vector-ref part 0))
(aux orig dest (cdr data) part)]
[else
(aux orig dest (cdr data) part)])
虽然,(vector-set! part 5 (vector-ref part 5))
之类的东西根本不会改变索引 5
处的值。你是说 (vector-set! part 5 (add1 (vector-ref part 5)))
,因为你说你想增加值吗?
(cond
[(>= late 180)
(vector-set! part 5 (add1 (vector-ref part 5)))
(aux orig dest (cdr data) part)]
[(>= late 120)
(vector-set! part 4 (add1 (vector-ref part 4)))
(aux orig dest (cdr data) part)]
[(>= late 60)
(vector-set! part 3 (add1 (vector-ref part 3)))
(aux orig dest (cdr data) part)]
[(>= late 30)
(vector-set! part 2 (add1 (vector-ref part 2)))
(aux orig dest (cdr data) part)]
[(>= late 15)
(vector-set! part 1 (add1 (vector-ref part 1)))
(aux orig dest (cdr data) part)]
[(>= late 1)
(vector-set! part 0 (add1 (vector-ref part 0)))
(aux orig dest (cdr data) part)]
[else
(aux orig dest (cdr data) part)])
问题
我有一个作业要编写球拍函数:
takes an origin, a destination (both as 3-character airport codes), and the list of flight data and returns a list of lateness statistics for all flights from the origin to the destination, with a the cons cell (origin . destination) as the first element.
必须将数据格式化为六个比例,航班至少晚点 1、15、30、60、120 和 180 分钟的比例。
在我下面的代码中,我编写了一个尾部优先递归函数,每次找到匹配的飞行数据时,它都会在长度为 6 的向量中递增一个值。然后,一旦递归检查了数据列表,就会返回一个比例列表。
我收到以下错误,表明在达到增量代码时 part
无效。 part
不应该在整个函数中指向生成的向量吗?
错误
vector-ref: contract violation
expected: vector?
given: #<void>
argument position: 1st
other arguments...: 3
代码
(require "ontime.rkt")
(define (ontime-stats-by-route orig dest data)
(define (aux orig dest data part)
(if (null? data)
(let ([sum (foldl + 0 (vector->list part))])
(list (cons orig dest)
(/ (vector-ref part 0) sum)
(/ (vector-ref part 1) sum)
(/ (vector-ref part 2) sum)
(/ (vector-ref part 3) sum)
(/ (vector-ref part 4) sum)
(/ (vector-ref part 5) sum)))
(if (and
(eq? orig (car (car (cdr (car data)))))
(eq? dest (car (cdr (car (cdr (car data)))))))
(let ([late (car (cdr (cdr (cdr (car data)))))])
(cond
[(>= late 180) (aux orig dest (cdr data)
(vector-set! part 5 (vector-ref part 5)))]
[(>= late 120) (aux orig dest (cdr data)
(vector-set! part 4 (vector-ref part 4)))]
[(>= late 60) (aux orig dest (cdr data)
(vector-set! part 3 (vector-ref part 3)))]
[(>= late 30) (aux orig dest (cdr data)
(vector-set! part 2 (vector-ref part 2)))]
[(>= late 15) (aux orig dest (cdr data)
(vector-set! part 1 (vector-ref part 1)))]
[(>= late 1) (aux orig dest (cdr data)
(vector-set! part 0 (vector-ref part 0)))]
[else (aux orig dest (cdr data) part)]))
(aux orig dest (cdr data) part))))
(let ([count (make-vector 6 0)])
(aux orig dest data count)))
(ontime-stats-by-route "BWI" "BDL" ontime)
问题是突变函数像 vector-set!
、set-box!
等 return #<void>
因为它们用于突变,而不是 return 值。这很好,因为它鼓励在清晰的功能代码(你可以随意操作和重新排序)和清晰的命令式代码(你必须更加小心)之间进行一些分离。这也是为什么这些函数通常以 !
.
因此,与其将 (vector-set! part ....)
作为新的 part
参数传入,不如单独执行此更改,然后将 part
本身作为参数传递,因为它现在已更改:
(cond
[(>= late 180)
(vector-set! part 5 (vector-ref part 5))
(aux orig dest (cdr data) part)]
[(>= late 120)
(vector-set! part 4 (vector-ref part 4))
(aux orig dest (cdr data) part)]
[(>= late 60)
(vector-set! part 3 (vector-ref part 3))
(aux orig dest (cdr data) part)]
[(>= late 30)
(vector-set! part 2 (vector-ref part 2))
(aux orig dest (cdr data) part)]
[(>= late 15)
(vector-set! part 1 (vector-ref part 1))
(aux orig dest (cdr data) part)]
[(>= late 1)
(vector-set! part 0 (vector-ref part 0))
(aux orig dest (cdr data) part)]
[else
(aux orig dest (cdr data) part)])
虽然,(vector-set! part 5 (vector-ref part 5))
之类的东西根本不会改变索引 5
处的值。你是说 (vector-set! part 5 (add1 (vector-ref part 5)))
,因为你说你想增加值吗?
(cond
[(>= late 180)
(vector-set! part 5 (add1 (vector-ref part 5)))
(aux orig dest (cdr data) part)]
[(>= late 120)
(vector-set! part 4 (add1 (vector-ref part 4)))
(aux orig dest (cdr data) part)]
[(>= late 60)
(vector-set! part 3 (add1 (vector-ref part 3)))
(aux orig dest (cdr data) part)]
[(>= late 30)
(vector-set! part 2 (add1 (vector-ref part 2)))
(aux orig dest (cdr data) part)]
[(>= late 15)
(vector-set! part 1 (add1 (vector-ref part 1)))
(aux orig dest (cdr data) part)]
[(>= late 1)
(vector-set! part 0 (add1 (vector-ref part 0)))
(aux orig dest (cdr data) part)]
[else
(aux orig dest (cdr data) part)])