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

Fluid Binding in Chez Scheme

Fluid Binding是Chez另一个扩展,这个名词不太好翻译,我想想暂时就叫易变绑定吧,如果有更好的翻译请在文后的评论中尽情发表。 先看看该语法描述: (fluid-let ((var expr) …) body1 body2 …) returns: the values of the body body1 body2 … libraries: (chezscheme) ...

十二月 24, 2019

Recursive Bindings in Chez Scheme

rec语法是Chez Scheme中一个非常有用的扩展,在不依赖外部变量进行递归时将很有用,可以减轻代码且使代码更加容易阅读。 这是语法描述: (rec var expr) syntax returns: value of expr libraries: (chezscheme) ...

十二月 24, 2019

两数相加

本文在于解答LeetCode中的第二题,问题的描述可参见 两数相加 Golang的实现: /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { result := &ListNode{} nodes := []*ListNode{} var carry = 0 for { node, c := add(l1, l2, carry) carry = c if node != nil { nodes = append(nodes, node) if l1 != nil && l1.Next != nil { l1 = l1.Next } else { l1 = nil } if l2 != nil && l2.Next != nil { l2 = l2.Next } else { l2 = nil } if carry > 0 && (l1 == nil && l2 == nil) { nodes = append(nodes, &ListNode{Val:carry}) } } else { break } } for i, n := range nodes{ if i == 0 { result = n } if i + 1 < len(nodes) { n.Next = nodes[i + 1] } } return result } func add (n1 *ListNode, n2 *ListNode, carry int) (*ListNode, int) { node := &ListNode{} if (n1 == nil && n2 == nil) { return nil, 0 } if n1 == nil { n1 = &ListNode{Val : 0} } if n2 == nil { n2 = &ListNode{Val : 0} } sum := n1.Val + n2.Val + carry carry = 0 if sum > 9 { carry = 1 sum = sum - 10 } node.Val = sum return node, carry } 下面提供Scheme版本的实现【(1 0) + (9 1 2) = (0 2 2)】,为了简单起见,与题目要求稍有不同,这里采用list,而不是题目要求的链表,但实际上应是一样的。比较之下可以看出,相对而言,Scheme语言的实现更加简短优雅,得益于其强大的表达能力 ...

十二月 17, 2019

钱币组合问题

最近同事参加公司的黑客竞赛,有一道题目与钱币组合问题比较像,记得SICP里面有所描述,正好不是很忙,就试着实现该算法,用Scheme语言开发。 ...

十二月 13, 2019