如何从plist获取属性

情感的

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

(setf sym (list :p1 1))
(setf x "p1")
(getf sym :x)
约书亚·泰勒(Joshua Taylor)

关于cl:getf

让Petit Prince的答案是正确的,即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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章