我已经用Python,PHP,Java和C编程了几年或几年,我刚读完黑客和画家,所以我很乐意尝试一下LISP!
我理解它与我所知道的完全不同,并且这并不容易.我想(如果我错了,请纠正我)LISP的社区和发展方式会减少.所以我的问题是:学习LISP的最佳方法是什么?
我不介意买书或投入一些时间.我只是不想浪费它.
"最终"的想法是使用LISP进行网页开发,我知道这不是那么常见所以......我知道在选择第一本书或教程之前计划我的学习是很好的,并花费大量时间在可能没有的东西上是最好的方式!
谢谢大家的答案!
编辑:我阅读Practical Common Lisp并且:...长,有点,有趣并且肯定让我在Lisp中滚动,之后我读了这个小阴谋家,这对我的整体编程很简单,有趣且非常好.因此,我的建议是首先阅读小阴谋,然后(它需要几个小时而且值得)如果你决定使用lisp(或方案或任何方言)不是你想要的东西,你仍然会非常有趣关于递归的新思路!
我想知道为什么我看到的大多数Common Lisp代码都有类似的东西
(mapcar #'(lambda (x) (* x x)) '(1 2 3))
而不仅仅是
(mapcar (lambda (x) (* x x)) '(1 2 3)),
这似乎也有效.我开始学习Common Lisp,并且在Scheme中有一些背景,这引起了我的兴趣.
编辑:我知道您需要带有函数名称的#',因为它们与变量位于不同的命名空间中.我的问题只是在lambda之前的#',因为lambda已经返回一个函数对象(我认为).#' - 由于宏扩展而减少lambdas的工作只会让它变得更有趣......
在Practical Common Lisp一书的第3章中,有一个类似SQL的选择和函数的例子.这是它的简化版本:
(defun where (x)
#'(lambda (item)
(> item x)))
Run Code Online (Sandbox Code Playgroud)
它像这样使用:
(remove-if-not (where 2) (list 1 2 3 4))
Run Code Online (Sandbox Code Playgroud)
在本书的前面部分解释说,#'序列用于表示它后跟一个函数名,而不是一个需要评估的变量.我不明白为什么这里需要它.我尝试在where没有它的情况下实现该功能,它也可以工作:
(defun where (x)
(lambda (item)
(> item x)))
Run Code Online (Sandbox Code Playgroud)
我试着谷歌搜索它,并且,正如你可以想象的那样,通过这样一系列的角色,它不是一个非常有成效的搜索.我不知道这件事的名字.在上面的代码中是否有任何特殊原因需要它?