Как передать аргументы для отображения в emacs lisp? - PullRequest
8 голосов
/ 21 мая 2011

Я хочу написать небольшую функцию, чтобы добавить значение в список. это выглядит так:

(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 barfs, потому что функции нужен аргумент. Чего мне не хватает?

Спасибо Роберт

Ответы [ 2 ]

16 голосов
/ 21 мая 2011

Функция, у которой здесь недостаточно аргументов, 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 ; -).

7 голосов
/ 21 мая 2011

Используйте mapcar, а не mapmapcar ваш пример дает:

(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.
...