Scheme & SICP
文章平均质量分 82
nomasp
Android 工程师
展开
-
【SICP归纳】6 副作用与环境模型
虽说叫做副作用显得不太好听,但在Lisp中副作用还是非常重要的。而相对于所有状态都必须显式地操作和传递额外参数的方式,如果引进赋值和将状态隐藏在局部变量中,那么就可以用更加模块化的方式来构造系统。正如你所知道的,不用任何赋值的程序设计称为函数式程序设计。相反,广泛采用赋值的程序设计称为命令式程序设计。在C等命令式程序设计语言中,我们往往都要仔细考虑变量赋值的顺序,尤其是在循环中,但在函数式程序设计中原创 2015-03-28 10:38:51 · 4670 阅读 · 0 评论 -
【SICP归纳】3 层次性数据和符号数据
如果你在函数的描述中做些改变,它更可能是由相应的变化所捕获,在这里语言也会自动在下一级别执行,因为你已经完全控制了这一个层次。所以如果不是在谈论一个具体的函数,比如说Beside,那么你便拥有全局的控制,所以如果去进行一点点的改变,更可能的便是你的方法将有能力去捕获、去适应这一改变。对于由表,亦或是由符号来构造的软件的方法,去设计过程与其说是实现一个程序,不如说是构造一门语言。原创 2015-03-15 15:15:02 · 4935 阅读 · 0 评论 -
【SICP归纳】2 高阶函数和数据抽象
上一篇博文对应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么。书中展示了很多有趣的句法(syntax)。现在我们要让思想进一步的抽象,写这篇博客的时候并未学完整本书,更不敢说对书中的内容有一个多深的领悟。但我一路学习过来,就感觉书中的示例越来越抽象,作者所引导我们的也是如此方向。博文也会持续更新下去,伴随着我的见解。在这个专栏的【Scheme归纳】4 高阶函数中已经初步介绍了什么原创 2015-03-14 15:35:55 · 8065 阅读 · 0 评论 -
【Scheme归纳】4 高阶函数
高阶函数的英文名称是Higher Order Function,它们是以函数为参数的函数。主要用于映射(mapping)、过滤(filtering)、归档(folding)和排序(sorting)表。高阶函数让程序更具模块性,让函数更加通用。 函数sort具有2个参数,一个是需要排序的表,另一个是定序(Ordering)函数。下面展示了按照大小将一个整数表正序排序。而<函数就是本例中函数的定序函数。原创 2015-03-12 14:10:50 · 7516 阅读 · 0 评论 -
【Scheme归纳】3 比较do, let, loop
对象的比较eq?这个函数用来比较2个对象的地址,如果相同的话就返回#t。在Scheme中真用#t表示,假则用#f。 例如,(eq? str str)返回#t,因为str本身的地址的是一样的,但是”scheme”和”scheme”则被存储在不同的地址中,因此函数返回#f。注意,不要用eq?来比较数字,因为在R5RS和MIT-Scheme中均没有被指定返回值,建议使用eqv?或者=代替。以下是一些示例原创 2015-03-12 14:06:16 · 13093 阅读 · 0 评论 -
【SICP归纳】1 过程和代换模型
在这里我并不打算去介绍书中的诸如前缀表达式等等知识,因为书中的讲解已经非常完美了,我才疏学浅就不再往博客上堆了。我就归纳一点总结而已。《计算机程序的构造和解释》这本书的目标并不是讲解一门编程语言的语法等,它是一种方法。不是在向你陈述知识,而是在教你如何做到想要做的东西。它是一个过程,一个精神。这些引导过程的东西就是所谓的程序规则的模式。如果说程序是一种法术,那么控制神奇的法术就是过程。因此我们需要一原创 2015-03-12 22:56:45 · 8605 阅读 · 0 评论 -
【Scheme归纳】6 赋值
赋值--因为Scheme是函数式语言,通常来说,你可以编写不使用赋值的语句。然后如果使用赋值的话,有些算法就可以轻易实现了。尤其是内部状态和继续(continuations)需要赋值。R5RS中规定的用于赋值的特殊形式是set!,set-car!,set-cdr!,string-set!,vector-set!等。因为赋值改变了参数的值,因此它具有破坏性(destructive)。在Scheme中,具原创 2015-03-12 14:26:28 · 5887 阅读 · 0 评论 -
【Scheme归纳】5 数据结构
Scheme的数据结构----------- 在前面的博文中我们使用了list等等,像其他的编程语言一样,Scheme也有字符(Character),字符串(String),符号(Symbol),向量(Vector)等数据结构。下面我们来一一介绍。 字符-- 在某个字符前添加#\来表面该物是一个字符。例如,#\a表示字符a。\Space,#\Tab,#\Linefeed,#\Return分别原创 2015-03-12 14:20:18 · 4894 阅读 · 0 评论 -
【Scheme归纳】1 使用Edwin
Edwin介绍Edwin是MIT Scheme系统的一个窗口式的编辑使用前端。启动Edwin实际是先启动Scheme系统,再启动也给Edwin前端。Edwin是一个使用Scheme写的交互式编辑器,其特点是支持Scheme表达式的编辑和求职。两种模式Edwin模式: 编辑Scheme文件的模式,如果装入一个.scm文件,相应的Edwin的这个编辑区处于Edwin模式。这种模式下可以编写Scheme原创 2015-03-12 13:53:06 · 5353 阅读 · 0 评论 -
【Scheme归纳】7 常用关键字
display-------在common lisp中有format,在scheme中则有display,轻松应对各种输出。```(display(+ 1 2 3 4))10;Unspecifiedreturn value(display‘(1 2 3 4))(12 3 4);Unspecifiedreturn value``` newline------原创 2015-03-12 14:28:00 · 5884 阅读 · 0 评论 -
【SICP归纳】4 模式匹配和以规则为基础的代换
在书中符号数据一节中,作者写了关于微积分的演算规则的程序。这是一个很程序化的程序,我们所做的是在讲这些(数学)规则翻译成计算机语言。因为它有程序化的行为和结构,那么存在其他的方法使书写这个程序更加清晰吗?这些规则都具有左右两侧。左侧是我们想要采取的导数的表达式,有右边则是其的替代。用可以匹配的模式,和能够代换的框架,可以得到新的表达式。所以这意味着模式是对源表达式的匹配,并且规则的应用的结果是去产生原创 2015-03-23 20:24:27 · 5457 阅读 · 0 评论 -
【SICP归纳】5 泛型运算符
关于数据抽象,有两个很重要的思想。一是在构建一些水平的抽象障碍在这个系统中。用某些对象来代换这些单独使用的抽象屏障。二是当需要使用某种形式的数据对象时,往往可以由其他人来将其实现,而我们并不需要知道具体操作。这都是在数据抽象方面非常强大的编程方法。但是这还不足以完成一个真正复杂的系统。在这里的问题出在“其他人”,作者常举的例子是Georges。归结来说,有很多人都工作在这个系统上,但所有的这些设计表原创 2015-03-23 20:47:46 · 4854 阅读 · 0 评论 -
【Scheme归纳】2 算数运算
函数quotient用于求商数(quotient)。函数remainder和modulo用于求余数(remainder)。函数sqrt用于求参数的平方根(square root)。以下是一些示例:原创 2015-03-12 13:59:06 · 5372 阅读 · 0 评论 -
从Hello World到defmacro,那些令人惊叹的代码!
前言自从看到那个征文活动便灵感突现,这是个为大家介绍Lisp语言的机会,也是个赞扬最让我心动的语言的机会。毕竟还是学生党,还未有太多时间来学习它,但内心满满的都是热爱与兴奋。文中如有疏漏,还请各位指教!一次偶然在《黑客与画家》第二版中了解到这门神奇的语言,瞬间便被”洗脑“,立刻找到一大堆资料,前前后后的兴奋的学了几个月,无奈于就业压力,还是选择先将C++/Java等作为主力。这篇文章主要面向没见过L原创 2015-09-16 16:08:28 · 4463 阅读 · 4 评论