2012年2月22日水曜日

Common Lispでのnamed-let


Common Lispにはnamed-letが無い.
そこでマクロの勉強がてらnamed-letを実装
(Schemeみたいにletって名前で統一はできませんでした…)

(defmacro named-let (name bind body)
  `(labels ((,name ,(mapcar #'car bind) ,body))
     (,name ,@(mapcar #'cadr bind))

     ))

アホみたいにバッククオートとアンクオートだけで挑戦してたので時間を無駄に書けてしまった.
「,@」….ちゃんとググれってことね…

Emacsでソースコードの折りたたみ


hs-minor-mode.elってのがデフォルトで含まれてるらしく,こいつを使えば簡単にソースコードを畳めるようになる.畳む範囲を柔軟に決めれる訳ではないが,ソースコードにタグを打つ必要が無いし,結局これが楽だと思う.

.emacsは以下の通りです.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; For folding
;;;

;; C coding style
(add-hook 'c-mode-hook
          '(lambda ()
    (hs-minor-mode 1)))
;; Scheme coding style
(add-hook 'scheme-mode-hook
          '(lambda ()
    (hs-minor-mode 1)))
;; Elisp coding style
(add-hook 'emacs-lisp-mode-hook
          '(lambda ()
    (hs-minor-mode 1)))
;; Lisp coding style
(add-hook 'lisp-mode-hook
          '(lambda ()
    (hs-minor-mode 1)))
;; Python coding style
(add-hook 'python-mode-hook
          '(lambda ()
    (hs-minor-mode 1)))

(define-key
  global-map
  (kbd "C-#") 'hs-toggle-hiding)

SBCL + Emacs(Meadow) + SLIME



Common Lispの設定でどハマりしたのでメモ


  1. SBCLのインストール.これについては何も迷う事はない. http://www.sbcl.org/platform-table.htmlからWindows用バイナリを取ってきてC:\SBCL\にインストール(SBCLのWindows版にある不具合については,とりあえず気にしない)
  2. Meadowのインストール.上に同じく迷うポイントは無いはず. http://www.meadowy.org/meadow/wiki/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89 から現行のsetup-ja.exeをとってきてC:\Meadow\にインストール
  3. SLIMEのインストール.これがどハマりポイント.2012/2/21現在のSLIMEにはバグがある模様.ロードバスが通ってるディレクトリ(例えば,~/.emacs.d/)の中でcvs -d :pserver:anonymous:anonymous@common-lisp.net:/project/slime/cvsroot co -D 2009-10-12 slimeを実行して古いヤツをもってくるのが楽.
  4. auto-complete.elとac-slime.elのインストール.これはWebを探して適当に持ってきたら良い.
  5. .emacsには以下を追加


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; For Lisp (SBCL)
;;;

(setq inferior-lisp-program "C:/SBCL/sbcl.exe")
(add-to-list 'load-path "C:/cygwin/home/"username"/.emacs.d/slime")
(require 'slime)
(slime-setup)
(slime-setup '(slime-autodoc))
(slime-setup '(slime-repl))
(setq slime-net-coding-system 'utf-8-unix)
(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))
(add-hook 'lisp-mode-hook (lambda ()
                            (slime-mode t)
                            (show-paren-mode)))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; For auto-complete
;;;
(add-to-list 'load-path "~/.emacs.d/")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d//ac-dict")
(ac-config-default)

;; for slime
(require 'ac-slime)
(add-hook 'slime-mode-hook 'set-up-slime-ac)
(add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
(define-globalized-minor-mode real-global-auto-complete-mode
  auto-complete-mode (lambda ()
         (if (not (minibufferp (current-buffer)))
      (auto-complete-mode 1))))
(real-global-auto-complete-mode t)




こうやって書いてみると何てこと無いね.
これのために数時間無駄にしたと思うとダルくなるわ…