Lambda 如何编写输出函数的过程?(球拍)
如何编写输出函数的过程?(球拍)Lambda 如何编写输出函数的过程?(球拍),lambda,functional-programming,lisp,scheme,racket,Lambda,Functional Programming,Lisp,Scheme,Racket,如何编写输出函数的过程?(球拍) 这个过程会输出一个lambda吗?我希望我没有太过分: (define answer (lambda (question) (lambda (answer) `((question: ,question) (answer: ,answer))))) 然后尝试: >((用回答回答“问题”) 在REPL.中,另一种方法也可以这样做: (define (output-function) (define (f x)
这个过程会输出一个lambda吗?我希望我没有太过分:
(define answer
(lambda (question)
(lambda (answer)
`((question: ,question)
(answer: ,answer)))))
然后尝试:
>((用回答回答“问题”)
在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"))
你的意思是:我如何使用高阶函数来产生另一个函数?如果是这样,请看以下内容:
(lambda (f) (lambda (x) (f x)))
它的作用是:
1:创建以“f”作为参数初始化的匿名闭包
2:在第一个主体的范围内,创建一个以“x”作为参数的闭包
3:将f应用于x(f是x顶部的封口)
这意味着(在计算(fx)之前),f被声明为一个以x为参数的函数。将f应用于x是整个表达式返回的结果:在本例中,除了闭包之外,我们没有分配任何值,所以没有什么结果
使用此作为开始点,考虑当闭包返回另一个闭包时会发生什么:内部闭包在Outter闭包在它的身体周围传递其值之后进行评估。它被称为延迟评估(delayedevaluation),允许一个人将过程作为值传递,以便内部过程稍后可以扩展
这里有一个具体的例子,说明这是多么有益。让我们仅使用高阶函数(闭包)定义cons、car和cdr: 要理解这一点,请传递定义,但请记住(define(foo-bar)…)意味着(define-foo(lambda(bar)…)…。那么,“Scheme中的函数是什么?”?这与“程序”有何不同?或者更确切地说,“什么是程序”?回答这些问题就像。。。98%的答案:)(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)))