首页 > 解决方案 > 将程序的一部分视为 Racket 中的数据

问题描述

我必须说我真的不知道如何称呼我正在寻找的东西,所以也许标题不是那么准确。

我有一个绘制一些点的程序。该generate-list函数生成一个 n (x,y) 坐标列表,并get-points生成另一个列表,其中每个 x(来自 (x,y))都可被 n 整除。
我绝对可以调用points我需要多少次,但我试图通过points只编写一次函数来减少这个过程)。

#lang racket
(require plot)

(define (generate-list n)
  (if (= n 0)
      empty
      (cons (list (random 0 100) (random 0 100))
            (generate-list (- n 1)))))

(define (get-points lst n)
  (if (empty? lst)
      empty
      (if (= (remainder (caar lst) n) 0)
          (cons (car lst) (get-points (cdr lst) n))
          (get-points (cdr lst) n))))

(plot (list
       (axes 0 0)
       (points (get-points (generate-list 1000) 2)
               #:color 2)
       (points (get-points (generate-list 1000) 3)
               #:color 3)
       (points (get-points (generate-list 1000) 4)
               #:color 4)
       (points (get-points (generate-list 1000) 5)
               #:color 5)))

Bellow 是一个示例,它不会产生任何有用的东西,但我正在寻找以类似方式简化代码的东西。

(plot (list
       (axes 0 0)
       (for ([i (in-range 2 5)])
         (points (get-points (generate-list 1000) i)
                 #:color i))))

当然,任何只编写points一次函数的替代方案都会有很大帮助。

标签: racket

解决方案


尝试for/list而不是for那里:

(plot (list
       (axes 0 0)
       (for/list ([i (in-range 2 5)])
         (points (get-points (generate-list 1000) i)
                 #:color i))))

for循环丢弃 body-expression 在每次迭代中产生的值,而循环for/list将它们放入一个列表中,并返回该列表,以便所有点都包含在 的输入中plot

(顺便说一下,这个嵌套列表是可以的,因为plot允许 arenderer-tree作为输入。)


推荐阅读