Elisp - 将表达式作为文件中的数据加载

时间:2014-01-23 15:15:22

标签: emacs lisp elisp

我正在尝试编写一个函数,在给定文件路径的情况下,该函数将加载该文件的内容并将其附加到列表中。最终目标是为每个组织捕获模板提供一个文件,并从文件列表或组织表中加载它们。

我的问题是,如果加载成功,load和load-file函数只返回t。

我可以使用什么函数将文件的内容作为表达式返回?

例如,给定文件test.el:

'("foo" "bar" "baz" "fnord")

如何实现以下目标:

(mysterious-function "~/test.el")

=> '("foo" "bar" "baz" "fnord")

提前致谢

2 个答案:

答案 0 :(得分:3)

(defun mysterious-function (filename)
  (setq filename (expand-file-name filename))
  (with-temp-buffer
    (insert-file-contents filename)
    (read (current-buffer))))

答案 1 :(得分:2)

正如@barmar在评论中所建议的那样:

(defun read-from-file (file)
  (with-temp-buffer
    (insert-file-contents file)
    (read (current-buffer))))

请注意,由于您正在阅读而不进行评估,因此您无需将引号放入文件中。

如果由于某种原因,你已经在文件中有引号,你应该使用eval来摆脱它,因为这会引入一个安全漏洞(想象一个文件,包含表单(launch-missiles))。你应该这样做:

(defun my-unquote (form)
  (if (and (eq (first form) 'quote)
           (null (cddr form)))
      (second form)
      form))