此函数显示正确的内容,但如何使此函数的输出成为另一个函数?
;;generate an Caesar Cipher single word encoders
;;INPUT:a number "n"
;;OUTPUT:a function, whose input=a word, output=encoded word
(define encode-n
(lambda (n);;"n" is the distance, eg. n=3: a->d,b->e,...z->c
(lambda (w);;"w" is the word to be encoded
(if (not (equal? (car w) '()))
(display (vtc (modulo (+ (ctv (car w)) n) 26)) ))
(if (not (equal? (cdr w) '()))
((encode-n n)(cdr w)) )
)))
答案 0 :(得分:7)
你已经将一个函数作为输出返回:
(define encode-n
(lambda (n)
(lambda (w) ; <- here, you're returning a function!
(if (not (equal? (car w) '()))
(display (vtc (modulo (+ (ctv (car w)) n) 26))))
(if (not (equal? (cdr w) '()))
((encode-n n)(cdr w))))))
也许一个更简单的例子会让事情变得更清楚。让我们定义一个名为adder
的过程,该过程返回一个函数,该函数将n
加到x
传递给(define adder
(lambda (n)
(lambda (x)
(+ n x))))
的参数:
adder
函数n
接收一个名为lambda
的参数,并返回一个新的(define add-10 (adder 10))
(一个匿名函数),例如:
add-10
在上面的代码中,我们创建了一个名为adder
的函数,使用add-10
返回一个名为10
的新函数,该函数又将(add-10 32)
=> 42
添加到((adder 10) 32)
=> 42
其参数:
adder
我们可以在不明确命名返回函数的情况下获得相同的结果:
(define (adder n)
(lambda (x)
(+ n x)))
还有其他等效方法可以编写(define ((adder n) x)
(+ n x))
,也许这种语法更容易理解:
{{1}}
一些解释器允许使用更短的语法来执行完全相同的操作:
{{1}}
我刚刚演示了currying和partial application的示例 - 两个related but different概念,确保您理解它们并且不要让语法混淆您。