ファイルを開いてsexpを読み込もうとしています。フォームの最初の位置に setq がある場合は、フォームの残りをトラバースし、setq フォームの を連想リストに追加します。
;;; File passwords.el.gpg
(setq twitter-password "Secret"
github-password "Sauce")
私の目標は、ファイル内の setq フォームのペアから連想リストを作成できるようにすることです。どうやって始めるの?
まず、パスワードを実際の連想リストに保存し、必要に応じてそれに基づいて必要な変数を設定することをお勧めします。
それはさておき、これは物事を少し打破しようとする別の解決策です。この-partition
関数は、dash.elライブラリからのもので、強くお勧めします。
コードを「ウォーク」する必要はありません。コードを入力して、read
それcar
がsetq
. フォームの残りの部分は、シンボルと文字列を交互にする必要があるため、それらを 2 で分割するだけで、連想リストが得られます。(「ペア」は、ショーンのソリューションの点線のペアとは対照的に、適切なリストになることに注意してください)。
(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*)