您可以注意到函数体中lambda中的v,v来自哪里,它基于什么
(define (cached-assoc xs n)
(letrec ([memo (make-vector n #f)]
[acc 0]
[f (lambda(x)
(let ([ans (vector-assoc x memo)])
(if ans
(cdr ans)
(let ([new-ans (assoc x xs)])
(begin
(vector-set! memo acc (cons x new-ans))
(set! acc (if (= (+ acc 1)) 0 (+ acc 1)))
new-ans)))))])
(lambda (v) (f v))))
整个表达式返回一个lambda
作为结果,在该lambda
中有一个名为v
的形式参数。它还没有值,您需要调用lambda
将值绑定到v
并产生结果(假设代码正在工作):
((letrec ([memo (make-vector n #f)] ; notice the extra opening `(`, we want to call the returned lambda
[acc 0]
[f (lambda(x)
(let ([ans (vector-assoc x memo)])
(if ans
(cdr ans)
(let ([new-ans (assoc x xs)])
(begin
(vector-set! memo acc (cons x new-ans))
(set! acc (if (= (+ acc 1)) 0 (+ acc 1)))
new-ans)))))])
(lambda (v) (f v)))
10) ; <- the value 10 gets bound to `v`
但是,您的代码不正确。您引用的是名为n
和xs
的变量,但它们没有在任何地方定义,需要自己的值。程序vector-assoc
不存在。此外,末尾的lambda
是多余的,您可以简单地返回f
,不需要将其封装在额外的lambda
中。最后:你应该用一个名字define
整个表达式,这样会更容易调用它
我不会详细介绍,因为首先你需要修复函数并使其工作,而且根本不清楚你想做什么,但这应该是一个单独的问题。