《The Little Schemer》知识点整理(十):值是什么

TODO: 未完成

准备知识

  1. entry:是列表组成的 pair。其中第一个列表是 set,且两个列表的长度必须相等。看上去有点像一组一一对应关系。回顾一下第 7 章里对 pair 和 set 的定义。
  2. table:是 entry 组成的的列表。空 table 用 () 表示。
  3. 6 种类型
    • *const: 数字,#t,#f,操作符等
    • *quote: (quote …)
    • identifier: 原子中除const 类型以外的其他类型
    • *lambda: 函数
    • *cond: 条件
    • *application: 应用

自定义函数

(lookup-in-entry name entry entry-f)

定义:name 是可能存在于 entry 第一个列表中的值,如果存在,则函数返回第二个列表中对应位置的上的值;如果不存在,我们用另一个函数 entry-f 来调用 name

实现:

1
2
3
4
5
6
(define lookup-in-entry
(lambda (name entry entry-f)
(lookup-in-entry-help name
(first entry)
(second entry)
entry-f)))

lookup-in-entry-help 是一个辅助函数:

1
2
3
4
5
6
7
8
9
10
(define lookup-in-entry-help
(lambda (name names values entry-f)
(cond
((null? names) (entry-f name))
((eq? (car names) name)
(car values))
(else (lookup-in-entry-help name
(cdr names)
(cdr values)
entry-f)))))

(lookup-in-table name table table-f)

定义:大致同 lookup-in-entry,不过这个函数会按照顺序搜索 entry 列表,返回第一个结果。

实现:

1
2
3
4
5
6
7
8
9
10
(define lookup-in-table
(lambda (name table table-f)
(cond
((null? table) (table-f name))
(else (lookup-in-entry name
(car table)
(lambda (name)
(lookup-in-table name
(cdr table)
table-f)))))))

(expression-to-action e)

1
2
3
4
5
(define expression-to-action
(lambda (e)
(cond
((atom? e) (atom-to-action e))
(else (list-to-action e)))))

– EOF –