从 Scheme 中的列表中收集最小值和最大值范围内的元素

Gathering elements in range of Min and Max values from a list in Scheme

我是 Scheme 的新手,目前没有使用(Racket 版本),因此我没有过滤器等内置功能

我现在的任务是从我输入的列表中取出元素,并且只取出那些高于我的 MinValue 和低于我的 MaxValue 的元素

例如在我的 "lst" 变量中我有 (2 4 1 6 5 4 7 3)

在我的 "MinValue" 我有 2

在我的 MaxValue 我有 5

所以现在在我应用类似

的东西之后
 (remove (< # minVal) lst)

从技术上讲,它应该删除并遗漏:

(2 4 4 3)

但我收到错误消息:

READ from #<INPUT CONCATENATED-STREAM #<INPUT STRING-INPUT-STREAM> #<IO TERMINAL-STREAM>>: objects printed as # in view of *PRINT-LEVEL* cannot be read back in

主要问题:

当使用 remove/remove-if 函数时,Scheme 是否有像 # 这样的特定定义变量,它会遍历列表,所以我可以使用它?

有没有办法让它以这种方式工作:

(remove (< # minVal) lst)

谢谢!

标签 "homework" 应该在那里,但我还不能创建它

我知道的几乎所有 Scheme 都包含一个 filter 过程,它不是特定于 Racket,你应该能够使用它(remove 不是这项工作的正确工具)。

只需传递一个 lambda 依次接收每个元素,您可以设置任何条件来确定输出列表中的元素:

(filter (lambda (e) (and (>= e 2) (< e 5)))
        '(2 4 1 6 5 4 7 3))

=> '(2 4 4 3)

没有 # 变量遍历列表并依次为您提供每个元素,为此您必须使用递归显式遍历列表,或使用内置过程之一期待一个列表和一个 lambda - lambda 的参数代表每个元素。

如果由于某种原因不允许您使用 filter,从头开始实现它很容易,再次注意我们不需要使用 remove,并且 pred 被每个元素调用:

(define (filter pred lst)
  (cond ((null? lst) '())
        ((pred (car lst))
         (cons (car lst) (filter pred (cdr lst))))
        (else (filter pred (cdr lst)))))