在球拍中使用lambda进行迭代?

时间:2016-07-05 16:29:37

标签: lambda scheme lisp racket

这可能是一个简单的问题,但我似乎无法弄明白。 在下面的示例中,我想创建一个递归创建项列表的函数list-of-obj

示例:

> (list-of-obj 'a 5)
'(a a a a a)

代码:

#lang racket
(define (list-of-obj obj n)
  (letrec ((helper
           (lambda (obj n result)
             (if (> n 0)
               (helper obj (- n 1) (cons obj result))
               result))))
      helper obj n 0))

然而,这导致0的输出。有什么指针吗?我是球拍/计划的新手。

1 个答案:

答案 0 :(得分:5)

Racket中最惯用的解决方案是:

(make-list 5 'a)
=> '(a a a a a)

也就是说,如果内置功能可以满足您的需求,则不应重新发明轮子。但如果你需要从头开始编写,这应该可以解决问题:

(define (list-of-obj obj n)
  (letrec ((helper
            (lambda (obj n result)
              (if (> n 0)
                  (helper obj (- n 1) (cons obj result))
                  result))))
    (helper obj n '())))

您的代码存在两个问题:

  • helper的调用必须由()包围,因为这就是您调用Scheme中的过程的方式。
  • 累加器的初始值必须是一个空列表,因为我们正在构建一个列表作为输出,而不是像你一样构建0