2

我目前正在尝试学习 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)  ) )))

希望我现在尝试做的事情得到理解。

4

2 回答 2

3

您有额外的撇号使 LISP 解析器感到困惑。引用+函数的语法就是#'+; 没有“关闭报价”。

于 2012-05-04T01:04:01.283 回答
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 中那样的有理数。

于 2012-05-05T05:32:19.507 回答