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

FAE : Concrete syntax

  1. <FWAE> ::= <num>
  2. | {+ <FWAE> <FWAE>}
  3. | {- <FWAE> <FWAE>}
  4. | <id>
  5. | {fun {<id>} <FWAE>}
  6. | {<FWAE> <FWAE>}

FAE : Abstrac syntax

  1. (define-type FAE
  2. [num (n number?)]
  3. [add (lhs FAE?) (rhs FAE?)]
  4. [sub (lhs FAE?) (rhs FAE?)]
  5. [id (name symbol?)]
  6. [fun (param symbol?) (body FAE?)]
  7. [app (ftn FAE?) (arg FAE?)])

parse : sexp -> FAE

  1. (define (parse sexp)
  2. (match sexp
  3. [(? number?) (num sexp)]
  4. [(list '+ l r) (add (parse l) (parse r))]
  5. [(list '- l r) (sub (parse l) (parse r))]
  6. [(? symbol?) (id sexp)]
  7. [(list 'fun (list x) b) (fun x (parse b))]
  8. [(list f a) (app (parse f) (parse a))]
  9. [else (error 'parse "bad syntax: ~a" sexp)]))

interp : FAE -> 'FAE'

  1. (define (num+ x y)
  2. (num (+ (num-n x) (num-n y))))
  3. (define (num- x y)
  4. (num (- (num-n x) (num-n y))))
  5. (define (interp fae)
  6. (type-case FAE fae
  7. [num (n) fae]
  8. [add (l r) (num+ (interp l) (interp r))]
  9. [sub (l r) (num- (interp l) (interp r))]
  10. [id (s) (error 'interp "free variable")]
  11. [fun (x b) fae]
  12. [app (f a) (local [(define ftn (interp f))]
  13. (interp (subst (fun-body ftn)
  14. (fun-param ftn)
  15. (interp a))))]))

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

  1. (define (subst exp sub-id val)
  2. (type-case FAE exp
  3. [num (n) exp]
  4. [add (l r) (add (subst l sub-id val) (subst r sub-id val))]
  5. [sub (l r) (sub (subst l sub-id val) (subst r sub-id val))]
  6. [id (name) (cond [(equal? name sub-id) val]
  7. [else exp])]
  8. [app (f arg) (app (subst f sub-id val)
  9. (subst arg sub-id val))]
  10. [fun (id body) (if (equal? sub-id id)
  11. exp
  12. (fun id (subst body sub-id val)))]))

PLAI那些事_06 FAE的更多相关文章

  1. PLAI那些事_07 FAE with Deferred Substitution

    FAE-parse : 一成不变 FAE-Value : interp的最终转让值 ;;numV: value ;;closureV: param-FAE(或value,或function) pair ...

  2. FaE:基于符号知识的适应性和可解释的神经记忆

    原创作者 | 朱林 论文解读: Facts as Experts: Adaptable and Interpretable Neural Memory over Symbolic Knowledge ...

  3. 【腾讯Bugly干货分享】H5 视频直播那些事

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动 ...

  4. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  5. TODO:字节的那点事Go篇

    TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64) 在Golang中string底层是由byte数组组成的. fmt.Println(len(&quo ...

  6. Microsoft Visual Studio 2013 — Project搭载IIS配置的那些事

    前段时间在改Bug打开一个project时,发生了一件奇怪的事,好好的一直不能加载solution底下的这个project,错误如下图所示:大致的意思就是这个project的web server被配置 ...

  7. OpenNLP:驾驭文本,分词那些事

    OpenNLP:驾驭文本,分词那些事 作者 白宁超 2016年3月27日19:55:03 摘要:字符串.字符数组以及其他文本表示的处理库构成大部分文本处理程序的基础.大部分语言都包括基本的处理库,这也 ...

  8. HTTPS那些事(一)HTTPS原理

    转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...

  9. 做一个 App 前需要考虑的几件事

    做一个 App 前需要考虑的几件事  来源:limboy的博客   随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

随机推荐

  1. Python爬虫系列(六):搜索文档树

    今天早上,写的东西掉了.这个烂知乎,有bug,说了自动保存草稿,其实并没有保存.无语 今晚,我们将继续讨论如何分析html文档. 1.字符串 #直接找元素soup.find_all('b') 2.正则 ...

  2. Python设计模式(4)-装饰模式

    # coding=utf-8 # * 一般情况下,当一个基类写好之后,我们也许不愿意去改动,也不能改动,原因是# * 这样的在项目中用得比较久的基类,一旦改动,也许会影响其他功能模块,但是,# * 又 ...

  3. CentOS7安装JAVA环境

    安装JAVA环境我常用的有两种形式 1.下载tar包安装 2.下载rpm包直接安装 本篇内容就写这两种形式的安装方法: JAVA程序的下载地址:https://www.oracle.com/java/ ...

  4. AJ学IOS(34)UI之Quartz2D画画板的实现

    AJ分享,必须精品 效果: 实现过程: 首先用storyboard搭建界面,没有什么好说的. 然后就是注意的功能了,这里用了触摸事件来搭配Quartz2D的路径来画画. 思路就是把路径放到数组中 @p ...

  5. stand up meeting 12/23/2015

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云  基本完成单词本显示页面的设计和实现    4 完善页面切换   ...

  6. D-Power Products

    题目连接: 题解: 根据题目的意思,对每个X进行质因子分解,保存其质因子以及质因子出现的个数,如果两个数的乘积变成一个数的K次幂,那么两个数的质因子的指数之间相加应为k的倍数.保存完毕后,开始遍历,将 ...

  7. 详解 Hashtable

    至于HashTable,本人只想说,除了它们各自的特点是截然相反外,其余性质 以及 用法和HashMap的性质几乎一样, (有关Map集合的基本性质,请观看本人博文-- <详解 Map集合> ...

  8. [linux][mysql] 命令更改表结构:添加、删除、修改字段、调整字段顺序

    原文出处:http://www.phpernote.com/MySQL/1120.html 查看表结构: desc tabl_name; show columns fromtable_name: 常用 ...

  9. 【考试总结】欢乐模拟赛_Day2

    \(T1\) 题目描述 在仙界中有着 \(n\) 位神仙, 每位神仙用一个 \(1 ∼ n\) 的特异编号表示, 老祖 \(ChitongZ\) 的编号为 \(1\) . 除去至尊至圣, 统管仙界的老 ...

  10. 负载均衡服务之HAProxy基础配置(一)

    前文我们聊了下haproxy的基础安装,以及怎样去代理后端主机的配置:当然没有很详细的去说配置文件中各指令的意思:有关haproxy的安装和代理后端server可以参考本人博客https://www. ...