近日的学习日记

来源:互联网 发布:处方软件 编辑:程序博客网 时间:2024/04/28 10:55

前段时间忙于毕设,没有多少时间学习。现在终于可以快乐的读代码了。

2014.5.17-5.18

学习:计算机程序设计艺术(高纳德)    晚清七十年

Yield关键字的用法:yield return 返回的是迭代器

Contract:契约,interface即是contract.Template is alsocontract.

CPS变换.

λ-calculus程序.

MMIX指令集.

conceptmapping.

一定要读王垠(Yin)博客.

学习Scheme

coLinux,最为方便的是它可以直接在Windows中运行——甚至可以作为服务启动!它是我学习Linux的最好的仿真平台之一.

学习王垠博客里的解释器

学习g9yuayon博客里的”与Scheme共舞”

用Scheme实现小计算器

 (define calc

  (lambda (exp)

    (match exp                           ; 匹配表达式的两种情况

      [(? number? x) x]                ; 是数字,直接返回

      [`(,op ,e1 ,e2)                  ; 匹配并且提取出操作符 op 和两个操作数 e1, e2

       (let ([v1 (calc e1)]            ; 递归调用 calc 自己,得到 e1 的值

             [v2 (calc e2)])           ; 递归调用 calc 自己,得到 e2 的值

         (match op                     ; 分支:处理操作符 op 的 4 种情况

           ['+ (+ v1 v2)]            ; 如果是加号,输出结果为 (+ v1 v2)

           ['- (- v1 v2)]            ; 如果是减号,乘号,除号,相似的处理

           ['* (* v1 v2)]

           ['/ (/ v1 v2)]))])))     ;调用方式 (calc '(+ 1 2))

5.26

谨记递归的扩展与收缩.

For example:

(define factoral(lambda(x)

(if(<=x 1)   1

(* x(factoral(-x 1))))))

基础结构:

(1)if… (if(test) (cond1)(cond2)) if test istrue,then cond1,else cond2.

(2)cond…else 类似于switch…case (cond((test) op1)((test)op2)… (else op))

(3)case…else 格式类似于cond…else 操作list,向量表,不同的是case(cond1)(res1return1)(res2 return2)的cond是一个表达式,而不是true or false,只要下面的res中包含cond1的计算结果,则返回响应的return值.

例:(case (* 2 3)((2 35 7) ‘prime)((1 4 6 8 9) ‘composite))

2*3结果为6,返回当然是composite

(4)and or 运算符 (运算符当然要提前)

(5)循环由递归实现

(6)let

(7)apply

(8)map

(9)string? boolean?

(10)car cdr

(11)eval delay for-each force call-with-current-continuation

(12)输入输出

5.27

读书:TheLittle Schemer

定义atom?:

(define atom?  

  (lambda (x) 

    (and (not (pair? x)) (not (null?x))))) 

基础概念car cdr consnull? eq?

定义lat?(list ofatoms,(a a a)is lat,but ((a) a a) is not lat)

(define lat?

(lambda(l)

(cond

((null? l) #t)

((atom? (car l))  (lat? (cdr l)))

(else #f))))

6.3

`:反引号.作用:对加了,标记的所有东西求值.如:`(a b c),若c为5,则结果为(a b 5)

对照王垠的calc代码,即可读懂那个简单的计算器(见第一页).

想起C++写的计算器,代码500行都不止,并且实现不了括号嵌套,这时还谈什么效率,无论是代码的精简还是效率Scheme都完爆C++.这个时代的人们喜欢人云亦云,从来不懂得自己亲自的尝试.一味的吹嘘C语系的语言,忽视真正的伟大的编程思想,眼界狭隘到无从辨别真理,何谈所谓的发明与创新,连继承都做不到.不站在伟人的肩上永远看不到更加旖旎的风光.抱残守缺敝帚自珍的井底之蛙永远不知道外面的世界有多么大!

递归是编程语言中最重要的,没有之一.

Recurring is the mostimportant in the program language!

Just choose Scheme andbelieve it can change the world one day.

If I can say,I will saythat I have a dream that I want to develop a new program language which iselegant and powerful just like Scheme or if I can-exceed Scheme one day.

6.10.2014

认清现实,看清自身的优劣.抛弃过去,追逐未来.将来的日子是一个人的战争.不要考虑无关的东西了.不要胡思乱想了.忘掉自己的审美观,忘掉自己的喜好.忘掉虚妄不实的自己,找回本性.

在lambda算子中,任何以空格隔开的都是函数调用.

let IfThenElse = lambdacond true_expr false_e xpr . cond true_expr false_expr 

.后边cond为函数,另外两个是cond参数.而不是三个无关的变量.一切都是函数调用.

let Y = lambda y. (lambdax. y (x x)) (lambda x. y (x x))

后边两个lambda式,前一个是函数,后一个是参数.一切都是函数调用.

RememberAll are function call.

读完了g9yuayon负暄琐话 的关于lambda演算的几篇文章,对于lambda有了新的认识.alpha变换(无非是给混淆的参数名取另一个名字),beta简化(无非是带入参数).

Y combinator使本没有递归的lambda算子实现了递归.参考Lambda算子5a:<Why oh why Y - 负暄琐话>以及<康托尔、哥德尔、图灵——永恒的金色对角线(rev#2) - 刘未鹏_C++的罗浮宫>.

6.11.2014

beta简化:

->看来beta简化需要每次带入参数是去掉函数定义头,比如lambda x.x x,代入lambda y.y x,成为lambda y.y x lambda y.y x;应该是这样.前后为函数调用关系,即f(f(x)).高阶函数.

今日读了The LittleSchemer的第九章.第九章实现了Y combinator.从无到有实现递归.

读了g9yuayon的S K I组合子相关的文章.


0 0
原创粉丝点击