我已经用Python,PHP,Java和C编程了几年或几年,我刚读完黑客和画家,所以我很乐意尝试一下LISP!
我理解它与我所知道的完全不同,并且这并不容易.我想(如果我错了,请纠正我)LISP的社区和发展方式会减少.所以我的问题是:学习LISP的最佳方法是什么?
我不介意买书或投入一些时间.我只是不想浪费它.
"最终"的想法是使用LISP进行网页开发,我知道这不是那么常见所以......我知道在选择第一本书或教程之前计划我的学习是很好的,并花费大量时间在可能没有的东西上是最好的方式!
谢谢大家的答案!
编辑:我阅读Practical Common Lisp并且:...长,有点,有趣并且肯定让我在Lisp中滚动,之后我读了这个小阴谋家,这对我的整体编程很简单,有趣且非常好.因此,我的建议是首先阅读小阴谋,然后(它需要几个小时而且值得)如果你决定使用lisp(或方案或任何方言)不是你想要的东西,你仍然会非常有趣关于递归的新思路!
我正在尝试创建一个接受列表和函数作为参数的函数,并将该函数应用于List中的每个元素.这是我的尝试:
(defun filter(fn L)
(if (eq 0 (length L))
(print "list empty")
(print (mapcar (lambda (n) (#'fn n)) L))))
(print (filter #'evenp '(1 2 2 3 4)))
Run Code Online (Sandbox Code Playgroud)
这是第二次尝试:
(defvar R nil)
(defun filter(fn L)
(if (eq 0 (length L))
nil
(cons (R (funcall fn (car L)) filter(fn (cdr L))))))
(print(filter #'evenp '(1 2 2 3 4)))
Run Code Online (Sandbox Code Playgroud)
但对于一些简单的混乱和无法解释的原因,我得到第一个错误:
#'FN should be lambda expression.
Run Code Online (Sandbox Code Playgroud)
这是第二个:
Undefined function R
Run Code Online (Sandbox Code Playgroud)
我尝试了很多东西但到目前为止还没有任何工作.
编辑::感谢您的帮助到目前为止.这个:
(defun filter(fn L)
(if (eq 0 (length L))
(print "list empty")
(remove-if-not …Run Code Online (Sandbox Code Playgroud) lisp functional-programming function common-lisp parameter-passing
我正在尝试制作一个将中缀输入更改为前缀的函数,例如:(x + 1)作为输入输出为(+ x 1).
所以这是我目前的代码:
(setq x '(Y + 1))
(if (listp x ) (list (second x) (first x) (first (last x))) x)
Run Code Online (Sandbox Code Playgroud)
所以(+ Y 1)如果我输入一个列表它会返回,如果它不是一个列表则返回用户输入。
但是,问题是我无法在函数中使用此代码:
(defun prefixToInfix (x)(
(if (listp x ) (list (second x) (first x) (first (last x))) x)
)
)
Run Code Online (Sandbox Code Playgroud)
该函数确实已创建,但是当我调用它时
(prefixtoinfix '(Y + 1))
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
Error: Illegal function object: (IF (LISTP X) (LIST # # #) X).
[condition type: TYPE-ERROR]
Run Code Online (Sandbox Code Playgroud)
我不知道为什么我的 if 语句在主程序中有效,但当我从我的函数中运行它时却没有。