SICP读书笔记2.4

练习2.73

  1. 因为这两种类型直接表示为scheme的数字和符号,没必要再次抽象成另一种类型。

2.

(define (install-sum-package)
  (put 'deriv '+
       (lambda (exp var)
         (make-sum (deriv (addend exp) var)
                   (deriv (augend exp) var)))))

(define (install-product-package)
  (put 'deriv '*
       (lambda (exp var)
         (make-sum
          (make-product (multiplier exp)
                        (deriv (multiplicand exp) var))
          (make-product (deriv (multiplier exp) var)
                        (multiplicand exp))))))
(define (install-exponentiation-package)
  (put 'deriv '**
       (lambda (exp var)
         (let ((n (exponent exp))
               (u (base exp)))
           (make-product
            n
            (make-product
             (make-exponentiation
              u
              (- n 1))
             (deriv u var)))))))
  1. 把put时候的参数顺序对调一下就可以,比如原本的(put ‘deriv ‘) 改为(put ‘ ‘deriv)

SICP读书笔记2.3

练习2.53

#;1359> (list 'a 'b 'c)
(a b c)
#;1400> (list (list 'george))
((george))
#;1451> (cdr '((x1 x2) (y1 y2)))
((y1 y2))
#;1501> (cadr '((x1 x2) (y1 y2)))
(y1 y2)
#;1559> (pair? (car '(a short list)))
#f
#;1606> (memq 'red '((red shose) (blue socks)))
#f
#;1698> (memq 'red '(red shoes blue socks))
(red shoes blue socks)

Read More

SICP读书笔记2.2

练习2.17

(define (last-pair l)
  (if (null? (cdr l))
      l
      (last-pair (cdr l))))

练习2.18

(define (reverse1 lst)
  (if (null? lst)
      '()
      (append (reverse1 (cdr lst)) (list (car lst)))))

Read More

SICP读书笔记2.1

练习2.1

通过分子和分母相乘的结果的符号决定分子的符号,分母取绝对值。

改进后程序如下:

(define (make-rat n d)
  (let ((g (gcd n d)))
    (cons ((if (> (* n d) 0) + -)
           (abs (/ n g))) (abs (/ d g)))))

练习2.2

(define (make-point x y) (cons x y))
(define (x-point p) (car p))
(define (y-point p) (cdr p))

(define (make-segment p1 p2) (cons p1 p2))
(define (start-segment p) (car p))
(define (end-segment p) (cdr p))

(define (midpoint-segment s)
  (make-point (average (x-point (start-segment s))
                       (x-point (end-segment s)))
              (average (y-point (start-segment s))
                       (y-point (end-segment s)))))

(define (print-point p)
  (newline)
  (display "(")
  (display (x-point p))
  (display ",")
  (display (y-point p))
  (display ")"))

Read More

SICP读书笔记1.3

练习1.29

解释器内部采用有理数表示部分数值的关系,对于n = 100 和n = 1000的求值均得到0.25

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))


(define (integral f a b n)
  (define h (/ (- b a) n))
  (define (term k)
    (define (y k)
      (f (+ a (* k h))))
    (cond ((= k 0) (y k))
          ((= k n) (y k))
          ((devides? 2 k) (* 2 (y k)))
          (else (* 4 (y k)))))
  (define (next n) (+ n 1))
  (* (/ h 3) (sum term 0 next n) ))

(define (devides? a b)
  (= (remainder b a) 0))

练习1.30

(define (sum term a next b)
  (define (iter a result)
    (if (> a b)
        result
        (iter (next a) (+ result (term a)))))
  (iter a 0))

Read More

SICP读书笔记1.2

练习 1.9

方法1

(+ 4 5)
(inc (+ 3 5))
(inc (inc (+ 2 5)))
(inc (inc (inc (+ 1 5))))
(inc (inc (inc (inc (+ 0 5)))))
(inc (inc (inc (inc 5))))
(inc (inc (inc 6)))
(inc (inc 7))
(inc 8)
9

