我创建了以下表达式,我想根据列表中的最后两个元素绘制抛物线图。它看起来像这样:
#lang racket
(require plot)
(define list-sqr-graph
(lambda (lst)
(cond
[(null? lst) (plot (function sqr 0 0))]
[(<= (car lst) 0) (list-sqr-graph (cdr lst))]
[(not (equal? (length lst) 2)) (list-sqr-graph (cdr lst))]
[else (plot (function sqr (car lst) (cdr lst)))])))
第一个条件语句检查列表是否为空,如果为true则返回空白图。第二个条件语句从列表中跳过小于或等于0的过去的数字。第三个条件语句检查列表的长度是否等于2,并在列表中向下,直到长度等于2。 else语句是我在运行表达式时遇到麻烦的地方,如:
(list-sqr-graph '(1 2 3))
这将导致错误读取:
function: contract violation
expected: (or/c rational? #f)
given: '(4)
从这个错误我开始相信列表的第一个元素被读作数字,但第二个元素有问题。这是为什么?
提前谢谢!
答案 0 :(得分:3)
您在plot
时传递列表。请记住cdr
返回一个列表而不是一个元素(如car
那样)。
您想使用cadr
。
#lang racket
(require plot)
(define list-sqr-graph
(lambda (lst)
(cond
[(null? lst) (plot (function sqr 0 0))]
[(<= (car lst) 0) (list-sqr-graph (cdr lst))]
[(not (equal? (length lst) 2)) (list-sqr-graph (cdr lst))]
[else (plot (function sqr (car lst) (cadr lst)))]))) <- HERE