sicp-mit-5

#lang sicp
;;https://www.bilibili.com/video/BV1Xx41117tr
;;https://github.com/DeathKing/Learning-SICP/tree/master/SrtCN
;;第五节

;;数据抽象的方法学,将使用和表示分离开
;;这也是:过程也是对象的一种体现,也可以给它们命名
(define make-vector cons)
;等价于
(define (make-vector x y)
  (cons x y))

(define xcor car)
(define ycor cdr)

;;closure

(cons 1
      (cons 2
            (cons 3
                  (cons 4 nil))))

(list 1 2 3 4);;这是上面形式的语法糖

;;用递归的方式,处理表中的剩余元素,即表的cdr部分
;;然后用cons将该部分的结果,与经过处理后的表的第一个元素连接在一起

;;cdr-ing down a list
(define (scale-list s l)
  (if (null? l)
      nil
      (cons (* (car l) s) ;;first element of scaled list
            (scale-list s (cdr l))))) ;;rest of scaled list

;;high order procedure

;;(e1 e2 ... en)
;;((p e1) (p e2) ... (p en))

(define (map p l)
  (if (null? l)
      nil
      (cons (p (car l)) ;;;apply p to first element
            (map p (cdr l))))) ;;;map down the rest of the list
(define (scale-list s l)
  (map (lambda (item)
         (* item s))
       l))

;;;开始使用map进行思考,即:对表中的每个元素进行一定操作,而不关心控制流程

(define (for-each proc list)
  (cond ((null? list) "done")
        (else (proc (car list)) ;;;do it to the first element
              (for-each proc (cdr list))))) ;;;do it to the rest of the list

;;;list structure
;;;issues of abstraction
;;;representation
;;;capturing commonality with higher order procedures
;;;使用高阶过程描述共性

;;;when you think about a language, you think about it in terms of
;;;what are the primitives, what are the means of combination
;;;and then what are the means of abstraction

;;;primitives
;;;means of combination
;;;means of abstraction

;;;there's no real difference, in some sense, between procedures and data

;;;画图程序
;;;the primitive is only the picture

(beside g
        (above empty g 0.5)
        0.5)

(define p
  (beside g
          (rot-180 (flip g))
          0.5))

(define q
  (above p (flip p) 0.5))

;;为什么可以是复杂度快速增加
;;the answer is the closure property
;;当我将两个图像做beside操作后,得到的也是图像,
;;我可以继续执行rotate flip或者above操作,在这种组合方法下,图像的世界是封闭的

;;pair可以是数字的pair,也可以是数字和pair的pair,也可以是pair和pair的pair,所以pair是closure的
;;而有些语言,只能创建基本类型的数组,不能创建数组的数组,所以就不是closure的

;;矩形由三部分组成,原点origin,水平向量horiz,垂直向量vert

;;关键是,使用过程来表示图像,使其自动的具有闭包性质

;;;矩形的构造函数和选择函数,
;;;假设已经有了这些矩形了,也就是:只知道有这四个函数,具体实现由别人实现
;;;make-rect
;;;horiz
;;;vert
;;;origin


;;;(x, y) ---> origin + x*horiz + y*vert
;;;rectangular矩形   vector向量
;;;对矩形做变换,返回一个以点为参数的过程
(define (coord-map rect)
  (lambda (point)
    (+vect
     (+vect (scale (xcor point) (horiz rect)) ;;将点的x坐标缩放
            (scale (ycor point) (vert rect))) ;;将点的y坐标缩放
     (origin rect))))

;;;constructing primitive pictures from lists of segments
;;;返回一个以矩形为参数的过程,即:构建在矩形之上
;;;现在有了矩形,有了矩形的变换函数,然后就可以在这些不同的矩形中画图了
(define (make-picture seglist)
  (lambda (rect)
    (for-each
     (lambda (s)
       (drawline
        ((coord-map rect) (seg-start s))
        ((coord-map rect) (seg-end s))))
       seglist)))

;;;(define R (make-rect ... ))
;;;(define G (make-picture ... ))
;;;(G R)就可以实现在R这个矩形内画图


;;;在矩形内画图make-picture
;;;======================
;;;矩形变换函数coord-map
;;;======================
;;;    矩形


;;;有了矩形,矩形变换函数,(在矩形内)画图,现在就可以将不同的图像组合了
(define (beside p1 p2 a)
  (lambda (rect)
    (p1 (make-rect (origin rect)
                   (scale a (horiz rect))
                   (vert rect)))
    (p2 (make-rect (+vect (origin rect)
                          (scale a (horiz rect)))
                   (scale (- 1 a) (horiz rect))
                   (vert rect)))))

(define (above p1 p2 a)
  ... )

(define (rotate90 pict)
  (lambda (rect)
    (pict (make-rect (+vect (origin rect)
                            (horiz rect))
                     (vert rect)
                     (scale -1 (horiz rect))))))

(define (right-push p n a)
  (if (= n 0)
      p
      (beside p (right-push p (-n 1) a) a)))

(define (above-push p n a)
  ... )


;;;图像组合函数above,beside,rotate90,right-push等
;;;==============================================
;;;在矩形内画图make-picture
;;;==============================================
;;;矩形变换函数coord-map
;;;==============================================
;;;    矩形


;;;一般性的push,也就是使用高阶过程进行抽象
;;;参数为不同的组合方式,right,above,corner等
(define (push comb)
  (lambda (pict n a)
    ((repeated
      (lambda (x)
        (comb pict x a))
      n);;;返回一个picture为参数的过程
     pict)))


;;;图像组合函数above,beside,rotate90,right-push等
;;;==============================================
;;;一般图像组合函数push
;;;==============================================
;;;在矩形内画图make-picture
;;;==============================================
;;;矩形变换函数coord-map
;;;==============================================
;;;    矩形

     
;;层次关系:
;;;beside只接受图像p,不管这个图像p是什么
;;;图像p接受一个矩形,就自动画图
;;;beside并不关心图像是如何绘制的

;;we've implemented the means of combination themselves as procedures

(define (right-push p n a)
  (if (= n 0)
      p
      (beside p (right-push p (-n 1) a) a)))


;;将通用方法抽象成高阶过程


(define (push comb)
  (lambda (pict n a)
    ((repeated
      (lambda (p)
        (comb pict p a))
      n)
     pict))) ;;;将repeated的结果应用在pict上


;;;有了该一般性的push,reght-push就可以定义为以下形式:
(define right-push (push beside))

;;;在一个语言中嵌入另一个语言


;;;language of schemes of combination:
;;;push(用一个缩放因子,重复的做一件事)等
;;;===========================
;;;language of geometric(几何的) positions:
;;;above,beside,right-push,rotate等
;;;===========================
;;;language of primitive picts
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值