每当我看到函数返回函数时,返回的函数总是一个lambda。我想知道我是否可以让我的函数返回一个具有名称的函数。
答案 0 :(得分:5)
您尝试使用的语法是正确的,只需使用内部函数的名称作为外部函数返回的值。例如,你可以写:
(define (incrementer x)
(define (adder y)
(+ x y))
adder)
(define incrementer-by-1 (incrementer 1))
(define incrementer-by-2 (incrementer 2))
(incrementer-by-1 3)
(incrementer-by-1 10)
(incrementer-by-2 15)
正如评论所说,请记住(define (f x) y)
只是(define f (lambda(x) y))
的缩写,前一个函数相当于:
(define (incrementer x)
(lambda (y)
(+ x y)))
作为另一个例子,您可以返回之前定义的函数:
(define (make-positive x)
(abs x))
(define (make-negative x)
(- (abs x)))
(define (same-signer x)
(if (>= x 0)
make-positive
make-negative))
((same-signer 3) -2)
答案 1 :(得分:0)
这是一个小例子。
#lang racket
(define (fun1) "Function 1")
(define (fun2) "Function 2")
(define (number->function n)
(cond
[(= n 1) fun1]
[(= n 2) fun2]
[else (error 'number->function "expected 0 or 1 as input")]))
(number->function 1)
((number->function 1))
输出结果为:
#<procedure:fun1>
"Function 1"