我的问题是,是否有不同的应用或用途,其中像Haskell这样的语言比像Common Lisp这样的更动态的语言更有意义。例如,似乎Lisp可以用于更底层的编程,例如构建网站或GUI,而Haskell可以用于编译时检查更需要的地方,例如构建TCP/IP服务器或代码解析器。
Lisp的流行应用: Emacs
Haskell的流行应用: PUGS Darcs
您是否同意,并且有没有相关研究?
我的问题是,是否有不同的应用或用途,其中像Haskell这样的语言比像Common Lisp这样的更动态的语言更有意义。例如,似乎Lisp可以用于更底层的编程,例如构建网站或GUI,而Haskell可以用于编译时检查更需要的地方,例如构建TCP/IP服务器或代码解析器。
Lisp的流行应用: Emacs
Haskell的流行应用: PUGS Darcs
您是否同意,并且有没有相关研究?
编程语言是用于思考的工具。如果你足够努力,可以用任何语言来表达任何程序。一个编程语言相对于另一个提供的最主要价值在于它为从不同角度思考问题提供的支持程度。
例如,Haskell 是一种强调从类型角度思考问题的语言。如果有一种便捷的方式可以用 Haskell 的数据类型来表达问题,那么你很可能会发现这是一种编写程序方便的语言。
Common Lisp 的优点(很多)在于其动态性质和同构性(也就是说,Lisp 程序非常容易表示和操作为 Lisp 数据)——Lisp 是一种“可编程的编程语言”。例如,如果您的程序最容易用新领域特定语言表达,Lisp 使得这个过程非常容易。如果你的问题描述涉及到数据类型难以指定或在开发过程中可能会变化,那么 Lisp(以及其他动态语言)是一个很好的选择。
语言选择通常是审美决策之一。如果您的项目需求没有限制您使用特定的语言进行兼容性、依赖性或性能方面的原因,那么你可以选择实现感觉最好的语言。
我主要从Common Lisp的角度出发,就我所知,Common Lisp适用于任何应用。
是的,默认是动态类型(即在运行时检测类型),但你仍然可以为了优化而声明类型(顺便提一下,CL是强类型的;不要混淆弱/强类型和静态/动态类型!)。
我可以想象,Haskell可能会比Ada更适合用作航空电子设备领域的替代品,因为它至少强制在编译时进行所有类型检查。
我不明白为什么CL在TCP/IP服务器或代码解析器方面不如Haskell有用--相反,我认为它更有用,但我与Haskell的接触迄今为止很短暂。
我发现动态类型的最佳用途是当您依赖于无法控制的事物时,它可以被动态使用。例如,从XML文档获取信息,我们可以这样做:
var volume = parseXML("mydoc.xml").speaker.volume()
不使用鸭子类型会导致类似这样的情况:
var volume = parseXML("mydoc.xml").getAttrib["speaker"].getAttrib["volume"].ToString()
setf
,程序就不再是真正的函数式程序了。Clojure至少强制将命令核心放在特殊块中,并强制执行事务性内存。 - Charlie Martin