Scheme - 如何返回函数?

Phi*_*ego 0 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))  )     
  )))
Run Code Online (Sandbox Code Playgroud)

Ósc*_*pez 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))))))
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部分应用的例子- 两个相关但不同的概念,确保你理解它们并且不要让语法混淆你.