リストにあるすべてのテーマに対してインタラクティブな関数を動的に作成できるように、emacs構成を最適化する作業をしています。
以下は、私が機能させようとしている構成の簡略版です。
;; List containing names of functions that I want to create
(setq my/defun-list '(zz-abc
zz-def
zz-ghi))
;; Elisp macro to create an interactive defun whose name
;; is passed as the macro argument
(defmacro my/create-defun (defun-name)
`(defun ,defun-name ()
(interactive)
(let ((fn-name (symbol-name ',defun-name)))
(message "Testing creation of function %s" fn-name))))
;; Loop to call the above macro for each element in the list
;; DOES *NOT* WORK
(dolist (name my/defun-list)
(my/create-defun name))
しかし、ループを手動で展開すると、機能します。
;; WORKS
(my/create-defun zz-abc)
(my/create-defun zz-def)
(my/create-defun zz-ghi)
しかし、以下はシンボル名を渡す場所では機能しません(これはおそらく、ループが単独でアンロールするときに起こっていることです)。マクロ引数の前の引用符に注意してください。
;; DOES *NOT* WORK
(my/create-defun 'zz-abc)
(my/create-defun 'zz-def)
(my/create-defun 'zz-ghi)
更新
@wvxvwの助けのおかげで、私はようやくこれを機能させることができました!
@wvxvwが示唆するように、私はあらゆるユースケースのdefunをバッチ生成することはしません。これは名前のテーマのための特別なユースケースだったXYZ
、私はと呼ばれる関数定義を生成したいload-theme/XYZ
の仕事をしていません
- アクティブになる可能性のある他のすべてのテーマを無効にする
- 呼び出し
load-theme
のためにXYZ
- そのテーマに関連するいくつかのカスタム設定を行います。各テーマのカスタム設定を
my/themes
リストから渡します。
cons
es のみで構成されていますが、各テーマのカスタムプロパティを含むリストに変換する予定です。
(my/create-defun name)
3回呼び出したので、3回という関数を定義する必要がありますname
。
defuns
をprogn
。progn
トップレベルのフォームであることが許可されます(トップレベルのフォームに適用されるすべてがその内容にprogn
も適用されるという意味で)。しかし、私はそのような方法で関数を作成する理論的根拠に疑問を投げかけます:値としてラムダを持つhas-tableを持たないのはなぜですか?