PLAI_Chapter4: A First Taste of Desugaring

1 Extension: Binary Subtraction

it’s easy to define subtraction: a − b = a + −1 × b.

(define-type ArithS
  [numS (n : number)]
  [plusS (l : ArithS) (r : ArithS)]
  [bminusS (l : ArithS) (r : ArithS)]
  [multS (l : ArithS) (r : ArithS)])

(define (desugar [as : ArithS]) : ArithC
  (type-case ArithS as
    [numS (n) (numC n)]
    [plusS (l r) (plusC (desugar l)
                        (desugar r))]
    [multS (l r) (multC (desugar l)
                        (desugar r))]
    [bminusS (l r) (plusC (desugar l)
                          (multC (numC -1) (desugar r)))]))

2 Extension: Unary Negation

−b = −1 × b
-b = 0 - b
怎么选?


ArithS中的定义

[uminusS (e : ArithS)]

desugar中的写法

[uminusS (e) (desugar (bminusS (numS 0) e))]

注意这里的e没有desugar
这种把输入项直接放到另一个输入项里传给desugar处理的方法叫做宏(macro :D)。
这个例子中的宏就是uminusS的定义

然而有两个问题

1递归是generative recursion,需要留点神。
(关于啥是generative recursion:
a:Many well-known recursive algorithms generate an entirely new piece of data from the given data and recur on it. HtDP (How To Design Programs) refers to this kind as generative recursion.
b:http://www.ccs.neu.edu/home/matthias/HtDP2e/part_five.html

2,这种写法依赖于bminusS的定义。

所以,写成这样可能比较好

[uminusS (e) (multC (numC -1)
                    (desugar e))]

完整栗子

#lang plai-typed

(define-type ArithS
  [numS (n : number)]
  [plusS (l : ArithS) (r : ArithS)]
  [bminusS (l : ArithS) (r : ArithS)]
  [uminusS (e : ArithS)]
  [multS (l : ArithS) (r : ArithS)])

(define-type ArithC
  [numC (n : number)]
  [plusC (l : ArithC) (r : ArithC)]
  [multC (l : ArithC) (r : ArithC)])

(define (parse [s : s-expression]) : ArithS
  (cond
    [(s-exp-number? s) (numS (s-exp->number s))]
    [(s-exp-list? s)
     (let ([sl (s-exp->list s)])
       (case (s-exp->symbol (first sl))
         [(+) (plusS (parse (second sl)) (parse (third sl)))]
         [(*) (multS (parse (second sl)) (parse (third sl)))]
         [(-) (bminusS (parse (second sl)) (parse (third sl)))]
         [(u-) (uminusS (parse (second sl)))]
         [else (error 'parse "invalid list input")]))]
    [else (error 'parse "invalid input")]))

(define (desugar [as : ArithS]) : ArithC
  (type-case ArithS as
    [numS (n) (numC n)]
    [plusS (l r) (plusC (desugar l)
                        (desugar r))]
    [multS (l r) (multC (desugar l)
                        (desugar r))]
    [bminusS (l r) (plusC (desugar l)
                          (multC (numC -1) (desugar r)))]
    [uminusS (e) (multC (numC -1)
                        (desugar e))]))

(define (interp [a : ArithC]) : number
  (type-case ArithC a
    [numC (n) n]
    [plusC (l r) (+ (interp l) (interp r))]
    [multC (l r) (* (interp l) (interp r))]))

(define (driver [s : s-expression]) : number  
  (interp (desugar (parse s))))

(driver '(- 2 1))
(driver '(u- 1))


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 珍珠鸡蛋 文||与你相识 是大地上的珍品 自然界的供养 黄土高原的温暖 哺育了你的神韵 你总是不经意间 把真情留在...
    与你相识_40fa阅读 444评论 3 1
  • "天生处女座"是唯品国际今年周年庆的一个口号,也是营销的主题。借力处女座这次营销,唯品国际起到了两个效应。一是给顾...
    大寶小二二阅读 326评论 0 0
  • 王勝五绝咏冰蟾, 方知凤唳非等闲。 重阳相伴登高日, 把酒凌风上九天! (新韵) ——欣赏王勝五首中秋绝句有感
    任尔风云我自逍阅读 324评论 2 10
  • 好像最近变的特别的控制不住自己的情绪,一不满意就生气,感觉好像别人都要围着自己转,这样不好,要改。 学会控制情绪,
    傻孩子要做行动派阅读 127评论 0 0