争论从何而来



您可以注意到函数体中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`

但是,您的代码不正确。您引用的是名为nxs的变量,但它们没有在任何地方定义,需要自己的值。程序vector-assoc不存在。此外,末尾的lambda是多余的,您可以简单地返回f,不需要将其封装在额外的lambda中。最后:你应该用一个名字define整个表达式,这样会更容易调用它

我不会详细介绍,因为首先你需要修复函数并使其工作,而且根本不清楚你想做什么,但这应该是一个单独的问题。

相关内容

  • 没有找到相关文章

最新更新