还是那句话,经典不妨一看再看
htdd这章的视频可以在edx上看,也可以点开youtube的公开课链接看
这里的总结是假设你都看过视频了( ̄<  ̄)>
htdd 是how to design data 的缩写
它也有自己的recipe
- definition
- type comment
- interpretation
- Examples of the data.
- template
这五个步骤分别指的是什么? 我们通过Simple Atomic Data这个个例子说明一下
右边数字分别对应的就是各个步骤
<-------------------------Simple Atomic Data---------------------------------->
(@htdd Time) <--1. definition
;; Time is Natural <--2. type comment
;; interp. number of clock ticks since start of game <--3. interpretation
(define START-TIME 0) <--4. Examples of the data
(define OLD-TIME 1000)
(@dd-template-rules atomic-non-distinct) ;Natural <--5. template
#;
(define (fn-for-time t)
(... t))
剩下的interval, Enumeration, Itemization的example分别如下,方便参考
<-------------------------interval---------------------------------->
(@htdd Countdown)
;; Countdown is Integer
;; interp. the number of seconds remaining to liftoff, restricted to [0, 10]
(define C1 10) ; start
(define C2 5) ; middle
(define C3 0) ; end
(@dd-template-rules atomic-non-distinct) ;Integer
#;
(define (fn-for-countdown cd)
(... cd))
<-------------------------Enumeration---------------------------------->
(@htdd LightState)
;; LightState is one of:
;; - "red"
;; - "yellow"
;; - "green"
;; interp. the color of a traffic light
;; <examples are redundant for enumerations>
(@dd-template-rules one-of ;3 cases
atomic-distinct ;"red"
atomic-distinct ;"yellow"
atomic-distinct) ;"green"
#;
(define (fn-for-light-state ls)
(cond [(string=? ls "red") (...)]
[(string=? ls "yellow") (...)]
[(string=? ls "green") (...)]))
<-------------------------Itemization---------------------------------->
(@htdd LightState)
;; LightState is one of:
;; - "red"
;; - "yellow"
;; - "green"
;; - false
;; interp.
;; the three colors of a traffic light
;; false the light is broken
(@dd-template-rules one-of ;4 cases
atomic-distinct ;"red"
atomic-distinct ;"yellow"
atomic-distinct ;"green"
atomic-distinct);false
#;
(define (fn-for-light-state ls)
(cond [(string=? ls "red") (...)]
[(string=? ls "yellow") (...)]
[(string=? ls "green") (...)]
[else
...)) ;;false case
接着说一下关于htdd一些需要理解的地方
1. htdd vs 基础数据类型
htdd 其实是给用基础数据类型(integers, numbers, strings, images and booleans)去表达一个概念
像上面symbol atomic data 的例子,
它是用Natural(基础数据类型)去定义了一个叫Time的抽象概念
或者像Inteval的例子,
它是用Integer(基础数据类型)去定义了一个叫Countdown的抽象概念,
并且定义了它的范围是[0, 10]
Enumeration 和Itemization也是这么个逻辑
htdd = 基础数据类型 + 人为定义
-
2. htdd vs htdf
通过htdd 和基础数据类型的对比, 我们知道data 分两种, 一种是
基础数据类型, 一种是htdd 定以后的抽象数据类型。
所以htdf分两种,一种是针对基础数据类型的function define,像这样,
(@htdf double)
(@signature Number -> Number)
;; double a given number.
(check-expect (double 1) 2)
(check-expect (double 4.2) 8.4)
;(define (double n) 0) ;stub
(@template Number)
;;template
;(define (double n) (... n))
(define (double n)
(* n 2))
另外一种是针对用htdd定义后数据的function define,以上面Simple Atomic Data的Time
为例子,题目
Define a function called just-start? that takes a time and produce true if time is
shorter than 100 ticks.
(@signature Time -> Booelan)
;; check if time is shorter than 100 ticks
(check-expect (just-start? 40) true)
(check-expect (just-start? 100) false)
(check-expect (just-start? 101) false)
(@template Time)
;(define (just-start? t) false) ;stub
(define (just-start? t)
(< t 100))
和之前不一样的是signature 用的是Time, template 用的是Time 的htdd template,
相当于我们现在这个function是根据Time这个data写的. 更多的htdd + htdf的例子可以参考下面这个链接
(inteval+htdf, enum+htdf, itemaization+htdf)
-
3. atomic-non-distinct vs atomic-distinct
在写htdd template rules 的时候, 我们经常会碰到这两串子
读起来很绕。。。
其实atomic-non-distinct 是泛指一种类型
而atomic-distinct 就是指具体一个value
举个栗子,在Time的template 里面,因为 “t” 是Natural,但它不是特指哪个值,
所以dd-template-rules 是atomic-non-distinct
(@dd-template-rules atomic-non-distinct) ;Natural <--5. template
#;
(define (fn-for-time t)
(... t))
而在enum 红绿灯 state 的例子里,因为light-state是"red", "yellow" 和 "green"其中一种。
"red", "yellow" 和 "green"都是一个唯一的String,所以每一个string 分别对应的都是
atomic-distinct
(@dd-template-rules one-of ;3 cases
atomic-distinct ;"red"
atomic-distinct ;"yellow"
atomic-distinct) ;"green"
#;
(define (fn-for-light-state ls)
(cond [(string=? ls "red") (...)]
[(string=? ls "yellow") (...)]
[(string=? ls "green") (...)]))
-
4. Enumeration vs Itemization
Enumeration 用一种基础数据类型来表示一个概念
Itemization 用两种或以上数据类型来表示一个概念
上面Enumeration的例子中LightState 只用到了Stirng
而Itemization用到了Stirng 和 Boolean("false" 来表示不工作的状态)