没有了with表达,with,exp,body的id换成exp的lambda函数,从而可以没有with来进行实现。即,{with {id exp} body}换成了{{fun {id} body} exp}。

FAE : Concrete syntax

<FWAE> ::= <num>
| {+ <FWAE> <FWAE>}
| {- <FWAE> <FWAE>}
| <id>
| {fun {<id>} <FWAE>}
| {<FWAE> <FWAE>}

FAE : Abstrac syntax

(define-type FAE
[num (n number?)]
[add (lhs FAE?) (rhs FAE?)]
[sub (lhs FAE?) (rhs FAE?)]
[id (name symbol?)]
[fun (param symbol?) (body FAE?)]
[app (ftn FAE?) (arg FAE?)])

parse : sexp -> FAE

(define (parse sexp)
(match sexp
[(? number?) (num sexp)]
[(list '+ l r) (add (parse l) (parse r))]
[(list '- l r) (sub (parse l) (parse r))]
[(? symbol?) (id sexp)]
[(list 'fun (list x) b) (fun x (parse b))]
[(list f a) (app (parse f) (parse a))]
[else (error 'parse "bad syntax: ~a" sexp)]))

interp : FAE -> 'FAE'

(define (num+ x y)
(num (+ (num-n x) (num-n y))))
(define (num- x y)
(num (- (num-n x) (num-n y)))) (define (interp fae)
(type-case FAE fae
[num (n) fae]
[add (l r) (num+ (interp l) (interp r))]
[sub (l r) (num- (interp l) (interp r))]
[id (s) (error 'interp "free variable")]
[fun (x b) fae]
[app (f a) (local [(define ftn (interp f))]
(interp (subst (fun-body ftn)
(fun-param ftn)
(interp a))))]))

subst : 'FAE' 'symbol' 'FAE' -> 'FAE'

(define (subst exp sub-id val)
(type-case FAE exp
[num (n) exp]
[add (l r) (add (subst l sub-id val) (subst r sub-id val))]
[sub (l r) (sub (subst l sub-id val) (subst r sub-id val))]
[id (name) (cond [(equal? name sub-id) val]
[else exp])]
[app (f arg) (app (subst f sub-id val)
(subst arg sub-id val))]
[fun (id body) (if (equal? sub-id id)
exp
(fun id (subst body sub-id val)))]))

最新文章

  1. AngularJS 参考手册
  2. 扫盲 BT Sync——不仅是同步利器,而且是【分布式】网盘
  3. Educational Codeforces Round 6 E. New Year Tree dfs+线段树
  4. MySQL常用技巧
  5. ubuntu12.04配置静态IP及设置DNS
  6. Cloudera CDH5 部署实战指南(离线安装)
  7. SQL游标遍历数据表
  8. 解决UITableView中Cell重用机制导致内容出错的方法总结
  9. ueditor 百度编辑器 自定义图片上传路径和格式化上传文件名
  10. linux 定时关机命令
  11. Hadoop权威指南:HDFS-写入数据
  12. for循环语句以及输出语句
  13. ●POJ 2284 That Nice Euler Circuit
  14. Loadrunner下载脚本
  15. Java内存管理-掌握类加载器的核心源码和设计模式(六)
  16. 洛谷P2239 螺旋矩阵
  17. HTML5 ④
  18. Homebrew cask
  19. 【洛谷】【堆+结论】P4597 序列sequence
  20. 【python】理想论坛帖子爬虫1.06

热门文章

  1. matplotlib BboxBase类
  2. curl 交叉编译 支持http2和openssl
  3. For循环详解
  4. 【论文笔记】张航和李沐等提出:ResNeSt: Split-Attention Networks(ResNet改进版本)
  5. Retrofit 网络访问框架简单使用
  6. Mitmproxy教程
  7. mybatis 批量删除
  8. Linux安装PHP的Redis扩展(已安装Redis)
  9. OAuth-授权机制
  10. Mysql表的对应关系