【发布时间】:2012-05-13 13:17:59
【问题描述】:
我目前正在尝试学习 lisp 并在 linux 上使用 emacs。尽我所能,我写了两个函数。
这两个函数都先删除列表的第一个元素。
-
series添加给定列表中的所有元素。 -
parallel1) 取列表中每个数字的倒数,然后 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) ) )))
希望我现在尝试做的事情被理解了。
【问题讨论】:
-
Lisp 中的
'符号与带引号的字符串非常不同。没有结束报价。'<anything>是一个简写形式,代表列表结构(quote <anything>)。这很有用,因为在评估(quote <anything>)时,值始终是对象<anything>本身,无论它是什么。(quote (+ 2 2))的值是列表(+ 2 2)而不是4。 Lisp 对字符串文字有一个双引号,如"abc",而字符常量有一个'#\'(哈希反斜杠)语法,其中有一些变化,如'#\space' 表示空格和'#\A' 表示大写A。 -
@Kaz 这绝对应该成为您的答案,而不是隐藏在 cmets 中。 :)
-
in Common LISP
mapcar在较短的列表结束时停止。这意味着,循环列表 可用于提供默认参数:(nth 5 (setq b '(1.0) b (rplacd b b))) ==> 1.0。不过不知道emacs-Lisp。顺便说一句,您在使用1和1.0时得到相同的答案吗? -
嗯.......我对循环列表不熟悉,但这个概念似乎更直观。在这种情况下,
mapcar旁边的两个列表都保证长度相同。我还看到'#1='(1 2 3 . #1#)是循环列表的一个例子。这行得通吗?
标签: lisp common-lisp