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

Fat*_*ama 2 scheme arguments

这是一项家庭作业:

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

(filter (lambda (x) (< x 5)) '(3 9 5 8 2 4 7)) 
Run Code Online (Sandbox Code Playgroud)

应该返回(3 2 4).

我刚刚开始计划,所以我是一个完整的菜鸟.如果我正确理解了这个函数函数的语法,那么"filter"就是函数,"(lambda(x)(<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)))))
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*nts 5

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

#lang racket

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

(filter less-than-five '(3 9 5 8 2 4 7))
Run Code Online (Sandbox Code Playgroud)

Scheme/Racket和Java之间的关键区别在于

less-than-five
Run Code Online (Sandbox Code Playgroud)

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

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

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

哦,到底是什么.我拍了一段视频,然后在YouTube上拍了一下:

http://youtu.be/2hmamosiqGI