gpt4 book ai didi

common-lisp - 在 Common Lisp 中将变量列表评估为其值列表

转载 作者:行者123 更新时间:2023-12-04 03:13:50 24 4
gpt4 key购买 nike

我想知道如何实现以下目标。假设我有一个由上面的一些 let 绑定(bind)的变量列表。我想将此列表转换为这些变量绑定(bind)到的值的列表。

也就是说,假设我们有

(define make-plist-from-variables (variables)
(let ((keys variables)
(values (mapcar #'identity variables)))
(if (eq (length keys) (length values))
(make-plist keys values)
nil))))

我可以用什么代替 #'identity 来正确解压这些值?

此刻,以下调用产生以下输出。

CL-USER> (let ((a 2) (b 3)) (make-plist-from-variables '(a b)))
(A A B B)

我希望它是(A 2 B 3)

最佳答案

它需要是一个宏,因为没有办法根据变量的符号获取变量的词法值。

(defmacro make-plist-from-variables (&rest variables)
(loop :for binding :in variables
:collect `',binding :into result
:collect binding :into result
:finally (return `(list ,@result))))

(macroexpand-1 '(make-plist-from-variables a b))
; ==> (list 'a a 'b b)

(let ((a 2) (b 3))
(make-plist-from-variables a b))
; ==> (a 2 b 3)

编辑

使用mapcan 实现无循环 :

(defmacro make-plist-from-variables (&rest variables)
`(list ,@(mapcan (lambda (v) `(',v ,v)) variables))

关于common-lisp - 在 Common Lisp 中将变量列表评估为其值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56401331/

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