program-as-data
A program is like an essay. The first version is a draft, and drafts demand editing. Program is also can be seen as data.
- 直觉认识proc,提取body。
- 对比识别。
- 加壳。
- 三行表格,n列迭代。
(value-of (proc (var body)) env)
= (value-of (proc-exp (procedure (var body env)) val) env)
= (value-of body ([var=val] env))
函数其实也是expression,它可以被consume也可以被produce.凭着这个脑中的 印象是否可以帮助你继续理解abstration和程序即数据的思想。
所有的函数和数据犹如花生的壳和仁的关系。
只有加壳就相当于是创建一层抽象,把类似的东西包裹起来,或者也可以换着一种思路 (每个壳里面都包着类似的花生仁,只不过可能存在些许不同)
Two similar functions
; Los -> Boolean
; does l contain "dog"
(define (contains-dog? l)
(cond
[(empty? l) #false]
[else
(or
(string=? (first l) "dog")
(contains-dog?
(rest l)))]))
; Los -> Boolean
; does l contain "cat"
(define (contains-cat? l)
(cond
[(empty? l) #false]
[else
(or
(string=? (first l) "cat")
(contains-cat?
(rest l)))]))
加壳
加上一个函数皮,并封上一层。
; String Los -> Boolean
; determines whether l contains the string s
(define (contains? s l)
(cond
[(empty? l) #false]
[else (or (string=? (first l) s)
(contains? s (rest l)))]))
然后我们就可以类似的改写了
; Los -> Boolean
; does l contain "dog"
(define (contains-dog? l)
(contains? "dog" l))
; Los -> Boolean
; does l contain "cat"
(define (contains-cat? l)
(contains? "cat" l))
这个典型的过程就是函数抽象。进一步可以参考HowToDesginProgram和TheLittleScheme. Note: 你需要解析的其实是花生仁,但是你不得不先把壳打开或者通过另外一种方式,比如红外线等技术把它识别出来。
也就是说进一步归纳的话,你首先得recognise识别出来,然后才能进行解析(提取其中的蛋白质、脂肪、热量等)。
保护它的壳,给它提供营养,防止它受到感染和伤害。
index | 0 | 1 | 2 | … |
M | a+S | a+1*W+S | a+2*W+S | … |
f at M | f(a+S) | f(a+1*W+S) | f(a+2*W+S) | … |
Area | W*f(a+S) | W*f(a+1*W+S) | W*f(a+2*W+S) | … |
residual | 60.00% | 50.00% | 40.00% | … |
慢工才能出细活,通过三行表格n列迭代的形式(也可以进一步加大计算量变成n行表格n列迭代)理解递归迭代的过程,在一定的时间,进行一系列的列计算,并让时间推进,直到满足你想要的结果。
Related