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



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

这个过程会输出一个lambda吗?

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

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

1:创建一个以"f"初始化的匿名闭包

2:在第一个体的作用域中,创建一个以"x"作为参数的闭包

3: apply f to x (f为x上的闭包)

这意味着(在(f x)求值之前),f被声明为一个函数,其参数为x。对x应用f是整个表达式返回的结果:在这种情况下,没有什么,因为除了闭包之外我们没有赋任何值。

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

这里有一个具体的例子来说明这是多么有益。让我们只使用高阶函数(闭包)定义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)…)意味着(define foo (lambda (bar)…))…

希望我没有太剧透:

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

然后尝试:

> ((answer 'thequestion) 'withananswer)

在REPL。

另一种方法:

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

你可以这样测试:

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

这样想。从函数输出一个数字很容易:

(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"))

最新更新