困境:可读性还是可维护性?
我们来看看下面的函数。它的作用并不重要,重要的是它使用了两倍的字符串"(let\\*?[ \t]*"
:
(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]*"
?这是一项可行的工作,因为:
可以像这样对标识符进行字体锁定:http ://www.emacswiki.org/emacs/PrettyLambda ,甚至可以这样:rainbow-mode。
并且可以对常量进行字体锁定。据我所知,它已经为 c++-mode 完成了,但还没有为 emacs-lisp-mode 完成。
然后它只剩下将两者连接起来。不幸的是,我没有足够的font-lock
内脏来做这件事,但也许其他人会做?还是已经有一个包可以做到这一点?