# 斯坦福编程范式 CS107_19

# 介绍 Scheme

# 程序范式

在 C 中我们大多数是采用如下方式对对象进行操作,对过程进行编程。

Vector v;
VectorNew(&v,...);
VectorInsert(&v,...);
VectorSort(&v,...);

在 C++ 中则是面向某一个对象的。

Vector<int> v;
v.pushback(4);
v.erase(v.begin());

# 函数范式

函数听起来和程序差不多,但如果你了解程式 ( procedure ) 范式的纯粹定义,那它就是一块被调用的代码,我并不关心它的返回值。而函数范式则是面向返回值的。这里的典型语言就是 Scheme ,Scheme 等函数范式语言强调的是,你给一个数据集到主函数,主函数应该为你做一切,而那个返回值就是所有你所感兴趣的东西。

比如一个将摄氏度转换为华氏度的函数,在 Scheme 中不管 temp 是什么,都会直接替换掉式子中的 temp 并进行算数。

(define celsiums->fahrenheit(temp)	(+32(*1.8 temp)))

如果我使用 shell 来使用这个函数,传入 100,经过计算,他就会返回一个 212。

>(celsiums->fahrenheit 100)
212

Scheme 中的函数 Car,CDR,CONS,分别表示取列表中的第一个,不取列表中的第一个,将元素和一个列表合并成新的列表。

>(cons 1 '(2 3 4 5))
(1 2 3 4 5)
>(car '(1 2 3 4 5))
1
>(cdr '(1 2 3 4 5))
(2 3 4 5)

但是 CONS 只能是第一个元素是单个,第二个元素是列表,才能合成一个新的列表。我们可以使用 append 来实现。

>(cons '(1 2) '(3 4))
((1 2) 3 4)
>(append '(1 2) '(3 4) '(5 6) '(7 8))
(1 2 3 4 5 6 7 8)
>(append '(2 3) (list 1) '(4 5))
(2 3 1 4 5)

构造一个 sum-of 函数,包含一个递归关系:如果列表 numlist 是空的就返回 0

>(sum-of '(1 2 3 4))
(define sum-of (numlist)
  (if (null? numlist) 0
      (+(car numlist)
        (sum-of(cdr numlist)))))