local有几个知识点:
1. scope
local 就是只属于本地的意思。
像下面code的运行,结果是2,而不是101
(define a 100)
(local [(define a 1)]
(+ a 1))
-->2
因为(+ a 1)是在local的括号里面,那么这个a 也是先从local里面找a
如果没找到的话在local以外找, 把local里面的a 改成 b的话,就是101
(define a 100)
(local [(define b 1)]
(+ a 1))
-->101
aaaa
2.evaluation rule
这个可以看step
aaaa
3.Encapsulation
local 的Encapsulation一般是在wrap up mutual reference的template时候用的
这里用的是mutual reference 的exapmple
可以想成是把原先的几个function放到一个组合去,然后找个经纪人(fn-for-p)
在组合里再找一个人当队长(fn-for-person)也就是trampoline。有什么person的data
先找经纪人, 经纪人再找队长, 队长再进去local里面带组合动起来
Encapsulation的好处是以前n个(signature, purpose, ....) 变成全部写一个就行
aaaa
4.Avoiding Recomputation
还是用mutual reference 的exapmple
假设我们要
find eye color of a person by name, if found produce the eye color of the person, otherwise, false
产生(X or false)的题,叫back-tracking search
这一题的话,可以写成这样
(check-expect (find-p Jack "Olivia Williams") "Brown")
(check-expect (find-p Jack "Carl CCC") false)
(define (find-p p str)
(if (string=? (person-name p) str)
(person-color p)
(find-lop (person-children p) str)))
(define (find-lop lop str)
(cond [(empty? lop) false]
[else
(if (not (false? (find-p (first lop) str)))
(find-p (first lop) str)
(find-lop (rest lop) str))]))
注意(find-p (first lop) str))这一行出现了两次
(not (false? (find-p (first lop) str)))意思是先叫find-p 去试一下, 不是false的话,就是对的
在对的情况下,再叫find-p去得到结果.
其实是在第一次尝试的时候,find-p就可以把试一下的结果用local记下来,如果结果不是
false的话,那它就是答案本身
(define (find-lop lop str)
(cond [(empty? lop) false]
[else
(local [(define try (find-p (first lop) str))]
(if (not (false? try))
try
(find-lop (rest lop) str)))]))
这样就少了一次调用(find-p (first lop) str)