随笔分类 - sicp
摘要:P54A (*) Check whether a given term represents a binary treeWrite a predicate istree which returns true if and only if its argument is a list represen...
阅读全文
摘要:[L-99: Ninety-Nine Lisp Problems](http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)列表处理类问题的解答,用Sc...
阅读全文
摘要:最近研究函数式编程,都是haskell和scheme交互着看的,所以笔记中两种语言的内容都有,练习一般也都用两种语言分别实现.本篇练习一些数组有关的问题,之所以与数组相关是因为在命令式编程中以下问题的核心数据结构主要是数组,而在scheme和haskell中主要是用list来实现.scheme中没有...
阅读全文
摘要:####快速排序快排的详细介绍[见](http://zh.wikipedia.org/zh/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F),简单的说就是取输入序列中的首元素m,然后将除首元素m以外的其它元素分成两组,小于等于m的一组和大于m的一组.将3组元素组合成输入队列...
阅读全文
摘要:####变量的引用#####语法: variable#####返回: variable的值如果在某个范围内存在对某个标识符的变量绑定,那么当这个标识符以表达式的形式出现的时候被认为是其所绑定变量的值.在引用一个标识符的时候,如果这个标识符没有被绑定为变量,关键字,记录名或其它的实体那么解释器/编译器...
阅读全文
摘要:###扩展语法(Syntactic extensions)扩展语法就是通过核心语法或已经定义的扩展语法创建一种新的语法模式.#####Scheme核心语法模式包括:* 顶层定义* 常量* 变量* 过程应用* '(quote)表达式* lambda表达式* if表达式* set!表达式#####Sch...
阅读全文
摘要:首先看下延续的定义:* [续延是在运行中被暂停了的程序:即含有计算状态的单个函数型对象。当这个对象被求值时,就会在它上次停下来的地方重新启动之前保存下来的计算](http://www.ituring.com.cn/article/53793)* [在计算机科学和程序设计领域,延续是计算机程序控制状态...
阅读全文
摘要:Church 整数前驱的推导比其后继复杂得多,wiki中一个前驱的定义据王垠的博客里说,是他一个数学系的同学花一星期时间推导出来的,其定义确实比其它介绍lambda的文章中用pair来实现(据说是图灵的学长花了3个月时间才想出来的)的方式简单许多,本文记录自己学习这个定义的分析过程,Church 整数的详细介绍见:http://zh.wikipedia.org/wiki/%E9%82%B1%E5%A5%87%E6%95%B0pred = λnfx.((n (λgh. h (g f)) (λu. x)) (λu. u)) pred 0 = λnfx.((n (λgh.h (g f)) (λu..
阅读全文
摘要:本篇分析continuation的一个著名例子"阴阳迷题",这是由David Madore先生提出的,原谜题如下:(let* ((yin ((lambda (foo) (display "@") foo) (call/cc (lambda (bar) bar)))) (yang ((lambda (foo) (display "*") foo) (call/cc (lambda (bar) bar))))) (yin yang))这里引用了http://www.ibm.com/developerworks/cn/linux/l-sch
阅读全文
摘要:上一篇文章我参考了很多其它文章,自己对continuation也没有完全吃透,本篇继续贴出自己对continuation的理解,希望大家看完后能理解continuation到底是一个什么东西,当然也希望能得到些反馈,例如看完之后是否能对continuation有个基本的了解,又或者我的解释有没有什么不对的地方.首先看一下tspl中对continuation的介绍:在对scheme表达式求值的过程中,一个scheme实现必须要追踪两样东西:(1)对什么求值(2)对那个值做些什么.考虑下面表达式中的求值过程(null?x).(if (null?x) (quote ()) (cdr x))schem
阅读全文
摘要:continuation是在scheme中被提出和实现的,经典的应用有:no-local exit,exception,back-tracking算法,coroutine等.所谓continuation,其实本来是一个函数调用机制。我们熟悉的函数调用方法都是使用堆栈,采用Activation record或者叫Stack frame来记录从最顶层函数到当前函数的所有context。Continuation则是另一种函数调用方式。它不采用堆栈来保存上下文,而是把这些信息保存在continuation record中。这些continuation record和堆栈的activation reco
阅读全文
摘要:这几天继续学习scheme,scheme中虽然有hashtable但没有类似C++中的map,于是把C版本中的红黑树移植到scheme(中间也发现了C版本中的一些问题,暂时懒得调整了^()^)以作为后序set和表格驱动设计中表格的基础数据结构.虽说这个红黑树在C版本中是调试好的了,但移植过来还是花费了我一天多的时间,中间出现各种小问题,苦于并不熟悉如何调试scheme程序,所以进度十分缓慢.(注:代码中大量使用set-car!所以无法再racket中运行,当然也可以调整rbnode的表示形式,不使用list来表示各字段,只使用set!修改字段的内容以使得可以被racket支持)(begin .
阅读全文
摘要:;pair ;cons可以用于构建pair,如(cons 1 2)->(1 . 2) ;car获得pair中的first,cdr获得pair中的second ;(car (cons 1 2))->1 (cdr (cons 1 2))->2 ;(cons 1 (cons 2 3))->(1 2 . 3)这是scheme输出pair时候的一种简略形式 ;实际上述pair的first是1,second是(2 . 3) ;类似的(cons 1 (cons 2 (cons 3 4)))->(1 2 3 . 4) ;实际的存储形式是(1 . (2 . (...
阅读全文
摘要:刚看了sicp的前两章,一直没看到有关于变量赋值,遂以为scheme跟erlang一样,变量是不可改变的.今天下了本"the scheme programming language"看了下第二章,发现原来scheme也是支持变量赋值的。于是写了一段代码测试下,以下代码定义了一个定长数组类型,数组的维度由init确定,例如要定义一个2 X 2的数组(make-array (list (list 0 0) (list 0 0)) ,这里要注意的一点是init必须显式的用list来定义,如果定义成'((0 0)(0 0))则在set的时候会出错,认为被set的列表是不可被
阅读全文
摘要:很简单的问题,最笨的算法,自己第一个用scheme写的稍微算长点的程序.废话不多说,直接上代码.(begin (load "ex2.scm") (define (make-maze) (define (for-each proc things) (cond ((null? things) nil) (else (let ((ret (proc (car things)))) (if (null? ret) (for-each proc (cdr things))...
阅读全文
摘要:(begin (load "ex1.scm") ;(define (make-rat n d) (cons n d)) (define (numer x) (car x)) (define (denom x) (cdr x)) (define (print-rat x) (display (numer x)) (display "/") (display (denom x)) (newline)) ;ex 2.1 (define (positive? x) (> x 0)) (define ...
阅读全文
摘要:(begin (load "util.scm") ;ex 1.16 计算b的幂 (define (_expt product b n maxn) (if (= n maxn) product (if (<= (* n n) maxn) (_expt (* product product) b (+ n n) maxn) (_expt (* product b) b (+ n 1) maxn)))) (define (fast-expt b n) (if (<= n 0) 1 (_expt...
阅读全文

浙公网安备 33010602011771号