问:是否可以编写一个通用的Lisp函数,它可以按位置或关键字接受相同的参数如果是,怎么做?
例如,如何重写以下函数:

(defun fnx (&key a b c)
  (list a b c))

这样人们就可以通过以下每一种方式合法地称之为:
(fnx 1 2 3)
(fnx :a 1 :b 2 :c 3)
(fnx 1 2 :c 3)

最佳答案

是的,你可以,但是,不,你不想。
更准确地说,如果您可以编写规范,那么您可以在Lisp中实现它,但我认为您不能编写明确的规范。例如,这些调用应该返回什么:

(fnx :a :b :c)
(fnx :a :c :b)
(fnx :b :a :a)
(fnx :a :a :a)

还有很多其他角落的案子。
当然,你可以这样写:
(defun parse-my-args (&rest args)
   (let (a b c (curpos 0))
     ... some hairy processing
     (values a b c)))

(defun fnx (&rest args)
  (multiple-values-bind (a b c) (parse-my-args args)
    ...))

声明代码所做的一切都是正确的,但这看起来不是一个好主意。
我建议你想想你想完成什么,然后问一个问题。

关于lisp - 可以通过位置或关键字接受参数的常见Lisp函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25807533/

10-12 07:33