学习scheme是为了学习了解函数式编程,目前看的是入门教材计算机程序的构造和解释(SICP)。
求值顺序
|
|
求值(square (+ 2 3))
可能有2种求值方式:
1 正则序求值:先展开而后规约
2 应用序求值:先求值参数而后应用
可以用下面的方法判断一个解释器采用的是正则序还是应用序的进行求值运算的。
lambda和let结构
|
|
let则更近一步,将实参写入形参
可以类比js函数默认值,js提供改变形参的能力。说明此处let和js里let作用不一样!
拓展阅读:λ演算、各种组合子
let和let*、letrec
|
|
等价的js代码
模式匹配
提供比if
,cond
更好的代码分支结构
语法扩展define-syntax
例如定义一个while循环:
其它总结
语法方面:->
:类型转化,例如(string->number "1")
[]
:等同于()
但必须成对出现,主要让代码方便阅读,总比一大堆()
看起来好看吧?
:类型判断,比如equal?
,number?
'(a b c)
:list,相当于(list a b c)
当然我只看了前3章,有些东西也没细看。结合前几张内容总结一些知识点如下(目前有些东西不太理解,可能以后再看时稍微好理解一点):
高阶函数、闭包、模块化、并发控制、流(惰性求值)、元编程等、流程控制call/cc、Continuation/CPS
书上的一些小例子
1.牛顿法求平方根
求x的平方根y,假设一个y,然后求y和x/y的平均值以获得更好的逼近.
测试结果如下:
2.斐波那契数列
问题描述:斐波那契数列形如1 1 2 3 5 8 13 21 34 55 89 ...
当n = 0
或 n = 1
时,F(n) = 1
,当n > 1
时, F(n) = F(n - 1) + F(n - 2)
3.一个计算最大公约数GCD的算法
欧几里得算法:令r = a % b
,则a和b的公约数也正好是b和r的公约数。
4.函数组合compose实现
类似f(x)、g(x)、h(x)
作用于同一个对象上r(x) = f(g(h(x)))
相对于javascript中,lodash的实现是while循环,相比较而言ramdba的实现更函数式,下面是一个仿照rambda实现pipe的一个示例
相应的fold-left
,类似于reduce实现
4.计算器