你如何编写一个输出函数的程序? (球拍)

时间:2011-11-02 02:39:08

标签: lambda functional-programming lisp scheme racket

如何编写输出函数的过程? (球拍)

程序会输出lambda吗?

4 个答案:

答案 0 :(得分:4)

你的意思是:我如何使用高阶函数来产生另一个函数?如果是这样,请看一下:

(lambda (f) (lambda (x) (f x)))

这是做什么的:

1:创建一个用“f”作为参数初始化的匿名闭包

2:在第一个体的范围内,创建一个以“x”作为参数的闭包

3:将f应用于x(f为x顶部的闭包)

这意味着(在评估(f x)之前),f被声明为一个函数,其中x为其参数。将f应用于x是整个表达式返回的内容:在这种情况下,除了闭包之外我们没有分配任何值。

以此作为起点,考虑当闭包返回另一个闭包时会发生什么:内部闭包在外部闭包在其体内传递其值后进行评估。它被称为延迟评估,并允许一个人将过程作为值传递,以便内部过程可以在以后扩展。

这是一个具体的例子,说明这是多么有益。让我们只使用更高阶函数(闭包)来定义cons,car和cdr:

(define (cons kar kdr) (lambda (kons) (kons kar kdr)))
(define (car kons) (kons (lambda (kar kdr) kar)))
(define (cdr kons) (kons (lambda (kar kdr) kdr)))

要理解这一点,请传递定义但请记住(define(foo bar)...)表示(定义foo(lambda(bar)...))...

答案 1 :(得分:2)

我希望我不会太过苛刻:

(define answer
  (lambda (question)
    (lambda (answer)
      `((question: ,question)
        (answer: ,answer)))))

然后尝试:

> ((answer 'thequestion) 'withananswer)

在REPL。

答案 2 :(得分:2)

另一种方法:

(define (output-function)
  (define (f x)
    x)
  f)

你可以这样测试:

(define test (output-function))
(test 10) ; returns 10

答案 3 :(得分:2)

以这种方式思考。从函数输出数字很容易:

(define (output-num x) 7)

我们也可以预定义输出:

(define num 7)
(define (output-num x) num)

现在很容易看到如何输出一个函数 - 只需在体内引用它。

(define (a-function x) "hello")
(define (output-function y) a-function)

而且,就像文字数字一样,我们可以使用lambda在定义的正文中编写我们的函数:

(define (output-function y) (lambda (x) "hello"))