TLS 02 Do it, Do it Again, and Again, and Again...

[The Little Schemer] 02 Do it, Do it Again, and Again, and Again…

About condition, loop and recursive.

Question-01: 判断列表 l 中的所有 S-expression 是否都是 atom

Question-02: 判断 S-expression 'a' 是否是列表 l 中的一个 S-expression

示例程序

lat?

1
2
3
4
5
6
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
1
2
3
4
(lat? (quote (a b c)))
; #t
(lat? (quote (x (a b c) y z)))
; #f

member?

1
2
3
4
5
6
(define member?
(lambda (a lat)
(cond
((null? lat) #f)
(else (or (eq? a (car lat))
(member? a (cdr lat)))))))
1
2
(display (member? (quote c) (quote (a b c))))
; #t

Lat? 函数分析

Cond 条件表达式

1
2
3
4
5
6
(cond
(<p1> <e1>)
(<p2> <e2>)
...
(<pn> <en>)
(else <ee>))

\(p_i\) 表示 Propositional Expression(命题表达式),其值为布尔值;\(e_i\) 表示 Expression(表达式)。

else 总是为 \(T\)

a conditional expression has the form: \[ (p_1\to e_1,\cdots,p_n\to e_n) \] 从左到右依次检查 \(p_i\)。如果 \(p_k\)\(T\)\(\forall j < k:p_j\ \text{is not undefined}\),则条件表达式的值为对应的 \(e_k\) 的值。如果 \(p_k\)\(T\)\(\exist j < k:p_j\ \text{is undefined}\),或 \(\forall i: p_i=F\),则条件表达式的值为 \(\text{undefined}\)。 例如: \[ (2 < 1\to 4,2 > 1\to 3)=3 \] \[ (2 < 1\to 3,2 > 1\to\frac{0}{0})\ \text{is undefined} \] \[ (2 < 1\to 3,4 < 1\to 4)\ \text{is undefined} \] \[ (\frac{0}{0}==0\to 1, 2 > 1\to 2)\ \text{is undefined} \]

第一个问题

询问 l 是否为 NULL,是则返回 #t 的值,否则询问下一个问题。

1
((null? l) #t)

第二个问题

询问 l 的第一个 S-expression 是否为 atom,是则执行 (lat? (cdr l)),即调用 lat? 函数对 (cdr l) 进行判断,否则询问下一个问题。

1
((atom? (car l)) (lat? (cdr l)))

第三个问题

询问 else 是否为 \(T\),由于 else 总是为 \(T\),因此返回 #f 的值。

1
(else #f)

The First Commandment (prelimilary)

当对一个原子列表 lat 进行递归调用时,询问两个问题 (null? lat)else