Scheme - 如何返回函数?

时间:2014-04-18 21:07:36

标签: scheme

此函数显示正确的内容,但如何使此函数的输出成为另一个函数?

 ;;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))  )     
  )))

1 个答案:

答案 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}}

我刚刚演示了curryingpartial application的示例 - 两个related but different概念,确保您理解它们并且不要让语法混淆您。