这个Scheme功能可以接受吗?

时间:2017-12-14 23:52:21

标签: scheme racket

所以我试图回答一个Scheme问题,该问题是定义一个函数,该函数查找一个传递给定谓词的表达式中的所有原子,即

(foo symbol? '(a (2 (c 3) 4)))
=> (a c)

(define (foo predicate expression)
  (cond [(eqv? predicate number?) (filter number? (flatten expression))]
        [(eqv? predicate symbol?) (filter symbol? (flatten expression))]))

我已经提出了以下功能,我认为它提供了正确的输出,但我想知道这是否可行,或者有更好的方法吗?

public async Task Invoke(HttpContext context)

2 个答案:

答案 0 :(得分:2)

我不明白你为什么不这样做:

(foo (lambda (v) (or (odd? v) (negative? v))) '(-5 6 8 10 11))

你如何编写你的函数它只能用两个精确的函数而不是例如:

{{1}}

答案 1 :(得分:1)

我喜欢@Sylwester的解决方案。但我认为如果数据转换更明确,函数会更清晰。也就是说,过滤的内容并不是它的术语。

(define (foo predicate expression)
  (let ((terms (flatten expression))
    (filter predicate terms)))

或者

(define (foo predicate expression)
  (define terms (flatten expression))
    (filter predicate terms))

我发现以这种方式编写函数更容易,而不是尽可能密集。