我目前正在尝试学习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) ) )))
希望我现在能理解的是。
答案 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那样理性。