文档章节

《Chez Scheme初探》定义变量、递归、测试性能、并列代码编写

flash胜龙
 flash胜龙
发布于 05/22 18:29
字数 1078
阅读 4
收藏 0

简介:

Chez Scheme与DrRacket类似,都是Scheme语言家族,其编程整体思路跟传统语言有很大区别。其语言结构主要采用递归的形式,顺序执行语句内容需要使用begin关键词。使用define语句来定义变量和函数,使用let语句来绑定某个变量的值并规定作用域,使用time来统计语句运行的时间。

; 注释形式,使用分号

; 四则运算
(+ 1 2)   ; 3
(- 5 1)   ; 4
(* 4 3)   ; 12
(/ 4 2)   ; 2

; 条件判断
(= 2 3)   ; #f

; 变量定义
(define a 3)

; 变量赋值
(set! a 6)

字符串以及symbol(不可变字符串,带'号的字母)

; 创建字符串
"awefawef"
; 定义字符串
(define a "awefawef")
; 使字符串中所有字符变为大写
(string-upcase "awefawef")

; 创建symbol(不可变的字符串)
'awefawef
; 定义symbol
(define a 'awefawef)

相互转换:
(symbol->string 'Apple)    ;"Apple"
(string->symbol "Apple")   ;'Apple

函数定义以及操作

; 定义函数
(define (func1 x) (string-upcase x))
; 使用函数
(func1 "awer")
; 在map中使用函数
(map func1 a)

list数据结构(类似java的ArrayList),是一种链表结构。但跟传统的arraylist不同,它的append方法不改变原来的变量,只返回修改后的list

; 创建list数据结构
(list "red" "green" "blue")
; 定义list数据结构变量
(define a (list "red" "green" "blue"))
; 查看list长度
(length (list 1 2 3 4))
; 取出list中第2个元素
(list-ref (list 'a 'b 'c) 2)  ; 结果为'c


; 遍历list(使用map函数)
(map (lambda (x) (string-upcase x)) (list "red" "green" "blue"))


; 取元素相关操作
(car (list 1 2 3))  ; 取第一个元素,结果为1
(cdr (list 1 2 4))  ; 取第二个及以后元素,结果为(2 4)

; 改元素相关操作:
; Don’t confuse cons and append. The cons function takes an element and a list, 
; while append takes a list and a list. That difference is reflected in their types:
(cons 1 '(2 3))             ; 元素和表一起合并成一个新表,并返回
(append '(1 2) '(3 4))      ; 表和表一起合并成一个新表,并返回

vector数据结构(类似Java的数组),与list的区别详解(6.6.10 Vectors

; 创建vector
(vector 'a 'b)  ; 输出结果为#(a b)
(define v1 (vector 'a 'b))
; 取出vector第0个元素
(vector-ref v1 0)  ; a
; 修改第0个元素
(vector-set! v1 0 'c)

; 相互转换
(vector->list vec)
(list->vector lst)

操作哈希表

> (define a make-hash-table)  ; 注意区别,不在make-hash-table两旁加括号的话,系统会认为你是把这个函数赋值给a,而不是把函数的执行结果赋值给a
> a
#<procedure make-hash-table>
> (define ht (make-hash-table))
> ht
#<eq hashtable>
; 往表中添加(或修改)元素
(put-hash-table! ht 'b "wtf")  ; 注意感叹号别漏了
; 使用key获取对应元素,该实例是获取'b这个key对应的元素,而最后一个参量是指获取失败的时候返回的默认值。
(get-hash-table ht 'b #f)
; 获取key的vector(返回值是一个vector类型,长得像这样#(a b c))
(hashtable-keys ht)
; 获取value的vector(返回值是一个vector类型,长得像这样#(a b c))
(hashtable-values ht)

普通fib函数

(define (fact n) (if (= n 1) 1
                             (* n (fact (- n 1))  )
                 )
)

尾递归fib函数

(define (fact-tail n) (fact-rec n n))
(define (fact-rec n p) (if (= n 1) p
                                   (let ( (m (- n 1)) ) 
                                        (fact-rec m (* p m))
                                   )
                       )
)

性能测试

(let ([a 120000]) (begin (time (begin (fact a) (+ 30 3) )) (time (begin (fact-tail a) (+ 30 3) ))))

测试结果:

(time (begin (fact a) ...))
    115 collections
    11.843750000s elapsed cpu time, including 0.031250000s collecting
    11.867882300s elapsed real time, including 0.040223800s collecting
    13241981264 bytes allocated, including 13012956832 bytes reclaimed
(time (begin (fact-tail a) ...))
    229 collections
    9.796875000s elapsed cpu time, including 0.062500000s collecting
    9.816385400s elapsed real time, including 0.084685200s collecting
    14538387792 bytes allocated, including 14538258416 bytes reclaimed
33

机器:

CPU:i7-8550U  内存24GB

 

后记:

初学scheme类语言会遇到一个比较混淆的东西,就是set!、define、let的区别,之后会进行深入的探讨和讲解

输出结果中带井号的标识符具体含义

参考racket的数据类型

DATA STRUCTURE   ACCESS       NUMBER     INDICES
List:            sequential   Variable   not used
Struct:          random       Fixed      names
Vector:          random       Fixed      integer
Growable vector: random       Variable   integer
Hash:            random       Variable   hashable
Splay:           random       Variable   non-integer, total order

 

 

© 著作权归作者所有

flash胜龙
粉丝 5
博文 41
码字总数 26996
作品 0
海淀
私信 提问
开源编译器--Chez scheme

Chez Scheme是一个Scheme实现,由R. Kent Dybvig开发并于1985年首次发布。Chez Scheme可以将源代码编译为原生的机器代码,支持PowerPC、SPARC、x86和x86-64处理器架构,并提供了一个优秀的R...

匿名
2016/07/05
1K
0
Chez scheme 开源了!

印第安纳大学计算机科学系荣誉退休教授 R. Kent Dybvig 最近携手思科,开源了由其编写的 Chez Scheme 9.4版, 而此前 Chez Scheme 一直是闭源的商业软件。 Chez Scheme 是一个经过优化的编译器...

dama2010
2016/07/05
8.7K
15
Lisp 分支 Racket 7.3 发布,Racket-on-Chez 快照可用

Racket 7.3 发布了,此版本继续改进了 Racket-on-Chez,目前快照构建版本已经可以在 pre.racket-lang.org 上找到,官方表示希望在下个版本提供 Racket-on-Chez 下载包。 Racket 源自著名的专...

h4cd
05/17
0
0
Racket 7.0 版本正式发布,Lisp 语言分支

Racket 7.0 版本已正式发布。 Racket 7.0 版包含了对替换 Racket 当前运行时系统和支持多个运行时系统的长期目标的重大内部更改。官方表示他们不希望 Racket 用户看到 Racket v6.12 和 Rack...

局长
2018/07/30
1K
8
Y Combinator学习总结

最近看完The little schemer,第一次看到这种编排的书,一问一答的形式,不知不觉就翻完了整本。很自然的教会大家写递归,怎样写程序,一点点的CPS,还有Y combinator。个人觉得第九章推导Y...

rongtou
2016/09/27
23
0

没有更多内容

加载失败,请刷新页面

加载更多

FPGA 设备 USB Platform Cable USB

lsusbFuture Technology Devices International, Ltd FT232H Single HS USB-UART/FIFO IC

MtrS
今天
4
0
lua web快速开发指南(6) - Cache、DB介绍

"数据库"与"缓存"的基本概念 数据库与缓存是服务端开发人员的必学知识点. 数据库 "数据库"是一种信息记录、存取的虚拟标记地点的集合统称. 比如现实生活中, 我们经常会用到文件柜、书桌等等数...

水果糖的小铺子
今天
9
0
Oracle分页查询语句的写法

Oracle分页查询语句的写法 Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,Oracle分页查询语句基本上可以按本文给出的格式来进行套用。   Oracle分...

康师傅
昨天
5
0
java并发图谱

1527
昨天
2
0
Mybatis之拦截器Interceptor

使用mybatis时用PageHelper进行分页,用到了PageInterceptor,借此了解下mybatis的interceptor。Mybatis的版本是3.4.6,MybatisHelper的版本是5.1.3。 1、PageInterceptor 先上一段代码,如下...

克虏伯
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部