如何编写输出函数的过程? (球拍)
程序会输出lambda吗?
答案 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"))