所以方法1是递归计算过程

方法2

(+ 4 5)
(+ 3 6)
(+ 2 7)
(+ 1 8)
(+ 0 9)
9

所以方法2是送代计算过程

Read More

SICP读书笔记1.1

练习1.1

10 ;10

(+ 5 3 4) ;12

(- 9 1) ;8

(/ 6 2) ;3

(+ (* 2 4) (- 4 6)) ;6

(define a 3) 
(define b (+ a 1))

(+ a b (* a b)) 19

(= a b) ;#f

(if (and (> b a) (< b (* a b)))
  b
  a) ; 4

(cond ((= a 4) 6)
      ((= b 4) (+ 6 7 a))
      (else 25)) ; 16

(+ 2 (if (> b a) b a)) ;6

(* (cond ((> a b) a)
         ((< a b) b)
         (else -1))
   (+ a 1)) ;16

Read More

继续初始化itrun

2015年的最后一天了。

快到12点了还在调整东西,项目进度有点慢,有点捉急。

今日完成内容

  • 切换到本地PostgreSQL

    本来想使用docker容器来完成所有开发工作,包括数据库也放到了一个单独的容器里。配置完成后正常跑起来没问题。但随后遇到了大坑,emacs 的rspec-mode配合Docker使用存在一些问题。虽然有变相解决方案,但是不太优雅,暂时放弃。

  • 添加spork-rails

    spork-rails可以帮助解决进行RSpec测试时速度过慢的问题。原来每次执行rspec时需要加载全部的rails框架,这会导致测试速度很慢,spork使用预先加载并初始化部分程序的方法加速rspec命令的执行过程。

  • 添加bootstrap

    使用bootstrap框架有两种解决方案,一个是使用less的twitter-bootstrap-rails另一个是实用sass的bootstrap-sass,个人比较倾向于sass所以选择了后者,但是后者比前者缺少helper和generator,可以另外添加bootstrap-sass-extras来解决部分问题

写完这个已经过了12点了。新年快乐。

itrun启动

为了让日子过的更充实一点,决定参加个编程马拉松。

规则非常简单: 目标:连续更新 github 365天。不限项目,不限代码量。

报名及详细链接

为了参与编程马拉松,启动一个新轮子-itrun

项目愿景也很简单,导入一个blueprint格式的api描述,让系统生成一个简单的webapp调用这个api。

例如:导入一个短信发送api的描述blueprint生成一个包含接收号码、短信内容两个输入框的网页,可以实现向目标发送短信。

项目使用 Ruby on Rails 开发(自从工作上用过几次Rails后我这个Pythonista要变质的节奏)。

今日完成内容

  • 初始化项目
  • 使用RSpec替代原有测试框架

    RSpec 是一个遵循BDD(Behaviour Driven Development)的测试框架

  • 添加gem: Capybara 和相关依赖 selenium-webdriver

    Capybara 让我们可以用可读性非常好的代码编写模拟互交代码

回归博客

在这个Web2.0:微博、微信、朋友圈之类的社交成为主流的年代,我选择回到了博客这个看起来比较”过时”的社交方式当中来。

距离上一次写博客已经过了一年多的时间,这段时间我一直沉浸在微博当中,从而荒废了原有的博客。一年之后回过头来看这段时间发现自己根本没有沉淀下来什么,只有微博上的只言片语。

微博、微信、朋友圈这种社交载体给人们带来了快速简便的社交方式。但是其带来的问题也是显而易见的:

  1. 为了遗忘而看: 使用微博的过程当中慢慢形成了快速遗忘的习惯。看到一条内容快速让自己进入一种情感当中,之后又快速遗忘并且整理心情准备看下一条内容。

  2. 阅读没有深度: 大部分这些社交方式严格限制着字数,内容没有深度。再结合快速遗忘,导致这种社交载体成了纯粹杀时间的工具。并让人越发排斥深度阅读。

最终决定戒掉微博,开始多读书、多思考、空闲时间写写博客。让自己随着时间的流逝有所沉淀。