阅读Paul Graham关于编程语言的论文,人们会认为Lisp宏是唯一可行的方法.作为一个忙于开发人员,在其他平台上工作,我没有使用Lisp宏的特权.作为想要了解嗡嗡声的人,请解释是什么让这个功能如此强大.
还请将此与我从Python,Java,C#或C开发世界中理解的内容联系起来.
今天教授的软件工程完全专注于面向对象的编程和面向世界的"自然"面向对象的视图.有一个详细的方法描述了如何将域模型转换为具有多个步骤的类模型以及许多(UML)工件,如用例图或类图.许多程序员已经内化了这种方法,并且很好地了解了如何从头开始设计面向对象的应用程序.
新的炒作是函数式编程,在许多书籍和教程中都有教授.但功能软件工程呢?在阅读有关Lisp和Clojure的文章时,我发现了两个有趣的陈述:
功能程序通常是自下而上而不是自上而下开发('On Lisp',Paul Graham)
函数程序员使用映射,其中OO程序员使用对象/类('Clojure for Java Programmers',Rich Hickley的演讲).
那么功能性应用程序的系统化(基于模型的?)设计的方法是什么,即在Lisp或Clojure中?有哪些常见步骤,我使用哪些工件,如何将它们从问题空间映射到解决方案空间?
lisp functional-programming clojure model-driven-development
我一直在学习Lisp以扩展我的视野,因为我听说它用于AI编程.在做了一些探索之后,我还没有找到人工智能的例子或语言中任何会使其更倾向于它的东西.
过去是否使用过Lisp因为它可用,或者是否有一些我只是缺少的东西?
Racket是Scheme的后代.Racket与R6RS有何不同?它添加或带走了什么,或者只是不同?
据我所知,Racket不仅仅是一种语言,它还是一种语言平台.但我指的是主要的球拍方言.
我已经用Python,PHP,Java和C编程了几年或几年,我刚读完黑客和画家,所以我很乐意尝试一下LISP!
我理解它与我所知道的完全不同,并且这并不容易.我想(如果我错了,请纠正我)LISP的社区和发展方式会减少.所以我的问题是:学习LISP的最佳方法是什么?
我不介意买书或投入一些时间.我只是不想浪费它.
"最终"的想法是使用LISP进行网页开发,我知道这不是那么常见所以......我知道在选择第一本书或教程之前计划我的学习是很好的,并花费大量时间在可能没有的东西上是最好的方式!
谢谢大家的答案!
编辑:我阅读Practical Common Lisp并且:...长,有点,有趣并且肯定让我在Lisp中滚动,之后我读了这个小阴谋家,这对我的整体编程很简单,有趣且非常好.因此,我的建议是首先阅读小阴谋,然后(它需要几个小时而且值得)如果你决定使用lisp(或方案或任何方言)不是你想要的东西,你仍然会非常有趣关于递归的新思路!
我已经尝试过Lisp(实际上是Scheme)并发现它是一种非常漂亮的语言,我有兴趣学习更多.但是,似乎Lisp从未在严肃的项目中使用过,而且我没有看到它被列为任何职位发布所需的技能.我有兴趣听到任何使用过Lisp或者在"现实世界"中使用它的人,或者谁知道它是否被认为是纯粹的学术语言.
我需要一些帮助来理解Paul Graham的What What Lisp Different中的一些观点.
一个新的变量概念.在Lisp中,所有变量都是有效的指针.值是具有类型而不是变量的值,分配或绑定变量意味着复制指针,而不是它们指向的内容.
符号类型.符号与字符串的不同之处在于您可以通过比较指针来测试相等性.
使用符号树的代码表示法.
整个语言始终可用.读取时间,编译时和运行时之间没有真正的区别.您可以在编译时编译或运行代码,同时在运行时读取或编译代码.
这些点意味着什么?它们在C或Java等语言中有何不同?除了Lisp系列语言之外的任何其他语言现在都有这些结构吗?
我知道Lisp和Scheme程序员通常会说eval
除非必要,否则应该避免.我已经看到了几种编程语言的相同建议,但我还没有看到一个反对使用的明确论据列表eval
.我在哪里可以找到使用中潜在问题的说明eval
?
例如,我知道GOTO
程序编程中的问题(使程序难以理解且难以维护,难以找到安全问题等),但我从未见过反对的论点eval
.
有趣的GOTO
是,相反的论点应该对延续有效,但我看到Schemers,例如,不会说延续是"邪恶的" - 你在使用时应该小心.他们更倾向于使用代码而eval
不是代码使用continuation(据我所知 - 我可能是错的).
我从其他方面了解其他Lisps(特别是Scheme).最近我一直在读关于Clojure的文章.我看到它有"符号"和"关键字".符号我很熟悉,但没有关键字.
其他Lisps有关键字吗?关键字如何与除了具有不同符号(即:冒号)之外的符号不同?
lisp ×10
clojure ×6
scheme ×6
common-lisp ×4
eval ×1
java ×1
keyword ×1
macros ×1
paul-graham ×1
racket ×1