现在我一般都在Java / C#中(爱他们两个,真的不能说我专注于一个)。
我最近和朋友一起讨论了F#和C#之间的差异,当他惊讶地说:“所以...... F#听起来很像lisp,但是对瑞士军刀的感觉却少了。”登记/>
现在,我有点惭愧地说这个,但我不知道什么是口齿不清
经过一番搜索,我发现lisp非常有趣,但被多种方言和运行环境所困扰。
以下是我所知道的: 我知道3种方言:
lisp的基本思想似乎是将代码用作数据。
我想知道的事情:
我也很高兴你们可以给我任何额外的细节! (链接也很受欢迎!电子书和诸如此类的东西。)
编辑: 此处的所有答案都非常有用。因此,我给了他们所有+1代表,但最好选择更具体的。谢谢大家。
答案 0 :(得分:14)
在来到Lisp之前,我还深入学习了Java和C#,希望能够分享一些有用的观点。
首先,所有Lisps都很棒,你应该考虑学习一个。埃里克雷蒙德有一句名言:
“Lisp值得你学习深刻的启蒙经验 当你最终得到它时会有;那段经历会让你成为一名 即使你从未如此,你的余下时间也会有更好的程序员 实际上经常使用Lisp本身。“
Lisps特别有趣和强大的原因是:
我个人对Lisp现在学习的建议是Clojure。 Clojure有一些明显的优势使它脱颖而出:
[]
之外,Clojure还为向量{}
和哈希映射()
添加了一些新语法。纯粹主义者可能不赞成,但我个人认为这些创新发现使得语言的使用和阅读更加出色。(.methodName someObject arg1 arg2)
。随着巨大的Java库生态系统(主要是开源)的可用性,Clojure在实用性方面基本上超越了所有“利基”语言在应用方面,Clojure旨在成为一个完全通用的语言,因此可以在任何领域使用 - 当然不限于AI。我知道人们在创业公司中使用它,将其用于大数据处理,甚至编写游戏。
最后关于性能点:对于使用更高级别的语言结构,你基本上总是要付出轻微的性能损失。然而,根据我的经验,Clojure与Java或C#“足够接近”,你不会注意到通用开发的差异。它有助于Clojure 始终编译,并且您可以使用可选类型提示来获得静态类型的性能优势。
flawed benchmarks(截至2012年初)将Clojure置于Java,Scala和C#等静态类型语言速度的2-3倍之内,略微落后于Common Lisp并略微领先于Scheme(球拍)。
答案 1 :(得分:11)
Lisp,正如你所发现的,不是一种语言;它是一系列具有某些共同特征的语言。
Lisp有两种主要方言:Common Lisp和Scheme。这两种方言中的每一种都有许多实现,每种都有自己的特性。但是,Common Lisp和Scheme都是标准化的,标准定义了一些特定的功能基线,您可以期待任何实现。
Scheme是一种简约语言,具有非常小的标准库。它主要由学生和理论家使用。 Common Lisp具有更多语言功能和更大的标准库,包括强大的对象系统,并已在大型生产系统中使用。
Clojure是另一种次要的,更近期的方言。如果你想了解Lisp,最好先学习Common Lisp或Scheme。
我的建议是先学习Scheme;它是Lisp所构成的思想的更纯粹的表达,并将帮助您理解语言的本质。在许多方面,Lisp与Java和其他命令式语言完全不同;但是,从中学到的东西将使你成为这些语言中更好的程序员。在了解Scheme之后,您可以轻松学习Common Lisp。
简而言之,Lisp的优势在于它比其他语言more powerful。所有Lisp代码都是Lisp数据,可以这样操作;这使得您可以使用元编程实现非常酷的功能,这些功能根本无法在其他语言中完成,因为它们无法直接访问构成代码的数据结构。 (Lisp可以做到这一点而且它们不能与其奇怪的语法密切相关。每个编译器或解释器在阅读源代码后,必须将其转换为abstract syntax trees。与其他语言不同,Lisp的语法是直接表示转换为Lisp代码的AST,因此您可以知道这些树的外观并可以直接操作它们。)最常用的元编程功能是宏; Lisp宏可以直接将一些源代码翻译成你可以编程的任何东西。你不能用C宏来做到这一点。
“开发和执行速度更快”的事情可能是对大多数Lisp实现提供的一个特定功能的引用:read-eval-print循环。您可以在提示中键入表达式,解释器将对其进行评估并打印结果。这对学习语言,调试或调查代码都很有用。
Lisp是动态类型的(尽管存在静态类型的风格)。大多数Lisp实现都在自己的虚拟机上运行;但是,许多也可以编译为机器代码。 Clojure专门针对JVM编写;它也可以针对.NET和JavaScript。
虽然最初是为人工智能研究而创建的,但Lisp绝不仅仅适用于AI。它在主流生产环境中不受欢迎的主要原因(除了Java和C#的自我延续优势)是图书馆支持。 Common Lisp有很多好的库(Scheme不那么好),但与Java或Python提供的大量库支持相比,它显得苍白无力。
如果你想开始使用,我建议你下载Racket,一个非常流行的Scheme实现。它拥有您需要的一切,包括一个简单但非常强大的IDE,带有一个开放式读取评估打印循环。尽管最初是作为一种教学语言开发的,但它带有一个非常大的标准库,它比Common Lis更具有Common Lisp的特性。因此,它在真实的生产环境中得到了应用。
答案 2 :(得分:4)
运行时环境
Common Lisp和Scheme通常有自己独特的运行时环境。 Scheme(Chicken和Gambit)的一些变体可以转换为C,然后与它们的环境链接,以便能够作为独立的可执行程序进行部署。 Clojure在JVM中运行,并且还有一个CLR端口,但我不清楚CLR端口是否与JVM保持同步。 Clojure还有Clojurescript,它以Javascript运行时为目标。
哪个最好先学习
我不认为这个问题有一个好的答案。由你决定。虽然如果您有使用JVM的经验,那么Clojure可能会更加顺畅。
Lisp的优点是什么
这是一个可能引发火焰战争的问题。我没有太多经验丰富的经验。我几个月前认真学习Clojure,多年来一直关注Common Lisp和Scheme。
我喜欢的是他们的动态性质。您需要在程序运行时在运行时更改函数吗?没问题!像任何电动工具一样,使用它时必须小心不要切掉你的位。
力量和表现力也令人上瘾。我能用很少的努力做一些我知道用Java无法实现的东西,或者我知道需要做更多的工作。具体来说,我能够汇总一个数据结构的描述 - 虽然使用宏,但延迟评估部分数据直到正确的时间。如果我在Java中完成了这个,我就不能像我那样嵌套声明,因为它们会以错误的顺序进行评估。随之而来的是痛苦。
我也喜欢Clojure对函数式编程的看法,虽然我不得不说它需要调整工作。
Lisp是否通用
是。
-
Mark Volkman在Clojure上有一个非常好的article。有很多基础知识。我在开始时做的一件事就是在我需要以编程方式解决问题时启动一个repl和实验。例如探索API或进行一些计算。经过一段时间后,我开始努力提高工作水平,我现在正在开展一个涉及Clojure的项目。
关于Clojure的书已经写好了。 Stuart Sierra的书正在更新;而Oreilly的书很快就会出来,所以你可能想等一下。 Clojure的喜悦很好,但我认为它不是一本好的入门书。
对于Common Lisp,我强烈推荐Lisp的土地。
对于Scheme,有几个经典作品,包括The Little Schemer和SICP。
哦,这个:http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey(也许是你将要观看的最重要的演讲之一),以及http://www.infoq.com/presentations/hickey-clojure(IIRC,非常适合Clojure的演讲)。
答案 3 :(得分:3)
Common Lisp既可以编译也可以解释。部署(在Windows中)可以通过带有DLL的exe来完成。或者通过预编译的字节码。或者在目标设备上安装Lisp系统并对其执行源代码。
Common Lisp是一种完全可用的工业语言,具有活跃的社区和库,可用于许多不同的任务。
Lisps通常可以更快地进行开发,并且由于具有抽象功能,因此可以更好地开发更高级别的概念。很难解释。 Ruby vs. C就是这种事情的一个例子。所有Lisps都具备IMO的能力。
Common Lisp是一种通用语言。我不知道现代Common Lisp实现是否直接支持执行程序集,因此编写驱动程序或使用编译器不支持的CPU指令可能很困难。
我喜欢Common Lisp,但Clojure和Racket也不会打喷嚏。在我看来,Clojure特别代表了一条非常有趣的轨道。
对于电子书,你可以通过Graham和Gentle Introduction to Symbolic Computation获得On Lisp。可能是其他人,但那些是我能记得的。