这给了我一些大脑重击:
user> (repeatedly 10 #((memoize rand-int) 10))
(7 0 4 8 1 2 2 1 6 9)
user> (repeatedly 10 (partial (memoize rand-int) 10))
(8 8 8 8 8 8 8 8 8 8)
我想知道原因是否因为函数文字(第一版)每次被调用/评估,因此memoize
每次都被“重新创建”(重新记忆),因此不是真的有任何真正有意义的“记忆”,而第二个partial
实际上返回一个只评估一次的固定函数,因此每次使用相同的memoize
值(排序)虽然我不认为这有资格作为一个真正的“封闭”)
我是否正确思考?
答案 0 :(得分:5)
是的,memoize
不会以任何方式修改其论点,所以
#((memoize rand-int) 10)
在每次调用时重新创建memoized函数。
(fn [] ((memoize rand-int) 10))
等同。
要从另一个函数调用memoized函数,您需要将它放在Var或封闭的本地函数中:
(repeatedly 10 (let [r (memoize rand-int)] #(r 10)))
;= (2 2 2 2 2 2 2 2 2 2)
在partial
示例中,(memoize rand-int)
返回的函数作为参数传递给函数partial
,然后函数返回一个闭包,该闭包在{{1}的返回时关闭}。所以,这与上面的示例非常接近((memoize rand-int)
返回的闭包使用partial
来调用memoized函数)。