Hi.
I saw something strange about SLIME and tried googling about it. But
couldn't find any clues.
Please allow me to post here.
I read "Let Over Lambda", a book about macros, and noticed function, named
with "!", on a file couldn't be recognized nor compiled through using SLIME.
The codes are listed below, using some utilities from the book "On Lisp",
written by Paul Graham.
;; *-SIMBOL-P-GENERATOR
> ;; (defmacro *-symbol-p-generator (str)
> ;; (let ((len (1+ (length str)))
> ;; (init-part (string-upcase str)))
> ;; `(defun ,(intern (concatenate 'string init-part "-SYMBOL-P")) (s)
> ;; (and (symbolp s)
> ;; (> (length (symbol-name s)) ,len)
> ;; (string= (symbol-name s)
> ;; ,init-part
> ;; :start1 0
> ;; :end1 ,len)))))
>
> ;; G-BANG-SYMBOL-PREDICATE
> ;; (*-symbol-p-generator "g!")
>
> (defun g!-symbol-p (s)
> (and (symbolp s)
> (> (length (symbol-name s)) 2)
> (string= (symbol-name s)
> "G!"
> :start1 0
> :end1 2)))
>
> ;; DEFMACRO-WITH-G-BANG!
> (defmacro defmacro/g! (name args &body body)
> (let ((syms (remove-duplicates
> (remove-if-not #'g!-symbol-p
> (flatten body)))))
> `(defmacro ,name ,args
> (let ,(mapcar
> (lambda (s)
> `(,s (gensym ,(subseq
> (symbol-name s)
> 2))))
> syms)
> ,@body))))
>
> ;; ONCE-ONLY
> (defmacro once-only ((&rest names) &body body)
> (let ((gensyms (loop for n in names collect (gensym))))
> `(let (,@(loop for g in gensyms collect `(,g (gensym))))
> `(let (,,@(loop for g in gensyms for n in names collect ``(,,g
> ,,n)))
> ,(let (,@(loop for n in names for g in gensyms collect `(,n ,g)))
> ,@body)))))
>
> ;; O-BANG-SYMBOLS
> ;; (*-symbol-p-generator "o!")
>
> (defun o!-symbol-p (s)
> (and (symbolp s)
> (> (length (symbol-name s)) 2)
> (string= (symbol-name s)
> "O!"
> :start1 0
> :end1 2)))
>
> (defun o!-symbol-to-g!-symbol (s)
> (symb "G!"
> (subseq (symbol-name s) 2)))
>
> ;; DEFMACRO-BANG
> (defmacro defmacro! (name args &body body)
> (let ((os (remove-if-not #'o!-symbol-p args)))
> (let ((gs (mapcar #'o!-symbol-to-g!-symbol os)))
> `(defmacro/g! ,name ,args
> `(let ,(mapcar #'list `(,,@gs) `(,,@os))
> ,(progn ,@body))))))
>
> ;; NIF
> (defmacro! nif (o!expr pos zero neg)
> `(cond ((plusp ,g!expr) ,pos)
> ((zerop ,g!expr) ,zero)
> (t ,neg)))
>
>
;;; This is the end of file
>
C-c C-k shows such a message below.
; in: DEFMACRO! NIF
> ; (DEFMACRO! NIF (O!EXPR POS ZERO NEG)
> ; `(COND ((PLUSP ,G!EXPR) ,POS) ((ZEROP ,G!EXPR) ,ZERO) (T
> ,NEG)))
> ;
> ; caught ERROR:
> ; (during macroexpansion of (DEFMACRO! NIF ...))
> ; The function O!-SYMBOL-P is undefined.
> ;
> ; compilation unit finished
> ; caught 1 ERROR condition
>
> ; /home/cametan/lol.chapter_2.fasl written
> ; compilation finished in 0:00:00.091
>
Strange. The function O!-SYMBOL-P was THERE on the file.
So I check sbcl repl directly on my bash; in that case, the file could be
loaded and compiled without any problem.
Therefore, SLIME must have the problem.
Actually, if I made the function on REPL on SLIME, NO PROBLEM. The problem
is occured when I made a file, load, and compile THE FILE.
I checked the file, then I found both g!-symbol-p and o!-symbol-to-g!-symbol
are not recognized by SLIME, either. Then, I concluded functions with "!"
are not recognized by SLIME.
Is there any solution about that? I use Ubuntu 9.10, SBCL and Emacs 23
provided by Ubuntu. Also I use cvs version of SLIME(newest).
Here are my lines about SLIME on my .emacs
;;=======================================================================
> ;; SLIME
> ;;=======================================================================
> (setq inferior-lisp-program "/usr/bin/sbcl")
> (add-to-load-path-recompile
> (expand-file-name "~/slime"))
> (add-hook 'lisp-mode-hook (lambda ()
> (inferior-slime-mode t)
> (global-set-key "\C-cH" 'hyperspec-lookup)
> (push 'ac-source-slime ac-sources)
> (auto-complete-mode)))
>
> (require 'slime)
>
> (eval-after-load "slime"
> '(progn
> (message "Slime configuration...")
> (slime-setup '(slime-scratch
> slime-editing-commands
> slime-fancy
> slime-repl
> slime-asdf
> anything-slime)))
> )
> ;;
>
(setq slime-net-coding-system 'utf-8-unix
> ;; inferior-lisp-program "/usr/bin/sbcl"
> lisp-indent-function 'common-lisp-indent-function
> slime-complete-symbol*-fancy t
> slime-complete-symbol-function 'slime-fuzzy-complete-symbol
> slime-startup-animation t)
>
> (slime-autodoc-mode)
> ;;
>
Thanks
cametan
P.S. I also found SLIME's REPL don't recognized reader macros. Though making
reader macro with #foo, SLIME says something like "incomplete input".
P.S.2. The author of LOL says he hates Emacs. Then, if he spelled and cursed
SLIME, I would give all up.