gpt4 book ai didi

common-lisp - 在 common lisp 中使用 &allow-other-keys

转载 作者:行者123 更新时间:2023-12-04 14:25:48 26 4
gpt4 key购买 nike

我想制作最通用的函数,并决定使用键作为参数。
我想使用 allow-other-keys因为我想用任何键使用该功能。

让我演示给你看:

(defun myfunc (a &rest rest &key b &allow-other-keys)
;; Print A
(format t "A = ~a~%" a)

;; Print B if defined
(when b
(format t "B = ~a~%" b))

;; Here ... I want to print C or D or any other keys
;; ??
)

(myfunc "Value of A")
(myfunc "Value of A" :b "Value of B")
(myfunc "Value of A" :b "Value of B" :c "Value of C" :d "Value of D")

我知道 rest是剩余的参数,但它有一个数组。它不绑定(bind)值 cd甚至像关联列表一样构建它们(即像 (cdr (assoc 'c rest)) 那样做某事)

你有线索或解决方案吗?或者也许我走错了方向?

提前致谢

最佳答案

从什么时候开始 &REST 是一个数组?标准说 list 。对于关键字参数,这是一个属性列表。见 getf访问属性列表的元素。

也可以使用DESTRUCTURING-BIND访问该属性列表的内容:

CL-USER 15 > (defun foo (a &rest args &key b &allow-other-keys)
(destructuring-bind (&key (c nil c-p) ; var default present?
(d t d-p)
(e 42 e-p)
&allow-other-keys)
args
(list (list :c c c-p)
(list :d d d-p)
(list :e e e-p))))
FOO

; c-p, d-p, e-p show whether the argument was actually present
; otherwise the default value will be used

CL-USER 16 > (foo 10 :b 20 :d 30)
((:C NIL NIL) (:D 30 T) (:E 42 NIL))

但是在参数列表中也可以这样做......

关于common-lisp - 在 common lisp 中使用 &allow-other-keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33917769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com