存储管理(Storage Management in Chez Scheme)

垃圾回收 Scheme程序不会显式地释放诸如序对,字符串和过程之类的Scheme对象。 相反,一旦存储管理系统证明不再可以访问该对象,它就会自动回收与该对象关联的存储。 为了回收此存储,Chez Scheme使用了一个垃圾收集器,该垃圾收集器在程序运行时定期运行。 垃圾收集器从一组已知的根开始(例如,机器注册),查找所有可访问对象,并在大多数情况下复制它们,以消除可访问对象之间的碎片,并回收不可访问对象所占用的存储。 ...

二月 12, 2020

系统操作(System Operations in Chez Scheme)

异常 (warning who msg irritant …) 返回:未指定 警告会引发条件类型&warning的持续异常,并应用于描述&warning条件类型适用的情况,通常是一种不应该阻止程序继续运行但可能在以后导致更严重问题的情况。 通常最好是识别程序员已调用的过程,而不是程序员可能不知道的其他过程。 msg必须为字符串,并应描述异常情况。irritant可以是任何Scheme对象,并且应包含可能导致或严重涉及异常情况的值。 ...

二月 6, 2020

Scheme语法define-record-type介绍

define-record-type Scheme语言中的define-record-type形式用来定义一个记录类型,并定义该类型的构造函数、仅对该类型的record返回true的谓词、以及每个字段的访问procedure和针对可变字段的赋值procedure。总的来说,与Java中的POJO类比较相似,不过不用自定义getter和setter方法,这与Kotlin倒为类似,例如: ...

二月 3, 2020

Chez Scheme Modules

Modules 模块用于帮助将程序组织成单独的部分,这些部分通过声明好的接口干净地交互。尽管模块化编程通常可以为多人参加的大型程序开发带来便利,但它也可以在 Chez Scheme 中以“微模块”级别使用,因为 Chez Scheme 中的模块和 import 形式属于定义,并且可以出现在定义可以出现的任意位置,包括在 lambda 表达式的程序体或其他局部作用域中。 ...

一月 17, 2020

自定义 Let*

实现Let*语法的两种方式,主要目的是记录两种编程思路,在编写其他程序时应该也有所裨益。 (define-syntax my-let* (syntax-rules () ((_ () bodys ...) (let () bodys ...)) ( (_ ((a1 v1)) bodys ...) (let ((a1 v1)) bodys ...) ) ( (_ ((a1 v1) (a2 v2) ...) bodys ...) (let ((a1 v1)) (my-let* ((a2 v2) ...) bodys ...)) ) ) ) 注意,my-let*是可以递归使用的,以及**…**的用法。 ...

一月 17, 2020

Syntactic Extension and Modules in Chez Scheme

Fluid Keyword Bindings fluid-let-syntax 语法: fluid-let-syntax ((keyword expr) …) form1 form2 …) fluid-let-syntax与标准let语法相似,不同之处在于Fluid-let-syntax在其body扩展期间会暂时更改keyword的现有绑定,而不是引入keyword的新绑定。也就是说,在扩展form1 form2 …的过程中,每个keyword的可见范围(或顶级)将会临时替换为新的绑定关系。 ...

一月 15, 2020

Chez Scheme中Boxes介绍

Chez Scheme中有一种Boxes结构,它是一个单元素对象,主要用于提供一个“额外的间接层”。这个额外的间接层,通常用于使多个代码块或数据结构可以共享指向一个对象的引用,或指针。例如,在采用此种参数传递规则的语言的解释器中,可以用 boxes 实现 call-by-reference 的语义。解释有点绕,按我的理解boxes就相当于Golang的struct、Java中的类,将一些状态包装成一个整块,外界通过引用该整块的指针来访问内部的各个状态。 ...

一月 3, 2020

Scheme/Chez Scheme 对象操作

Pairs and Lists atom? atom? 相当于 (lambda (x) (not (pair? x))) (atom? '(a b c)) ⇒ #f (atom? '(3 . 4)) ⇒ #f (atom? '()) ⇒ #t (atom? 3) ⇒ #t list-head(Chez) 用法:(list-head list n) n是一个非负整数,且小于等于list的长度;list-head和Scheme标准过程list-tail可能会同时使用来切割一个list,不同点在于,list-tail不会分配内存而只是返回源list的一个子列表,list-head总是返回源list前n个元素的副本 ...

十二月 30, 2019

Engine in Scheme

Engine(引擎)是支持时间抢占 的高级抽象过程, 它可被用于模拟多任务处理、实现操作系统内核和非确定性计算。 (make-engine thunk) 通过传递一个无参数的thunk(形实转换程序)给make-engine来创建一个engine。thunk的body是会被engine执行的计算,engine本身是带3个参数的过程: ...

十二月 27, 2019

Chez Scheme中的case扩展

case Scheme原生提供了if语法,用于判断十分便利,但是对于某些多于一个的条件,就只能嵌套写if来实现了,写起来有些不便,Chez Scheme提供了case语法来处理这种情况,这与Java中的switch语法非常相似。 ...

十二月 25, 2019