使用Java实现一门简单的动态语言

2018.8.4 更新

用Java写起来还是太繁琐了,直接用Python重写了。

这次正确地实现了静态作用域,还添加了另外几门玩具语言。

https://github.com/tdkihrr/learn_compiler/tree/master/eopl_in_other_languages

 


 

项目地址:https://github.com/tdkihrr/toy-lang

学习了EOPL后,不禁想自己写一门语言,同时还想学习下如何用静态类型语言实现动态类型语言,所以就选择了Java来写。

目前只写了后端,前端部分其实也可以手写,但之前已经写得够多了,再写下去也无法提高水平,而目前还不会使用Antlr这样的工具,所以就先不写了,反正也很简单。

最终的效果是这样的:

let x = 200
  in let f = proc (z) -(z,x)
    in let x = 100
      in let g = proc (z) -(z,x)
        in -((f 1), (g 1))

总结一下:

一、实现了“动态作用域”而非“静态作用域”。EOPL中将env传入exp中后,可以立即将identifier替换为绑定的值,能这样做是因为Scheme的动态性,所以Java做不到。目前的实现里,只能将exp完全展开后再进行idetifier的替换,那么后面的绑定覆盖了前面的绑定,所以成为了“动态作用域”。

二、体会到了Java实现动态语言的痛点,再也不想用动态类型语言来实现动态类型语言了。编写过程中,经常需要使用反射或者增加字段来确定运行时某一变量的类型,并做大量的强制类型转换。这样写完后自己感到很别扭,但问了下开源哥,好像也没有什么太好的办法了。

三、写大点的项目还是用Java好,有IDEA的加成,还有那么多可用的工具。瞧瞧DrRacket,代码补全和项目管理还是太弱,写起来好难受。

转载于:https://www.cnblogs.com/tdkihrr/p/8612860.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值