LispBox 集成開發環境分析 (一)Windows版本分析 html
LispBox 是一個開源的LISP 集成開發環境,由 SLIME (The Superior Lisp Interaction Mode for Emacs) 交互接口、 Quicklisp 庫管理器、Clozure Common Lisp 編譯器和 Emacs 編輯器組成,有WINDOWS、LINUX和MAC OSX三種版本,目前已經中止更新,下載地址爲:
http://www.common-lisp.net/project/lispbox/ shell
使用方法很簡單,只要把對應的版本下載回去,而後直接執行對應的程序便可啓動整個LISP 開發環境了,好比:
一、在WINDOWS下執行 lispbox.bat
二、在LINUX下執行 lispbox.sh
三、在MAC環境下執行 Emacs
對於新手來講不須要進行任何配置工做,很是方便,因此雖然 LispBox 已經中止更新,可是對於Lisp初學者我仍是推薦使用LispBox。 windows
本文是一個學習記錄,爲了不學了後面的忘記前面的,因此把學習過程當中每一個階段理解的內容都用書面的形式作一個總結,以便溫故而知新。 app
首先從LISPBOX的目錄結構開始: 編輯器
解壓後的Lispbox 目錄名爲 "\lispbox-0.7-ccl-1.6-windowsx86\lispbox-0.7\" ,裏面有4個目錄,以下:
"\ccl-1.6-windowsx86"
"\emacs-23.2"
"\Quicklisp"
"\slime-20110205.092829"
有3個文件,分別爲:
asdf.lisp
asdf-extensions.lisp
lispbox.bat
前兩個文件稍微有些複雜暫時不討論,第三個文件 lispbox.bat 就是咱們要啓動 lispbox 的集成開發環境時執行的文件,它是一個批處理文件,先看看它的內容: ide
@echo off rem Thanks to Venkat who provided this bit of COMMAND wizardry. if NOT %OS%==Windows_NT goto checkhome for %%i in ( "%CD%" ) do set LISPBOX_HOME=%%~si% goto start :checkhome rem rem if the environment variable is not defined, dereferencing rem it produces the same string! rem if %LISPBOX_HOME%==%LISPBOX_HOME% goto noenv :start set EMACS=%LISPBOX_HOME%/emacs-23.2/bin/runemacs.exe set TO_EVAL="(progn (load \"lispbox\") (slime))" %EMACS% --no-init-file --no-site-file --eval=%TO_EVAL% goto end :noenv echo LISPBOX_HOME environment variable should be set and echo point to the installation directory of LISPBOX before echo launching this command. :end
@echo on
這下就清楚了,首先是判斷操做系統是否爲WINDOWS,而後設置當前LISPBOX所在目錄 LISPBOX_HOME 的值,最後執行了emacs目錄下的 runemacs.exe 文件,執行參數有3個:
一、 --no-init-file 表示不加載 emacs 的初始化文件(~\.emacs)
二、 --no-site-file 表示不加載 emacs 的全站點配置文件(emacs 通常使用這些文件做爲默認的全站點初始化文件 site-load.el site-init.el site-start.el)
三、 --eval="(progn (load \"lispbox\") (slime))" EVAL是lisp裏的一個求值函數,該語句表示由 emacs 順序執行以下兩條命令: (load "lispbox") ,(slime) ,第一條命令表示首先要加載 lispbox (也就是emacs-23.2/site-lisp/目錄下的 lispbox.el 文件,因此你也能夠把這條命令改寫爲 (load \"lispbox.el\") ,效果是同樣的),而後再執行 slime ,咱們能夠看一下 lispbox.el 文件有哪些內容,以下: 函數
;; lispbox.el (require 'cl) (defun lispbox-list-to-filename (list) (apply #'concat (maplist #'(lambda (cons) (if (cdr cons) (file-name-as-directory (car cons)) (car cons))) list))) (defun lispbox-file (rest) (concat (file-name-as-directory (expand-file-name (or (getenv "LISPBOX_HOME") (file-name-directory load-file-name)))) rest)) (defun lispbox-find-lisps () (dolist (file (file-expand-wildcards (lispbox-file "*/lispbox-register.el"))) (load file))) (defun lispbox-install-lisp-license (license-path lisp-name) (let ((license (concat (file-name-directory load-file-name) (lispbox-list-to-filename license-path)))) (if (not (file-exists-p license)) (let* ((prompt (format "Need to install license for %s . Please enter name of file where you saved it: " lisp-name)) (to-install (read-file-name prompt))) (copy-file (expand-file-name to-install) license))))) (global-font-lock-mode t) (setq load-path (cons (lispbox-file "slime-20110205.092829") load-path)) (setenv "SBCL_HOME" (lispbox-file "sbcl-1.0.42/lib/sbcl")) (setenv "CCL_DEFAULT_DIRECTORY" (lispbox-file "ccl-1.6-windowsx86")) ;(require :aserve) (require 'slime) (setq locale-coding-system 'utf-8) (set-terminal-coding-system 'utf-8) (set-keyboard-coding-system 'utf-8) (set-selection-coding-system 'utf-8) (set-default-coding-systems 'utf-8) (prefer-coding-system 'utf-8) (setq slime-net-coding-system 'utf-8-unix) (slime-setup '(slime-fancy slime-asdf slime-banner)) (lispbox-find-lisps) (provide 'lispbox)
關鍵是這幾句: 學習
(setq load-path (cons (lispbox-file "slime-20110205.092829") load-path)) (setenv "SBCL_HOME" (lispbox-file "sbcl-1.0.42/lib/sbcl")) (setenv "CCL_DEFAULT_DIRECTORY" (lispbox-file "ccl-1.6-windowsx86"))第一句指定了 slime 的目錄,這樣執行 slime 時EMACS就可以自動到 slime 的安裝目錄下找到 slime.el 文件了