如果键在变量中,则从 plist 中获取值

问题描述 投票:0回答:1

我正在编写代码来生成我的 selfhost 播客的 rss 提要,我需要一个函数来根据播客项目的文件扩展名返回类型。

例如,如果播客文件(项目)的扩展名是

mp4
,我需要返回字符串
video/mp4
。这是生成标签
<enclosure>
所必需的,如播客 RSS 指南中所述。

这个问题可以通过条件枚举函数来解决。例如,

(defun podcast-return-type (ext)
  "return type string for item file extension"
  (cond
   ((string= ext "m4a") (identity "audio/x-m4a"))
   ((string= ext "mp4") (identity "video/mp4"))
   ((string= ext "mp3") (identity "audio/mpeg"))
   ((string= ext "mov") (identity "video/quicktime"))
   ((string= ext "m4v") (identity "video/x-m4v"))
   ((string= ext "pdf") (identity "application/pdf"))
   (t (identity "not applyed"))))

但我想通过财产清单来解决它。我遇到了一个问题:如果密钥存储在变量中,我无法获取值。

(setq podcast-list '(mp4 "video/mp4" mp3 "audio/mpeg" pdf "application/pdf")) ;; key value
(setq ext (file-name-extension "~/podcast/podcast-item.mp4")) ---> "mp4"

(plist-get podcast-list ext) ----> nil
(plist-get podcast-list 'mp4) ----> "video/x-m4v"

如果键位于变量中,如何获取 plist 的值?或者有更优雅的方法来解决这个问题吗?我觉得解决方案就在表面上的某个地方,但我被困住了。

emacs plist backquote
1个回答
0
投票

那是因为你的键是

symbols
并且
ext
的值是
string
。它们是完全不同的类型,因此它们永远不会匹配。 您可以通过
intern
将字符串转换为符号:

(plist-get podcast-list (intern ext))
"video/mp4"
© www.soinside.com 2019 - 2024. All rights reserved.