common-lisp - 如何在 Common Lisp 中要求关键字参数?

标签 common-lisp keyword-argument

给定的

(defun show-arg (a)
  (format t "a is ~a~%" a))

(defun show-key (&key a)
  (format t "a is ~a~%" a))

评估
(show-arg)

将导致错误提示“无效的参数数量:0”,其中
(show-key)

将显示 a is NIL
我怎样才能得到SHOW-KEY发出类似 SHOW-ARG 的错误信号做?除了使用 (unless a (error "a is required")) 之外,还有其他方法吗?在函数体中?我非常喜欢关键字参数并经常使用它们,并且几乎总是希望它们是必需的。

最佳答案

关键字参数始终是可选的,因此您确实需要手动检查是否给出了它们,并在需要时发出错误信号。不过最好不要要求关键字参数。编译器不会按要求识别它们,因此不会在编译时为您提供缺少参数的错误消息。

如果确实需要它们,可以使用三元素列表指定参数;第一个元素是参数,第二个元素是默认值,第三个元素是一个变量,如果给定了参数,该变量将为真。检查第三个元素比检查关键字本身要好,因为这样您就可以分辨 NIL 之间的区别。这是默认设置,还有一个 NIL用户给出的参数。

(defun foo (&key (keyarg nil keyargp))
  (unless keyargp (error "KEYARG is required."))
  (* keyarg 2))

编辑

现在我想多了,实际上有一种方法可以获取缺少关键字参数的编译时错误。为函数定义一个编译器宏:
(defun foo (&key a b c d)
  (* a b c d))

(define-compiler-macro foo (&whole whole &key (a nil ap) (b nil bp)
                                   (c nil cp) (d nil dp))
  (declare (ignore a b c d))
  (unless (and ap bp cp dp)
    (error "Missing arguments..."))
  whole)

关于common-lisp - 如何在 Common Lisp 中要求关键字参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37428111/

相关文章:

common-lisp - 如何从 Lisp 镜像中删除函数或变量?

compilation - Common Lisp 编译和加载目录

lisp - Common Lisp 中的循环列表

map - Clojure 应用映射和关键字参数破坏

python - argparse - 如何传递给带有 kwargs 或 argv 的方法

common-lisp - Common Lisp共享结构困惑

common-lisp - Common Lisp 哈希表

python-3.x - 在哪里可以找到 PyQt5 方法签名?

python - 在 Python 中,什么决定了遍历 kwargs 时的顺序?

dictionary - Julia:编写一个返回参数值字典的函数 "paramvalues"