Scheme,将lambda作为函数参数传递 - 需要帮助理解args

时间:2012-04-27 01:23:29

标签: scheme arguments

这是一项家庭作业:

  

返回一个列表,其中包含满足给定谓词的给定列表的所有元素。例如,

(filter (lambda (x) (< x 5)) '(3 9 5 8 2 4 7)) 
     

应该返回(3 2 4)。

我昨天刚开始计划,所以我是一个完整的菜鸟。如果我理解正确调用此函数函数的语法,则“filter”是函数,“(lambda(x)(&lt; x 5)”是参数。这类似于java中的匿名函数吗?

编辑:

我从stackoverflow上的另一篇文章中找到了一些代码。他们直接回答了这个问题:这是他们写的:

   (define (my-filter pred lst)
     (cond ((null? lst) null)
       ((pred (first lst))
          (cons (first lst) (my-filter pred (rest lst))))
       (else (my-filter pred (rest lst)))))

哪个好,哪个有效,但在我使用它之前我想了解它。 “pred”是一个函数,但在这种情况下,它们正在传递(&lt; x 5)它并且它以某种方式接受这个值。我不明白。

有人可以向我解释一下这个节目会发生什么吗?我不明白正在发生的事情背后的逻辑。

4 个答案:

答案 0 :(得分:5)

其他答案都是正确的。另外,如果它对你有帮助,这个程序意味着同样的事情:

#lang racket

(define (less-than-five x) (< x 5))

(filter less-than-five '(3 9 5 8 2 4 7))

这里的Scheme / Racket和Java的主要区别在于

less-than-five

是一个值;在Java中,方法不是值。

编辑:我看到你在问题中添加了一堆。我对你印象深刻 有后续问题,而不仅仅是拿你得到的东西:)

我认为回答这个问题的最佳方法是关注你时会发生什么 进行函数调用,并使用...步进器!

哎呀,哎呀。我拍了一段视频,然后在YouTube上拍了一下:

http://youtu.be/2hmamosiqGI

答案 1 :(得分:1)

是的,您正在调用filter函数,其中一个参数是(lambda (x) (< x 5))。 (还有另一个参数,你的数字列表。)是的,它非常像一个用Java中的单个方法的匿名类。

答案 2 :(得分:1)

是的,lambda定义了方案中的一个功能。如果函数没有按名称分配给变量,那么它基本上与匿名函数相同。

答案 3 :(得分:0)

以下是使用Google的Guava库的Java问题的一个简单示例:

Iterables.filter(asList(3,9,5,8,2,4,7), new Predicate<Integer>() {

    @Override
    public boolean apply(Integer a) {
        return a < 5;
    }

});

我提出来表明Java没有匿名函数,而是匿名类。 Java没有作为第一类数据类型的函数。我提出这个问题是因为如果你选修了一门课程(我认为你是这样的话),那么很可能会在考试时提出这个问题。