所以我对Racket的介绍感到有些困惑。
我需要编写一个名为" extend"的函数。这需要一个元素和一个谓词,并且"扩展"包含元素的谓词。例如:
((extend 1 even?) 1)
#t
((extend 3 even?) 3)
#f
我对这门语言比较陌生,但我不明白如何使用函数或作为谓词返回。不确定我是否过度思考它或者是什么。
答案 0 :(得分:2)
函数只是一个值,而extend
只是一个变量,如+
和cons
,它们计算为函数值。函数可以作为参数传递,你可以使用你给它的任何名称,就像它是一个函数一样,通过使用括号,它只是起作用。
函数返回最后一个表达式求值的值。为了使它成为一个函数,它需要是一个计算函数的变量或一个也计算函数的lambda。
(define (double-up fn)
(lambda (value)
(fn (fn value)))) ; see. Just use fn as if it is a procedure
((double-up add1) 4) ; ==> 6
(define add2 (double-up add1))
(add2 4) ; ==> 6
(define error-use (double-up 5)) ; works like a charm
(error-use 4)
; Signals "application: not a procedure"
; since `5` isn't a procedure.
这是另一个与你的作业更相似的例子。它需要一个数字,然后返回一个带有另一个数字然后将它们加在一起的函数。在这里,我选择在本地定义它,然后将其作为最后一次尝试,以便它成为结果。
(define (make-add initial-value)
(define (adder new-value)
(+ initial-value new-value))
adder) ; this is the result
((make-add 5) 7) ; ==> 12
谓词是我们称之为条件中谓词位置的函数(如if
和cond
)。因此,只是一个返回#t
或#f
并且经常绑定到以问号结尾的变量作为命名约定的函数。