我正在努力学习LISP而且我已经挂了一些基本的东西 -
我想循环遍历列表并从列表值中查找plist值...
; here it just looks up the plist value
(defun get-plist-value(x) (getf (list :a "1" :b "2") x))
; this is what i want to do, but it doesnt work
; i have tried concatenating the ":" before the x value, but it didnt work either
(loop for x in '(a b) do (get-plist-value x))
; this works
(get-plist-value :a)
Run Code Online (Sandbox Code Playgroud)
谢谢 :-)
(loop for x in '(a b) do (get-plist-value x))
这里有两个问题.
首先,符号a与符号不同:a(除非你在keyword包中,这是非常不可能的),所以它将无法找到任何东西.同样地b.
其次,这将查找一个值,从get-plist-value调用中返回它,然后丢弃它而不对其执行任何操作.如果要将所有找到的项目收集到新列表中并让循环返回该列表,请使用collect而不是do; 如果你想输出找到的项目,请使用类似的东西do (format t "~&~A" (get-plist-value x)); 等等.
附录:请注意,打印表示中的冒号:a是如何打印符号的工件.冒号是包前缀,表示符号在keyword包中.它不是符号名称的一部分,因此简单地连接符号名称无济于事.如果您只想get-plist-value按名称比较符号,您可以执行以下操作,尽管它可能不是最漂亮的解决方案:
(defun get-plist-value (x)
(getf (list :a "1" :b "2")
(intern (symbol-name x) "KEYWORD")))
Run Code Online (Sandbox Code Playgroud)