Pomyślałem, że odkąd Emacs Lisp i Common Lisp wydawały się tak blisko spokrewnione ze składnią, mogłem po prostu zastosować przykładowy kod, który znalazłem na RosettaCode, ale okazało się, że się myliłem.Jak utworzyć nazwane argumenty w ELisp?
Kod w pytaniu wygląda następująco:
(defun print-name (&key first (last "?"))
(princ last)
(when first
(princ ", ")
(princ first))
(values))
i zgodnie RosettaCode należy wykonać następujące czynności:
> (print-name)
?
> (print-name :first "John")
?, John
> (print-name :last "Doe")
Doe
> (print-name :first "John" :last "Doe")
Doe, John
Teraz tutaj jest rzeczą; gdy próbuję uruchomić tę funkcję w moim Elisp tłumacza, pojawia się następujący błąd:
*** Eval error *** Wrong number of arguments: (lambda (&key first (last "?")) (princ la\
st) (if first (progn (princ ", ") (princ first))) (values)), 0
nie jestem routined tyle w Lisp, aby wiedzieć, co to miało znaczyć, a nie ilość googlowania ma przewagę mnie bliższy odpowiedzi.
Więc jaki jest właściwy sposób robienia tego w Emacs Lisp?
Idiomatically, wolisz używać 'rekreacyjne args' i analizować' args' jako plist, który ma mniej bałaganu składniowej: '(druk -name: pierwszy "John": ostatni "Doe") '. – lunaryorn