困境:可讀性還是可維護性?
讓我們看看下面的函數。 它並不真正的問題是什麼呢,最重要的是, 它使用兩倍的字符串"(let\\*?[ \t]*"
:Emacs是否可以實現elisp字符串常量?
(defun setq-expression-or-sexp()
"Return the smallest list that contains point.
If inside VARLIST part of `let' form,
return the corresponding `setq' expression."
(interactive)
(ignore-errors
(save-excursion
(up-list)
(let ((sexp (preceding-sexp)))
(backward-list 1)
(cond
((looking-back "(let\\*?[ \t]*")
(cons 'setq
(if (= (length sexp) 1)
(car sexp)
(cl-mapcan
(lambda (x) (unless (listp x) (list x nil)))
sexp))))
((progn
(up-list)
(backward-list 1)
(looking-back "(let\\*?[ \t]*"))
(cons 'setq sexp))
(t
sexp))))))
,因爲它具有兩個(或更多)的位置來更新串頭痛, 我倒是有defconst
它像這樣:
(defconst regex-let-form "(let\\*?[ \t]*")
雖然代碼變得更容易維護,它變得不那麼可讀性爲好, 因爲它很難一眼看到什麼regex-let-form
真的是:
(defun setq-expression-or-sexp()
"Return the smallest list that contains point.
If inside VARLIST part of `let' form,
return the corresponding `setq' expression."
(interactive)
(ignore-errors
(save-excursion
(up-list)
(let ((sexp (preceding-sexp)))
(backward-list 1)
(cond
((looking-back regex-let-form)
(cons 'setq
(if (= (length sexp) 1)
(car sexp)
(cl-mapcan
(lambda (x) (unless (listp x) (list x nil)))
sexp))))
((progn
(up-list)
(backward-list 1)
(looking-back regex-let-form))
(cons 'setq sexp))
(t
sexp))))))
這個想法:爲什麼不是兩個?
因爲它是一個常數,爲什麼不是font-lock
它 和使regex-let-form
看起來好像是"(let\\*?[ \t]*"
? 這是一個feasable工作,因爲:
這是可能的字體鎖標識符,像這樣:http://www.emacswiki.org/emacs/PrettyLambda, 或即便如此:rainbow-mode。
而且可以對字體鎖定常量。據我所知,它已經完成了C++模式, ,但尚未用於emacs-lisp模式。
然後,它仍然只是連接兩個。不幸的是,我不知道 足夠的font-lock
內臟做到這一點,但也許別人呢? 或者是否已經有一個包?
我試過了,它給了我一個奇怪的unicode字符而不是正則表達式。 –
這可能是一個版本問題。我正在使用v24.2。 – gbrener
我有v24.3.1。 –