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.