SICP_2.50-2.51

 1 #lang sicp
 2
 3 (#%require sicp-pict)
 4
 5 (define (origin-frame frame)
 6   (car frame))
 7
 8 (define (edge1-frame frame)
 9   (cadr frame))
10
11 (define (edge2-frame frame)
12   (caddr frame))
13
14 (define (make-vect a b)
15   (cons a b))
16
17 (define (xcor-vect v)
18   (car v))
19
20 (define (ycor-vect v)
21   (cdr v))
22
23 (define (add-vect v1 v2)
24   (make-vect (+ (xcor-vect v1)
25                 (xcor-vect v2))
26              (+ (ycor-vect v1)
27                 (ycor-vect v2))))
28
29 (define (sub-vect v1 v2)
30   (make-vect (- (xcor-vect v1)
31                 (xcor-vect v2))
32              (- (ycor-vect v1)
33                 (ycor-vect v2))))
34
35 (define (scale-vect s v1)
36   (make-vect (* s (xcor-vect v1))
37              (* s (ycor-vect v1))))
38
39 (define (frame-coord-map frame)
40   (lambda (v)
41     (add-vect
42      (origin-frame frame)
43      (add-vect (scale-vect (xcor-vect v)
44                            (edge1-frame frame))
45                (scale-vect (ycor-vect v)
46                            (edge2-frame frame))))))
47 ;;;;;;;;;;;;;;;;;;;2.50
48 (define (transform-painter painter origin corner1 corner2)
49   (lambda (frame)
50     (let ((m (frame-coord-map frame)))
51       (let ((new-origin (m origin)))
52         (painter
53          (make-frame new-origin
54                      (sub-vect (m corner1) new-origin)
55                      (sub-vect (m corner2) new-origin)))))))
56
57 (define (flip-horiz painter)
58   (transform-painter painter
59                      (make-vect 1.0 0.0)
60                      (make-vect 0.0 0.0)
61                      (make-vect 1.0 1.0)))
62
63 (define (roate90 painter)
64   (transform-painter painter
65                      (make-vect 1.0 0.0)
66                      (make-vect 1.0 1.0)
67                      (make-vect 0.0 0.0)))
68
69 (define (roate180 painter)
70   (transform-painter painter
71                      (make-vect 1.0 1.0)
72                      (make-vect 0.0 1.0)
73                      (make-vect 1.0 0.0)))
74
75 (define (roate270 painter)
76   (transform-painter painter
77                      (make-vect 0.0 1.0)
78                      (make-vect 0.0 0.0)
79                      (make-vect 1.0 1.0)))
80
81 ;;;;;;;;;;;;;;;;;2.51
82 (define (my-below painter1 painter2)
83   (let ((split-point (make-vect 0.0 0.5)))
84     (let ((paint-up
85            (transform-painter painter2
86                                split-point
87                               (make-vect 1.0 0.5)
88                               (make-vect 0.0 1.0)))
89           (paint-bottom
90            (transform-painter painter1
91                               (make-vect 0.0 0.0)
92                                (make-vect 1.0 0.0)
93                                split-point)))
94       (lambda (frame)
95         (paint-up frame)
96         (paint-bottom frame)))))
97
98 (define (my-below2 painter1 painter2)
99   (roate270 (beside (roate90 painter1) (roate90 painter2))))

1.理解painter是个过程接受frame参数,即在frame中画painter

2.frame-coord-map 中将一个单位正方形中的点映射到一个新框架中

3.transform-painter 则是将painter映射到一个新框架中返回的也是一个过程,也可以理解为返回一个painter

时间: 2024-12-08 17:17:22

SICP_2.50-2.51的相关文章

hdu 1498 50 years, 50 colors

题目链接 1 #include <cstring> 2 #include <cstdio> 3 4 short G[101][101]; 5 bool vis[101]; 6 short match[101]; 7 short n; 8 9 bool dfs(short x, short c) 10 { 11 int i; 12 13 for(i=0;i<n;i++) 14 { 15 if(G[x][i] == c && !vis[i]){ 16 vis[i]

数据类型回顾——函数传参之商品价格计算—JS学习笔记2015-6-6(第50天)

经常我们可以看到很多网站会有多个相同功能的模块,比如淘宝首页的轮播,比如新浪首页的tab切换: 那么可以看出这些地方在HTML结构上是类似的,所以我们可以考虑用一块功能代码去实现,而不同是仅仅是传递参数的不同: 例如: 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"

51.RocketMQ 顺序消费

3种不同模式的Producer NormalProducer(普通) OrderProducer(顺序) TransactionProducer(事务) 生产者 1 /** 2 * Copyright (C) 2010-2013 Alibaba Group Holding Limited 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this fil

传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)

本笔记是个人笔记+摘录笔记相结合,非完全原创 day01 win 7系统打开DOS有趣方法:按住shift+右键,单击“在此处打开命令窗口”(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复?!! 常用DOS命令d: 回车 盘符切换dir(directory):列出当前目录下的文件以及文件夹md (make directory) : 创建目录(创建文件夹)rd (remove directory): 删除目录(删除文件夹,注意:前提是文件夹必须是空的!!)如果

[51单片机] 四相五线减速比为1/64步进电机驱动设计

一.大致介绍: 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的.可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的:同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的.        图1 常见的几种步进电机 图2 步进电机

[51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]

这里把EEPROM 24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC >_<:i2c.c 1 /*----------------------------------------------- 2 名称:IIC协议 3 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器 4 周期,即晶振频率要小于12MHZ) 5 ---------------------------------------

[51单片机] EEPROM 24c02 + 数码管 + 中断 [统计开机次数]

>_<:24c02的SCL连P2.0;SDA连P2.1;WP接GND;P0接8位数码管的8针;P2.2连段码;P2.3连位码; >_<:delay.c 1 #include "delay.h" 2 /*------------------------------------------------ 3 uS延时函数,含有输入参数 unsigned char t,无返回值 4 unsigned char 是定义无符号字符变量,其值的范围是 5 0~255 这里使用

应用部署weblogic 报错Unsupported major.minor version 51.0的解决过程

应用部署weblogic 报错Unsupported major.minor version 51.0的解决过程 ? ? 1.部署提示错误:Unsupported major.minor version 51.0 1.1 错误现象如下图所示: 1.2 原因分析 类似错误均属于Java版本问题,即JDK版本过低,只要选择相对应的JDK版本编译即可.48,49,50.51.52是Java编译器内部的版本号:Unsupported major.minor version 52.0 对应于 JDK1.8

2016.05互金平台移动端影响力50强榜单报告!

(文章来源:盈灿咨询) 6月21日下午,盈灿咨询在京举办互金平台移动端影响力报告暨2015网贷蓝皮书出版发布会,首次独家发布了<互金平台移动端影响力榜单TOP50>,北京大学汇丰商学院中小企业研究中心执行主任王家卓.网贷之家首席研究员&盈灿咨询总经理马骏.盈灿咨询副总经理于百程.爱钱进CEO杨帆等嘉宾出席了本次活动并做主题分享. 据悉,该报告选取了300余家互金平台5月的移动端数据,以平台在移动端的推广目的和移动互联网特点为支点,以指标.评分.分析为撬棍,展示了目前行业内互金平台的移动

简单的串口通信 (开始复习51,准备部门的招新培训)

1 /*------------------------------------------- 2 51串口通信 3 -------------------------------------------*/ 4 #include<reg51.h> 5 6 #define uint unsigned int 7 #define uchar unsigned char 8 9 10 uchar flag,a,i; //标志接收串口中断标志,接收SBUF内容 11 uchar code table