我喜欢基于图像的语言的想法,最近我一直在通过sbcl玩弄Common Lisp.我已经在几个地方读到了如何通过保存和加载虚拟机的映像,您可以改进在该映像上运行的应用程序或一组应用程序.
我得到了如何将代码加载到图像中并使其运行,slime使这种事情非常好,但我的问题是:如何判断图像中定义了哪些函数?假设我想在运行后几天或几个月对某个功能进行更新,我记不起名字了.有没有办法获得代码甚至只是图像中定义的函数的名称?
现在,我将代码写入源代码并通过repl加载,所以我有一个副本,但似乎这是一个明显的功能.
我们在Haskell中有一个大型控制台应用程序,我负责制作跨平台并添加一个gui.
要求是:
现在,这个问题的真正原因是解释我正在研究的一个解决方案,并且由于我没有想到的原因而征求这个问题.
我的解决方案是原生的gui.Windows上的Winforms,Mac OS X上的Cocoa和Linux上的GTK/Glade,它们只处理演示文稿.然后我会在Haskell代码之上编写一个层,使用ZeroMQ来处理消息以及用于来回序列化数据的protobuf,将它转换为来自UI的消息的响应者.因此本机应用程序将启动,它本身将启动所有魔法发生的守护进程,并来回发送消息.
除了确保守护进程只接受来自启动它的应用程序的连接,以及为高级gui元素(我正在考虑表视图,单元格等)来回提供正确数据的挑战,我不知道看到许多缺点.
我没想到的是什么让这个坏主意?
我应该提一下,乍一看我将在所有平台上使用GTK.问题在于,虽然它很接近,并且对Haskell的GTK和Glade支持很好用,但结果看起来并不"正确".它很接近,但只是不能以微妙的方式本地化,这使得该解决方案对于正在为这项工作编写支票的人来说是不可接受的.
此外,多个平台的问题,因此gui的多种语言不是问题所以我不一定寻找其他方法来解决这个问题,除非它简化了与haskell代码的互操作.
我在Haskell中有两个简单的数据类型:
data Ticket = Ticket {
tbody :: String,
tauthor :: String,
tcomments :: [TicketComment]
}
data TicketComment = TicketComment {
tcbody :: String,
tcauthor :: String
}
Run Code Online (Sandbox Code Playgroud)
暂时忽略时间戳的缺失,以及字符串与字节串的使用,我只想将注释存储在嵌套在票证中的MongoDB中.
到目前为止,我一直在使用一个相当简单的实例来存储数据:
class MongoIO a where
transout :: a -> [Field]
transin :: [Field] -> (Maybe a)
Run Code Online (Sandbox Code Playgroud)
然后实现看起来像这样:
instance MongoIO Ticket where
transout a = [("body" =: tbody a),
("author" =: tauthor a),
("comments" =: tcomments a)]
transin a = case (,,) <$> look "body" a
<*> look "author" a
<*> look …Run Code Online (Sandbox Code Playgroud) 在工作中已经有一些关于将其作为禁止使用unsafePerformIO和相关的部门范围政策的讨论.就个人而言,我并不介意,因为我一直认为,如果我发现自己想要使用它,通常意味着我需要重新思考我的方法.
这种限制听起来合理吗?我似乎记得在某个地方读到它主要是为了FFI,但是我不记得我现在读到的地方.
编辑:好的,那是我的错.它不会受到合理需要的限制,即.FFI.政策的重点更多是为了阻止懒惰和代码味道.