Racket技术问题:将剩余参数映射至plot过程
解决Racket中plot可变参数映射的问题
我明白你现在卡在怎么把可变参数列表里的每个函数都转换成(function f)形式并加入到绘图输入列表里了,咱们来一步步解决这个问题:
首先,你需要处理两个核心问题:一是正确遍历可变参数fns生成对应的绘图元素,二是修正网格选项的错误处理(原来的写法会在关闭网格时插入空列表元素,导致plot出错)。
下面是修改后的完整代码:
(define (graph fn/1 #:grid? [grid? true] #:min [min -20] #:max [max 20] . fns) (define plot-input (append (list (axes)) (if grid? (list (tick-grid)) '()) (list (function identity #:style 'dot #:width 1.5 #:color 'gray) (function fn/1)) (map (lambda (f) (function f)) fns))) (plot plot-input #:x-min min #:x-max max #:y-min min #:y-max max))
关键修改点说明:
- 处理可变参数
fns:用map函数遍历fns中的每个函数,通过(lambda (f) (function f))把每个函数转换成plot能识别的绘图元素,再用append把这些元素合并到主列表中,这就是你之前缺失的核心逻辑。 - 修正网格选项:原来的代码在关闭网格时会插入
empty作为列表元素,这会导致plot函数报错。现在改成当grid?为false时,传入空列表'(),append会自动忽略空列表,保证最终的plot-input是一个扁平的有效绘图元素列表。 - 补全y轴范围参数:把你代码中省略的
#:y-max补全为传入的max值,和x轴范围保持一致,当然你也可以根据需求改成其他值。
调用示例:
你可以这样测试这个函数,同时绘制多个函数:
(graph sin #:grid? #t #:min -10 #:max 10 cos tan)
这个调用会绘制sin函数(作为主函数),同时叠加cos、tan函数,还有灰色的identity点线和网格。
内容的提问来源于stack exchange,提问作者Meow
相关产品推荐
相关产品推荐

