这个函数显示正确的东西,但是如何让这个函数的输出成为另一个函数呢?
;;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)) )
)))
Run Code Online (Sandbox Code Playgroud)
您已经将函数作为输出返回:
(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))))))
Run Code Online (Sandbox Code Playgroud)
也许一个更简单的例子会让事情变得更加清晰.让我们定义一个调用的过程adder,该过程返回一个函数,该函数为传递的n参数添加一个数字x:
(define adder
(lambda (n)
(lambda (x)
(+ n x))))
Run Code Online (Sandbox Code Playgroud)
该函数adder接收一个被调用的参数n并返回一个新的lambda(匿名函数),例如:
(define add-10 (adder 10))
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我们创建了一个名为add-10that 的函数,using adder,返回一个我命名的新函数add-10,该函数又将添加10到其参数中:
(add-10 32)
=> 42
Run Code Online (Sandbox Code Playgroud)
我们可以在没有显式命名返回函数的情况下获得相同的结果:
((adder 10) 32)
=> 42
Run Code Online (Sandbox Code Playgroud)
还有其他等效的写法adder,也许这种语法更容易理解:
(define (adder n)
(lambda (x)
(+ n x)))
Run Code Online (Sandbox Code Playgroud)
有些解释器允许使用更短的语法来执行完全相同的操作:
(define ((adder n) x)
(+ n x))
Run Code Online (Sandbox Code Playgroud)
我刚刚演示了currying和部分应用的例子- 两个相关但不同的概念,确保你理解它们并且不要让语法混淆你.
| 归档时间: |
|
| 查看次数: |
2065 次 |
| 最近记录: |