Scheme语言--简介
一年前其实有时间看完SICP这本书,后来因为种种原因,一直没有继续再学。因为SICP中使用Scheme确实应用不多。在Java,C++的语言眼里,Scheme确实很另类。如今MIT已经放弃了使用Scheme作为SICP的教学语言而转向python之际,我在此开始学习这本书与这门语言的学习。SICP主要使用Scheme语言来解决计算机科学中的一些问题。为了督促自己,每天都能学习。积小流而成江海,把自己的学习过程放在这里,以供自己复习。
本系列主要包括两部分Scheme语言层面的问题及SICP中的课程方面,两个部分相辅相成。今天开始Scheme语言的第一节。
Scheme简介
Scheme语言是Lisp语言的一种变种,是一种表处理语言。其语法简单,容易学习,可以使使用者专著于解决问题而非语言本身。
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语言--简介相关推荐
- (一)HTML 语言简介
HTML 语言简介 HTML 语言简介 1.XHTML 2.网页的基本概念 3.HTML语义化 4.HTML字符编码 4.1.码点表示法 4.2.字符的实体表示法 5.URL简介 URL编码 HTML ...
- java程序包不存在_第一章 Java语言简介
Java语言简介 Java之父 James Gosling(詹姆斯·高斯林) 正式诞生时间 1995年,已有二十多年历史 三大方向 JavaSE(桌面版,基础需重点掌握) JavaME(移动版,现在基 ...
- Scheme 语言概要
作为Lisp 变体,Scheme 是一门非常简洁的计算语言,使用它的编程人员可以摆脱语言本身的复杂性,把注意力集中到更重要的问题上,从而使语言真正成为解决问题的工具.本文分为上. 下两部分来介绍 sc ...
- Go 语言简介(下)— 特性
希望你看到这篇文章的时候还是在公交车和地铁上正在上下班的时间,我希望我的这篇文章可以让你利用这段时间了解一门语言.当然,希望你不会因为看我的文章而错过站.呵呵. 如果你还不了解Go语言的语法,还请你移 ...
- c语言中return的作用_C语言简介
C语言简介 c语言是人和机器交流的语言. c语言是面向过程的语言 C语言的优点:代码量小.执行速度快.功能强大.编程自由 英语不好能不能学:C语言一共32个关键字,以及为数不多的规则.建议三年级以下学 ...
- r语言简介_R语言简介
r语言简介 R is a language and environment for statistical computing and graphics that is supported by th ...
- 函数式编程语言:LISP/Scheme 小语种简介
1.概述 自从裘宗燕教授翻译了<计算机程序的构造和解释>(Structure and Intepretation of Computer Programs,SICP)第二版之后,这本MIT ...
- C++程序设计【一】之 C++ 语言简介
文章目录 第一章:C++ 语言简介 一.C++ 语言的发展简史 二.C++ 语言的特点 1.与C语言相比,C++语言的优点 2.基本的输入 / 输出 3.头文件和命名空间 4.强制类型转换运算符 5. ...
- php语言开始和结束分别为,0055 PHP语言简介和HelloWorld
0055 PHP语言简介和HelloWorld 作者:PHPYuan 时间:2018-10-01 03:41:29 第3章学习了如何编写JavaScript代码来动态修改网页内容. 虽然JavaScr ...
- 《从问题到程序:用Python学编程和计算》——1.2 Python语言简介
本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第1章,第1.2节,作者 裘宗燕,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1. ...
最新文章
- win10 java applet_win10系统的ie11浏览器无法打开Java applet
- 卡联科技与正元地理合作 打造智慧城市
- ​网页图表Highcharts实践教程之图表代码构成
- (转载)如斯场景 似曾相识
- malloc与new,free与delete
- LeetCode17——Letter Combinations of a Phone Number(手机几个按键对应的字母(符号)组合)
- python random库下载_python random库
- 深入理解JVM--类的执行机制
- Silverlight读取Zip文件中的图片与视频
- HTTP的基础知识——IP、TCP(3次握手) 和 DNS
- pthread_create创建线程后是否需要释放资源
- R语言检验独立性:卡方检验(Chi-square test)和费舍尔Fisher精确检验分析案例报告
- 网线水晶头两种标准的接法
- 企业如何进行数字化管理?
- Android Studio 之 实现app打开界面透明化效果
- linux shell ifs,【shell】IFS和$*变量
- nestjs[typeorm学习之一对一表关系探究与使用]
- python期中作业
- 【每周一读】——你的孤独,虽败犹荣
- 苹果wifi测试中文软件,苹果测试排除WiFi网络故障工具 WiFi Check 2.1.2 Mac OS X