网络书屋(Web Reading Room)

A blogging framework for hackers.

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.

  1. 直觉认识proc,提取body。
  2. 对比识别。
  3. 加壳。
  4. 三行表格,n列迭代。
1
2
3
4
(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和程序即数据的思想。

所有的函数和数据犹如花生的壳和仁的关系。

peanut

只有加壳就相当于是创建一层抽象,把类似的东西包裹起来,或者也可以换着一种思路 (每个壳里面都包着类似的花生仁,只不过可能存在些许不同)

Two similar functions

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
; 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)))]))

加壳

加上一个函数皮,并封上一层。

1
2
3
4
5
6
7
; 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)))]))

然后我们就可以类似的改写了

1
2
3
4
5
6
7
8
9
10
; 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))

这个典型的过程就是函数抽象。进一步可以参考HowToDesginProgramTheLittleScheme. Note: 你需要解析的其实是花生仁,但是你不得不先把壳打开或者通过另外一种方式,比如红外线等技术把它识别出来。

也就是说进一步归纳的话,你首先得recognise识别出来,然后才能进行解析(提取其中的蛋白质、脂肪、热量等)。

mybaby

保护它的壳,给它提供营养,防止它受到感染和伤害。

表格转换链接.

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列迭代)理解递归迭代的过程,在一定的时间,进行一系列的列计算,并让时间推进,直到满足你想要的结果。