【发布时间】:2011-05-21 13:03:14
【问题描述】:
我想编写一个小函数来向列表添加值。它看起来像这样:
(defvar fares '(31.14 28.12 25.10 22.08 19.06 16.04 13.02 10))
(defun plus-extra (fare) (+ 3.02 fare))
(map 'plus-extra fares)
可以预见的是,elisp 会出错,因为该函数需要一个参数。我错过了什么?
谢谢 罗伯特
【问题讨论】:
我想编写一个小函数来向列表添加值。它看起来像这样:
(defvar fares '(31.14 28.12 25.10 22.08 19.06 16.04 13.02 10))
(defun plus-extra (fare) (+ 3.02 fare))
(map 'plus-extra fares)
可以预见的是,elisp 会出错,因为该函数需要一个参数。我错过了什么?
谢谢 罗伯特
【问题讨论】:
这里没有足够参数的函数是map,不是你定义的那个。
map 函数在 Emacs Lisp 中不存在,它由 cl 包提供。这个map 函数需要3 个参数,第一个参数必须是map 应该返回的类型。这个:
(map 'list 'plus-extra fares)
会起作用。但是你想要的是这样的:
(mapcar 'plus-extra fares)
这是原生的elisp。
PS:不要忘记 Emacs 附带它的文档! C-h f map RET ;-).
【讨论】:
使用mapcar,而不是map。使用mapcar,您的示例产生:
(34.160000000000004 31.14 28.12 25.099999999999998 22.08 19.06 16.04 13.02)
如果你M-x describe-function RET map RET,你会看到map 的签名不是你所期望的:
(map TYPE FUNCTION SEQUENCE...)
Map a FUNCTION across one or more SEQUENCEs, returning a sequence.
TYPE is the sequence type to return.
【讨论】: