# 斯坦福编程范式 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))))) |