LispBox 集成开发环境分析 (一)Windows版本分析

巧了我就是萌 提交于 2019-12-01 10:21:11

LispBox 集成开发环境分析 (一)Windows版本分析

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/

使用方法很简单,只要把对应的版本下载回去,然后直接执行对应的程序即可启动整个LISP 开发环境了,比如:
1、在WINDOWS下执行 lispbox.bat  
2、在LINUX下执行 lispbox.sh 
3、在MAC环境下执行 Emacs

对于新手来说不需要进行任何配置工作,非常方便,所以虽然 LispBox 已经停止更新,但是对于Lisp初学者我还是推荐使用LispBox。

本文是一个学习记录,为了避免学了后面的忘记前面的,所以把学习过程中每个阶段理解的内容都用书面的形式做一个总结,以便温故而知新。

首先从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 的集成开发环境时执行的文件,它是一个批处理文件,先看看它的内容:

@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

也就是说打开屏幕回显,然后开启一个命令行窗口,执行一下 lispbox.bat ,显示结果如下:


这下就清楚了,首先是判断操作系统是否为WINDOWS,然后设置当前LISPBOX所在目录 LISPBOX_HOME 的值,最后执行了emacs目录下的 runemacs.exe 文件,执行参数有3个:
1、 --no-init-file 表示不加载 emacs 的初始化文件(~\.emacs)
2、 --no-site-file 表示不加载 emacs 的全站点配置文件(emacs 一般使用这些文件作为默认的全站点初始化文件 site-load.el  site-init.el site-start.el)
3、 --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 文件了
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!