gpt4 book ai didi

lisp - 如何从 plist 中获取属性

转载 作者:太空宇宙 更新时间:2023-11-03 18:46:13 25 4
gpt4 key购买 nike

我是 Lisp 的新手。我想使用这样的字符串变量访问属性列表中的特定属性

(setf sym (list :p1 1))
(setf x "p1")
(getf sym :x)

最佳答案

关于 cl:getf

让小王子的回答是对的getf可能是您想在此处使用的函数,但请注意,它不仅可用于关键字符号。您可以将它用于任何对象。属性列表只是交替指示器和值的列表,任何对象都可以是指示器:

(let ((plist (list 'a 'b 'c 'd)))
(getf plist 'c))
;=> D

您甚至可以使用字符串作为指示符:

(let* ((name "p1")
(plist (list name 1)))
(getf plist name))
;=> 1

但是,这可能不是很好的做法,因为 getf 将指标与 eq 进行比较。这意味着使用字符串作为指示符可能不可靠,具体取决于您的用例:

(let ((plist (list "p1" 1)))
(getf plist "p1"))
;=> NIL

举个例子

在你的例子中,你试图获取一个字符串并找到一个符号的对象,该符号的名称与字符串相等(即,具有相同的字符,但不考虑大小写)。 循环列表并将指标与string-equal进行比较可能更有意义。

(let ((plist '(:p1 1 :p2 2)))
(loop
for (indicator value) on plist by #'cddr
when (string-equal indicator "p1")
return value))
;=> 1

当然,您可以将其包装在一个抽象函数中:

(defun getf-string-equal (plist indicator)
(loop
for (i v) on plist by #'cddr
when (string-equal i indicator)
return v))

(getf-string-equal '(:p1 1 :p2 2) "p1")
;=> 1

关于lisp - 如何从 plist 中获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27200120/

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