繁体   English   中英

我如何编码elisp中的代码?

[英]How do I code walk in elisp?

我正在尝试打开文件并阅读sexps。 如果表单的setq位于其第一个位置,则遍历表单的其余部分,将setq表单添加到alist中。

;;; File passwords.el.gpg
(setq twitter-password "Secret"
      github-password "Sauce")

我的目标是能够在teh文件中的setq表单中构建一对alist。 我怎么开始?

您可以使用流来读取文件(从字符串读取),然后执行通常的elisp黑客攻击。 以下不是很强大,但你明白了。 在包含文件的文件pwd.el上,它返回alist((github-password。“Sauce”)(twitter-password。“Secret”))

(defun readit (file)
  "Read file.  If it has the form (sexp [VAR VALUE]+), return
an alist of the form ((VAR . VALUE) ...)"
  (let* (alist
         (sexp-len
          (with-temp-buffer 
            (insert-file-contents file)
            (read-from-string (buffer-substring 1 (buffer-size)))))
         (sexp (car sexp-len)))
    (when (equal (car sexp) 'setq)
      (setq sexp (cdr sexp))
      (while sexp
        (let* ((l (car sexp))
               (r (cadr sexp)))
          (setq alist (cons (cons l r) alist)
                sexp (cddr sexp)))))
    alist))

(readit "pwd.el")

首先,我建议您将密码存储在实际的alist中,并在必要时根据需要设置所需的变量。

除此之外,这是另一个尝试解决问题的解决方案。 -partition函数来自dash.el库,我强烈推荐。

你真的不需要“走”代码,只需read它并检查它的car是否是setq 然后,表单的其余部分应该是交替的符号和字符串,因此您只需将它们分区为2,然后就可以使用alist。 (请注意,“对”将是正确的列表,而不是Sean解决方案中的虚线对)。

(defun setq-form-p (form)
  (eq (car form) 'setq))

(defun read-file (filename)
  (with-temp-buffer
    (insert-file-literally filename)
    (read (buffer-substring-no-properties 1 (point-max)))))

(defun credential-pairs (form)
  (-partition 2 (cdr form)))

(defun read-credentials-alist (filename)
  (let ((form (read-file filename)))
    (credential-pairs form)))

;; usage:
(read-credentials-alist "passwords.el")

或者,如果你已经在一个alist中使用了密码,那么这就是它的工作原理

(defvar *passwords*
  '((twitter-password "Secret")
    (github-password "Sauce")))

然后想将变量twitter-password"Sauce" ,依此类推。 你只需映射它:

(mapcar #'(lambda (pair)
            (let ((name (car pair))
                  (value (cadr pair)))
              (set name value)))
        *passwords*)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM