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

博客介绍了Chez Scheme语言,它与DrRacket同属Scheme语言家族,编程思路与传统语言不同,采用递归形式,介绍了其变量和函数定义、语句运行时间统计等方法。还讲解了list、vector等数据结构,以及哈希表操作、fib函数性能测试等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

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

 

 

转载于:https://my.oschina.net/u/2996334/blog/3052799

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值