争论从何而来?
Where is the argument coming from?
大家可以注意到函数体中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))))
整个表达式 return 结果是一个 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
是多余的,你可以简单地returnf
,没有必要把它换成额外的lambda
。最后:您应该 define
为整个表达式命名,这样调用起来会更容易。
我不会详细介绍,因为首先您需要修复该功能并使其正常工作,并且根本不清楚您想要做什么 - 但这应该是一个单独的问题。
大家可以注意到函数体中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))))
整个表达式 return 结果是一个 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
是多余的,你可以简单地returnf
,没有必要把它换成额外的lambda
。最后:您应该 define
为整个表达式命名,这样调用起来会更容易。
我不会详细介绍,因为首先您需要修复该功能并使其正常工作,并且根本不清楚您想要做什么 - 但这应该是一个单独的问题。