所以我目前正在研究一种新的编程语言.受并发编程和Haskell的启发,该语言的主要目标之一是管理副作用.或多或少,每个模块都需要指定它允许的副作用.所以,如果我正在制作游戏,那么图形模块将无法执行IO.输入模块无法绘制到屏幕上.AI模块必须是完全纯净的.游戏的脚本和插件可以访问非常有限的IO子集来读取配置文件.等等.
然而,副作用的构成并不明确.我正在寻找有关我可能想用我的语言考虑的主题的任何想法或建议.这是我目前的想法.
一些副作用是明显的.无论是打印到用户控制台还是发射导弹,任何读取或写入用户拥有文件或与外部硬件交互的操作都会产生副作用.
其他更微妙,这些是我真正感兴趣的.这些是诸如获取随机数,获得系统时间,睡眠线程,实现软件事务存储器,甚至是非常基本的东西,如分配内存.
与其他用于控制副作用的语言(看着你的Haskell)不同,我想设计我的语言是务实和实用的.对副作用的限制应该有两个目的:
考虑到这一点,如上所述,我应该如何处理"伪"边效应,如随机数和睡眠?还有什么我可能错过的?我可以通过哪些方式管理内存使用和资源时间?
我正在为Haskell中的简单命令式语言编写编译器,输出Java字节码.我已经到了我发出字节码的抽象表示的地步.
在编写用于编译if语句的代码时遇到了一些麻烦.要实现if语句,我需要跳转到标签.因此,我需要为该标签生成一个名称,该名称必须是唯一的.
我的第一个想法是通过一些状态compileStatement,即
compileStatement :: Statement -> UniqueIDState -> [AbstractInstruction]
Run Code Online (Sandbox Code Playgroud)
当然,compilerStatement是递归的,所以使用这种方法需要我从递归调用中将唯一ID生成器的状态传递回upp:
compileStatement :: Statement -> UniqueIDState -> (UniqueIdState, [AbstractInstruction])
Run Code Online (Sandbox Code Playgroud)
这看起来有点笨拙,特别是如果我意识到我需要在将来携带更多状态; 有更优雅的方式吗?