From: Thien-Thi N. <tt...@gn...> - 2007-10-19 07:30:52
|
() "Davis Herring" <he...@la...> () Thu, 11 Oct 2007 10:41:11 -0700 (PDT) Are we sure that it's okay to do all these evaluations at macro expansion time -- that is, do any of them depend on runtime things? the original defcustom-c-stylevar evals so i thought continuing the practice (regardless of the wisdom of the approach) would not be harmful. in fact, in the most recent revision (tested a bit, this time -- bonus!), VAL is no longer evalled. And what is (eval (list 'identity foo))) supposed to do differently than (eval foo)? nothing, thanks for pointing this out -- i learn a lot from nothing these days! i use the latter form now. the former was fuzzy thinking and baby-in-the-background-crying induced. please find below the revised defcustom-c-stylevar usurper. substantial changes from the previous revision: - docstring, reflecting best how i understand things - new form `(declare (debug ...))' - form `(radio ...)' is quoted i consider all these changes bugfixes (and, thus, potentially bug-harboring). please scrutinize them equally. as mentioned before, this was (lightly) tested. i even went so far as to invoke customize (shudder) and mouse around a bit. now if you'll excuse me, i have to go wash my hands... :-/ [cc trimmed to ml] thi _____________________________________________________________ (defmacro defcustom-c-stylevar (name val doc &rest args) "Define a style variable NAME with VAL and DOC. More precisely, convert the given `:type FOO', mined out of ARGS, to an aggregate `:type (radio STYLE (PREAMBLE FOO))', append some some boilerplate documentation to DOC, arrange for the fallback value of NAME to be VAL, and call `custom-declare-variable' to do the rest of the work. STYLE stands for the choice where the value is taken from some style setting. PREAMBLE is optionally prepended to FOO; that is, if FOO contains :tag or :value, the respective two-element list component is ignored." (declare (debug (symbolp form stringp &rest))) (let* ((expanded-doc (concat doc " This is a style variable. Apart from the valid values described above, it can be set to the symbol `set-from-style'. In that case, it takes its value from the style system (see `c-default-style' and `c-style-alist') when a CC Mode buffer is initialized. Otherwise, the value set here overrides the style system (there is a variable `c-old-style-variable-behavior' that changes this, though).")) (typ (eval (plist-get args :type))) (type (if (consp typ) typ (list typ))) (head (car type)) (tail (cdr type)) (newt (append (unless (plist-get tail :tag) '(:tag "Override style settings")) (unless (plist-get tail :value) `(:value ,val)) tail)) (aggregate `'(radio (const :tag "Use style settings" set-from-style) ,(cons head newt)))) `(progn (c-set-stylevar-fallback ',name ,val) (custom-declare-variable ',name ''set-from-style ,expanded-doc ,@(plist-put args :type aggregate))))) |