关于在Scheme LISP中为函数创建接口的任何提示



我一直在用Chicken Scheme做一些基因编程。我一直在定义具有接口的函数,因为在内部函数可能需要迭代列表。

我想避免将所有这些细节暴露给来电者。

例如:

(define (find-errors trees target)
(define (error-loop evaluated-trees trees-to-evaluate target)
(if (equal? (length trees-to-evaluate) 0)
evaluated-trees
;pop tree from head of trees-to-evaluate, add it to evaluate-trees, call loop again
)
(error-loop (list) trees target)
)

也许这个循环函数看起来不太复杂,但会有更复杂的循环,需要更多的参数。我只是想避免将额外的信息暴露给调用其他函数的函数。

有更惯用的方法吗?这似乎是一个彻底的风格指南,但我找不到函数接口的参考。

例如,这更可取吗?如果我要在它使用的地方之外有一个循环,那么用某种方式命名函数,让人们知道它是供内部使用的,这有意义吗?

(define (_error-loop evaluated-trees trees-to-evaluate target)
(if (equal? (length trees-to-evaluate) 0)
evaluated-trees
;pop tree from head of trees-to-evaluate, add it to evaluate-trees, call loop again
)
(define (find-errors trees target)
(_error-loop (list) trees target)
)

感谢

在递归函数以一些顶级函数的参数和可能的额外累加器参数开始的特殊情况下,名为let的是非常宝贵的语法糖:

(define (find-errors trees target)
(let loop ((evaluated-trees '())
(trees-to-evaluate trees))
(if (null? trees-to-evaluate)
evaluated-trees ; possibly (reverse evaluated-trees)
(loop (cons (evaluate-error (car trees-to-evaluate) target) evaluated-trees)
(cdr trees-to-evaluate)))))

map在这里也很适合,完全消除了显式循环:

(define (find-errors trees target)
(map (lambda (tree) (evaluate-error tree target)) trees))

不过,通常情况下,在函数内部使用let[rec]define来定义私有助手函数与使用顶级定义在很大程度上是一个偏好、风格和意见的问题,因此并不是Stack Overflow的主题。

最新更新