LISP-简单的函数,语法错误?

时间:2012-05-04 00:49:35

标签: lisp common-lisp

我目前正在尝试学习lisp并在linux上使用emacs。尽我所能,我写了两个函数。

这两个函数首先删除列表的第一个元素。

  • series添加给定列表中的所有元素。
  • parallel         1)然后取列表中每个数字的倒数         2)然后添加列表中的所有元素         3)取元素之和的倒数。

代码:

(defun series (lst)
    (apply #'+' (cdr lst)) )

(defun parallel (lst)
    (/ 1 (apply #'+' (apply #'/' (cdr 'lst ) ) ) ))

我可以评估函数,但是当我尝试使用该函数时,如下所示:

(series (list 3 3 4 5))

我收到错误:值CDR不是预期类型NUMBER。    我看到了这一点,我想,为什么emacs将cdr视为数字而不是函数? 我是lisp和emacs的新手,所以我不知道要解决这个错误。任何帮助将不胜感激。


更新

我在这段代码中遇到了问题,我觉得它有用......

(defun series (lst)
 (apply #'+ (cdr lst) ))

(defun parallel(lst)
(/ 1 (apply #'+ (mapcar #'/ (make-list (- (length lst) 1) :initial-element 1) (cdr lst)  ) )))

希望我现在能理解的是。

2 个答案:

答案 0 :(得分:3)

你有额外的撇号会让LISP解析器感到困惑。引用+函数的语法只是#'+;没有“近距离报价”。

答案 1 :(得分:1)

回复:

(defun parallel (lst)
    (/ 1 (apply #'+' (apply #'/' (cdr 'lst ) ) ) ))

为什么 你试图丢弃第一个元素。这很奇怪。

请注意,即使引用问题已解决,此功能的逻辑也不起作用。

(apply #'/ (cdr lst))会将剩余的lst传递给/函数。此函数将生成一个数字。

然后你有效地(apply #'+ number),问题是apply想要一个列表。

你暗示的并行语义不会发生。

也许你想要这个:

 ;; divide the sum of the remaining elements, by the fraction of those elements
 (/ (apply #'+ (cdr lst)) (apply #'/ (cdr lst)))

请注意,在Emacs Lisp中,整数除以整数会产生整数,而不是像Common Lisp那样理性。