Я понял, что, поскольку Emacs Lisp и Common Lisp казались настолько тесно связанными с синтаксисом, я мог бы просто следовать примеру кода, который я нашел на RosettaCode, но оказывается, что я ошибся.Как создать именованные аргументы в ELisp?
Код в вопросе выглядит следующим образом:
(defun print-name (&key first (last "?"))
(princ last)
(when first
(princ ", ")
(princ first))
(values))
И согласно RosettaCode он должен сделать следующее:
> (print-name)
?
> (print-name :first "John")
?, John
> (print-name :last "Doe")
Doe
> (print-name :first "John" :last "Doe")
Doe, John
Теперь, вот в чем дело; всякий раз, когда я пытаюсь запустить эту функцию в моем переводчике Elisp, я получаю следующее сообщение об ошибке:
*** Eval error *** Wrong number of arguments: (lambda (&key first (last "?")) (princ la\
st) (if first (progn (princ ", ") (princ first))) (values)), 0
Я не routined достаточно в сюсюкать, чтобы знать, что это, как предполагается, значит, и никакого количества погуглить Передовой меня ближе к ответу.
Итак, каков правильный способ сделать это в Emacs Lisp?
идиоматически, вы бы лучше использовать '& отдых args' и разобрать' args', как PLIST, который имеет меньше синтаксической беспорядок: '(печать -name: первый «Джон»: последний «Doe»). – lunaryorn