Hi,
I managed to put together an Emacs Lisp function to automatically
declare all defined symbols in a Clojure source file. The algorithm is
crude: it doesn't understand syntax, it just parses lines beginning
with either "(def " or "(defn ". A single line beginning with
"(declare " macro must already be present.
I wasn't able to match syntax of Clojure symbols inside the regex - it
should have been "(syntax symbol)", shouldn't it? - therefore I
resorted to:
(any "-" "a-z" "A-Z" "0-9")
which is incomplete.
You could hook the function to file saving or something like that. It
works for me.
Cheers
(require 'cl)
(require 'rx)
;; WARNING: IMPLEMENTED BY A NEWBIE. NO WARRANTIES!
(defun clj-auto-declare ()
(interactive "*") ;; Buffer contents are going to change.
(save-excursion
(save-restriction
(save-match-data
;; Scan buffer for defined symbols.
(widen)
(goto-char (point-min))
(let ((defined-symbols '()))
(while (re-search-forward (rx
line-start "(" (or "def" "defn")
(one-or-more space)
(group (one-or-more (any "-" "a-z" "A-Z" "0-9"
nil t)
(push (match-string 1)
defined-symbols))
;; Handle found symbols.
(if defined-symbols
;; Scan buffer for 'declare'
and update it.
(progn (goto-char (point-min))
(unless
(re-search-forward (rx line-start "(declare"
(group (zero-or-more (or space (any
"-" "a-z" "A-Z"
"0-9"
")")
nil t)
(error
"Global 'declare' not found. Have you entered it as
a single line?"))
(let
((uptodate-declare (concat "(declare " (mapconcat
'identity defined-symbols " ") ")")))
(replace-match uptodate-declare)
(message
"Declarations have been updated.")))
(message "Nothing to declare,
sir.")))
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---