Scheme语言--简单介绍
一年前事实上有时间看完SICP这本书,后来由于种种原因,一直没有继续再学。由于SICP中使用Scheme确实应用不多。在Java,C++的语言眼里,Scheme确实非常另类。现在MIT已经放弃了使用Scheme作为SICP的教学语言而转向python之际,我在此開始学习这本书与这门语言的学习。SICP主要使用Scheme语言来解决计算机科学中的一些问题。为了督促自己,每天都能学习。积小流而成江海,把自己的学习过程放在这里,以供自己复习。
本系列主要包含两部分Scheme语言层面的问题及SICP中的课程方面,两个部分相辅相成。今天開始Scheme语言的第一节。
Scheme简单介绍
Scheme语言是Lisp语言的一种变种,是一种表处理语言。其语法简单,easy学习,能够使使用者专著于解决这个问题而非语言本身。
1.1 基本类型
scheme支持的基本数据类型有整数,实数,分数,复数,对这些基本类型能够使用这些类型之上的各种操作如+-*/%等等。字符串””,记号quote。对于quote,(quote exp)表示exp为记号,不进行解析。常写作’exp。
List有两种类型,一种结尾元素为空表(),(list ‘a ‘b ‘c),等价与(cons ‘a (cons ‘b (cons ‘c ‘() ))),还有一种表为不正常表,表尾为结尾元素,(cons ‘a (cons ‘b ‘c)) 这样的表的值是(a b.c),.表示其后元素为表的结尾元素。
表的操作
car:取表的第一个元素
cdr:表在取car后的其余部分,对于正常表,其结果是一个表,对非正常表,结果可能是一个元素。
cons:构造表,假设第二个參数是表,则将第一个參数作为总体放在第二个參数的表中。
List:构造表,将各个參数做为总体放在一个表中。
构造正常表的还有一种方法:使用quote即’ 如’(a b c)。
1.2 变量绑定
( let ((arg1 val1) (argv2 val2) …) exp1 exp2 … )
变量绑定仅仅在当前的let表达式中有效,比如(let ((+ *)) (+ 2 3) =6)
Let操作能够嵌套运行,但绑定仅仅对let内部可见,对外层let不可见。
1.3 lambda表达式
(Lambda (arg1 …) exp1 exp2)
从演算来看,(let ((var value) …) exp1 exp2…) == ((lambda (var …) exp1 exp2 …) value … )
对于Lambda函数的參数
假设形參仅仅有一个,则能够有随意数量的实參,全部实參被格式化为一个list传给函数。
假设形參list是不正常的list的形式,则形參相应的实參被一一映射,而后的实參被格式化成一个list传给.后的形參,这也意味着,实參个数必须保证形參个数。假设形參是一个正常的list,则实參必须被一一映射。
因此((lambda (x) x) ‘a) = a 而((lambda x x) ‘a) = (a)
1.4 define定义
Define定义的是全局可见的,在scheme中,能够定义一个过程,当中使用一个没有定义的过程,这不会引起错误,但假设你使用它,就会出现错误,除非你补充定义了所引用的过程。
(define mylist (lambda x x))
1.5 条件表达式
If表达式:(if cond1 result1 result_other)
Cond表达式:( cond (test1 exp1) (test2 exp2) … (else expn ))也能够罗列全部,而不用else
Or表达式:(or exp1 exp2 …)
Not表达式:(not exp)使得#f #t之间转换。
关于类型推断:
(type? Var)能够得出var是否是type类型的,典型的类型有null,number,string,list,pair…
Eqv?能够推断两个值是否相等
1.6 递归过程
一个过程定义中调用了自己,递归过程一般分两部分,终止部分与递归部分。
1.7 map操作
( map fun argv …)
映射操作将fun应用到agv..的各个元素上,并返回一个list。以下是两个演示样例:
(map abs '(1 -2 3 -4 5 -6)) => (1 2 3 4 5 6)
(define trans
(lambda (lst)
(cons (map car lst) (map cdr lst))))
(trans '((a.1) (b.2) (c.3))) => ((a b c) 1 2 3)
1.8 赋值操作
Set!用来设置变量的值。变量能够是全局的,也能够是局部的。Set!使用的变量必须是事先定义过的。能够是let也能够是define。
Scheme语言--简单介绍的更多相关文章
- 这是啥-Cython语言简单介绍
Cython是一种既可以编写c又可以编写python的编程语言,他的目标是成为一个python语言的超集,为python提供高层次的.面向对象的.函数化.动态编程功能.不同于纯粹的python,它提供 ...
- R语言简单介绍
R语言 概述 R语言是用于统计分析,图形表示和报告的编程语言和软件环境. R语言由Ross Ihaka和Robert Gentleman在新西兰奥克兰大学创建,目前由R语言开发核心团队开发. R语言的 ...
- go语言简单介绍,增强了解
1. Go语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同.但是它通过接口(interface)的概念来实现多态性.Go语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之 ...
- Tiny语言编译器简单介绍
1.简单介绍:编译器是将一种语言翻译成还有一种语言的程序.编译器将源程序的代码作为输出,从而产生用目标语言编写的等价程序.比如源码为C/C++等高级语言,那么目标语言就是目标机器的机器代码.也就是能够 ...
- 《R语言入门》语言及环境简单介绍
简单介绍 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/diss ...
- R语言的帮助使用和图形功能简单介绍
R语言的帮助使用和图形功能简单介绍 R语言帮助,在Windows桌面下,有很多种.最长使用的是在命令行下help() > help.start() 会在浏览器中,打开帮助的主页 watermar ...
- HDFS简单介绍及用C语言訪问HDFS接口操作实践
一.概述 近年来,大数据技术如火如荼,怎样存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有很广 ...
- Phoenix(sql on hbase)简单介绍
Phoenix(sql on hbase)简单介绍 介绍: Phoenix is a SQL skin over HBase delivered as a client-embedded JDBC d ...
- OWIN产生的背景以及简单介绍
OWIN产生的背景以及简单介绍 随着VS2013的发布,微软在Asp.Net中引入了很多新的特性,比如使用新的权限验证模块Identity, 使用Async来提高Web服务器的吞吐量和效率等.其中一个 ...
随机推荐
- ajax缓存 header头文件
浏览器第一次访问服务器的时候,需要从服务器加载很多静态资源,并将这些资源文件缓存在浏览器中,当再次访问页面的时候,如果有相同资源文件就直接到缓存中去加载,这样就会降低服务器的负载和带宽,加快用户访问, ...
- JDBC高级特性(二)事务、并发控制和行集
一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommi ...
- MySQL參数binlog-do-db对binlogs写入的影响
1. 环境描写叙述 目的:当数据库中设置了binlog-do-db时.在不同的binlog_format=statement | row | mixed 下对binlog的写入影响,这个在主从复制中会 ...
- C++——多态性实现机制
C++的多态性实现机制剖析 1. 多态性和虚函数 #include <iostream.h> class animal { public: void sleep() { cout<& ...
- Microsoft Bot Framework 链接至微信公共号
如何将 Microsoft Bot Framework 链接至微信公共号 说到 Microsoft Bot Framework 其实微软发布了已经有一段时间了,有很多朋友可能还不太了解,微软Bot ...
- spark 编程教程
参考: 英文:https://spark.apache.org/docs/latest/programming-guide.html 中文:http://www.cnblogs.com/lujin ...
- Linux中U盘和SD卡加载卸载命令
U盘挂载命令U盘插入的时候会显示启动信息,启动信息中sda: sda1指U盘的设备名为sda1dev设备目录下有一个sda1设备文件,此设备文件就是我们插入的U盘,我们将这个设备文件挂载到Linux系 ...
- Nginx+ 多个Memcached+ 多个Tomcat集群配置来实现 sticky Session
假如有 大于2 台的Tomcat servers,如何实现sticky session特点的高可靠web 服务? 方案设计: 前端使用nginx(最好是淘宝的 tengine)作为we 流量分发器,向 ...
- Python 奇葩语法
a = 1, 2, 3 赋值后的结果,a == (1, 2, 3),将一个元组(tuple)赋给了变量 a (1, 2) + (3, ) ⇒ (1, 2, 3),并不能说明 tuple 可以添加新的元 ...
- Android多线程研究(8)——Java5中Futrue获取线程返回结果
我们先来看一下ExecutorService中的执行方法: 在上一篇中我们使用了execute方法启动线程池中的线程执行,这一篇我们来看看submit方法的使用:submit提交一个返回值的任务用于执 ...