ccl 指定HOME目录问题

闲庭风 发布于 2013/07/22 13:03
阅读 636
收藏 0

@FreeBlues 你好,关注你的博客有段时间了,记得那是去年去公司总部开年会在车站偶然发现你的博客的.感觉写的很好.

最近使用ccl和sbcl有个问题想请教下:
在windows下ccl默认的home目录是环境变量userprofile指定的,而sbcl的默认home目录是环境变量home指定的.对于sbcl修改环境变量没问题,但对ccl修改后总是报错:

我在网上找了一圈,没有具体的思路,请不吝指教!!

以下是问题补充:

@闲庭风:我想标题可能写的有问题,不应该是ccl的home目录,而是windows用户的home目录. 希望各位lisper们不吝赐教,大家共同学习! (2013/07/22 16:58)
加载中
0
FreeBlues
FreeBlues

很高兴遇到学习 Lisp 的同道!

说说我的理解, 不一定完全正确, 仅供参考:

在 CCL 中, 它需要使用环境变量 CCL_DEFAULT_DIRECTORY 的值来确定 CCL 目录下的所有文件(如映像文件,库文件等等)的位置, 这个位置就是 CCL 的 home 目录, 所以一般来说, 这个位置不推荐修改, 因为你一修改它就找不到对应的文件了--尤其当你安装了 CCL 的多个不同版本时. 

CCL 会通过各种办法自动把 Lisp 文件的安装目录设置为 CCL_DEFAULT_DIRECTORY (比如在 Lispbox 中会使用  lispbox.bat 脚本里的变量 %LISPBOX_HOME% 获取当前 Lispbox 的文件目录, 然后在把该变量绑定给环境变量 CCL_DEFAULT_DIRECTORY )

当然了, 理论上可以这么修改: 

(setenv "CCL_DEFAULT_DIRECTORY" "~/test-directory/") 

把这条语句加入 .emacs 脚本中, 重启一下 emacs , 在我的环境下发现此时执行 (probe-file "ccl:") 返回了 Nil , 正常应该返回对应的 ccl 目录, 如果你后续的程序用到 "ccl:" (pathname 中的 逻辑主机) 都会报错.


0
闲庭风
闲庭风

引用来自“FreeBlues”的答案

很高兴遇到学习 Lisp 的同道!

说说我的理解, 不一定完全正确, 仅供参考:

在 CCL 中, 它需要使用环境变量 CCL_DEFAULT_DIRECTORY 的值来确定 CCL 目录下的所有文件(如映像文件,库文件等等)的位置, 这个位置就是 CCL 的 home 目录, 所以一般来说, 这个位置不推荐修改, 因为你一修改它就找不到对应的文件了--尤其当你安装了 CCL 的多个不同版本时. 

CCL 会通过各种办法自动把 Lisp 文件的安装目录设置为 CCL_DEFAULT_DIRECTORY (比如在 Lispbox 中会使用  lispbox.bat 脚本里的变量 %LISPBOX_HOME% 获取当前 Lispbox 的文件目录, 然后在把该变量绑定给环境变量 CCL_DEFAULT_DIRECTORY )

当然了, 理论上可以这么修改: 

(setenv "CCL_DEFAULT_DIRECTORY" "~/test-directory/") 

把这条语句加入 .emacs 脚本中, 重启一下 emacs , 在我的环境下发现此时执行 (probe-file "ccl:") 返回了 Nil , 正常应该返回对应的 ccl 目录, 如果你后续的程序用到 "ccl:" (pathname 中的 逻辑主机) 都会报错.


谢谢您的回复,我想可能是我没有表达清楚.

其实我现在是在集成emacs和lisp(没有使用lispbox).在.emacs配置文件中加入common lisp配置后我又安装了quicklisp,在windows下quicklisp默认安装到用户目录(linux是/home/xxx/,windows是C:\Documents and Settings\XXX),我暂时用的是win系统.这样在家里和办公很不方便,我想把quicklisp放到emacs目录(或自定义的其他目录)就方便了,可以使用svn或git同步.

我的做法是用bat启动emacs如下:

@echo off
set HOME=c:/common-tools/emacs-23.4
set SBCL_HOME=c:/common-tools/lisp/sbcl
set CCL_DEFAULT_DIRECTORY=c:/common-tools/lisp/ccl
rem ccl默认采用USERPROFILE做为用户HOME目录,在此设置环境变量改变CCL的HOME目录,以便和sbcl一起使用quicklisp.
rem set USERPROFILE=c:/common-tools/emacs-23.4
set EMACS_SERVER_FILE=%HOME%/.emacs.d/server/server
set PATH=%PATH%;%HOME%/bin;%SBCL_HOME%;%CCL_DEFAULT_DIRECTORY%

rem runemacs --debug-init
RunHiddenConsole.exe "c:\common-tools\emacs-23.4\bin\emacsclientw.exe" --alternate-editor="c:\common-tools\emacs-23.4\bin\runemacs.exe" "%1"

我在这里指定了sbcl和ccl的目录,同时也指定了HOME目录,现在启动sbcl加载quicklisp一切正常,但ccl确出现上述错误.不管我是在bat中设置USERPROFILE的值还是在emacs启动文件中设置(setenv "USERPROFILE" (getenv "HOME"))都不行.启动后打印(user-homedir-pathname)输出的是我们后来指定的目录而不是windows默认的C:\Documents and Settings\XXX.

所以现在比较纠结,加载不了ccl的初始文件,虽然可以通过其他方法实现启动加载quicklisp,但总觉得不爽.

0
FreeBlues
FreeBlues

引用来自“无很”的答案

引用来自“FreeBlues”的答案

很高兴遇到学习 Lisp 的同道!

说说我的理解, 不一定完全正确, 仅供参考:

在 CCL 中, 它需要使用环境变量 CCL_DEFAULT_DIRECTORY 的值来确定 CCL 目录下的所有文件(如映像文件,库文件等等)的位置, 这个位置就是 CCL 的 home 目录, 所以一般来说, 这个位置不推荐修改, 因为你一修改它就找不到对应的文件了--尤其当你安装了 CCL 的多个不同版本时. 

CCL 会通过各种办法自动把 Lisp 文件的安装目录设置为 CCL_DEFAULT_DIRECTORY (比如在 Lispbox 中会使用  lispbox.bat 脚本里的变量 %LISPBOX_HOME% 获取当前 Lispbox 的文件目录, 然后在把该变量绑定给环境变量 CCL_DEFAULT_DIRECTORY )

当然了, 理论上可以这么修改: 

(setenv "CCL_DEFAULT_DIRECTORY" "~/test-directory/") 

把这条语句加入 .emacs 脚本中, 重启一下 emacs , 在我的环境下发现此时执行 (probe-file "ccl:") 返回了 Nil , 正常应该返回对应的 ccl 目录, 如果你后续的程序用到 "ccl:" (pathname 中的 逻辑主机) 都会报错.


谢谢您的回复,我想可能是我没有表达清楚.

其实我现在是在集成emacs和lisp(没有使用lispbox).在.emacs配置文件中加入common lisp配置后我又安装了quicklisp,在windows下quicklisp默认安装到用户目录(linux是/home/xxx/,windows是C:\Documents and Settings\XXX),我暂时用的是win系统.这样在家里和办公很不方便,我想把quicklisp放到emacs目录(或自定义的其他目录)就方便了,可以使用svn或git同步.

我的做法是用bat启动emacs如下:

@echo off
set HOME=c:/common-tools/emacs-23.4
set SBCL_HOME=c:/common-tools/lisp/sbcl
set CCL_DEFAULT_DIRECTORY=c:/common-tools/lisp/ccl
rem ccl默认采用USERPROFILE做为用户HOME目录,在此设置环境变量改变CCL的HOME目录,以便和sbcl一起使用quicklisp.
rem set USERPROFILE=c:/common-tools/emacs-23.4
set EMACS_SERVER_FILE=%HOME%/.emacs.d/server/server
set PATH=%PATH%;%HOME%/bin;%SBCL_HOME%;%CCL_DEFAULT_DIRECTORY%

rem runemacs --debug-init
RunHiddenConsole.exe "c:\common-tools\emacs-23.4\bin\emacsclientw.exe" --alternate-editor="c:\common-tools\emacs-23.4\bin\runemacs.exe" "%1"

我在这里指定了sbcl和ccl的目录,同时也指定了HOME目录,现在启动sbcl加载quicklisp一切正常,但ccl确出现上述错误.不管我是在bat中设置USERPROFILE的值还是在emacs启动文件中设置(setenv "USERPROFILE" (getenv "HOME"))都不行.启动后打印(user-homedir-pathname)输出的是我们后来指定的目录而不是windows默认的C:\Documents and Settings\XXX.

所以现在比较纠结,加载不了ccl的初始文件,虽然可以通过其他方法实现启动加载quicklisp,但总觉得不爽.

我试验了一下, 可能是这个原因: 你需要分别在 sbcl 和 ccl 中执行一遍 (ql:add-to-init-file) 

这条语句会在 sbcl 和 ccl 各自的初始化文件中加入下述语句:

;;; The following lines added by ql:add-to-init-file:
  #-quicklisp
  (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                         (user-homedir-pathname))))
    (when (probe-file quicklisp-init)
      (load quicklisp-init)))
sbcl 的初始化文件是 #P"/Users/admin/.sbclrc" 

ccl 的初始化文件是 #P"/Users/admin/\\.ccl-init.lisp"

windows 环境下好像是同样的文件名.

不需要自己在批处理里面单独设置.

刚才的试验结果, 发现只在 ccl 执行, 没在 sbcl 执行, 结果就是 sbcl 不识别 (ql:quickload )

我估计你可能只在 sbcl 中执行过 (ql:add-to-init-file) , 你再到 ccl 的 REPL 下执行一次看看结果如何.

闲庭风
闲庭风
谢谢!明天试试!好梦~~~
0
FreeBlues
FreeBlues

补充一下, 如果想换一个目录安装, 在安装 quicklisp 时自己指定一个安装目录就可以了

(quicklisp-quickstart :install :path "这里是准备安装的目录")

quicklisp 升级到最新版本,执行下面这条语句

(ql:update-client)

0
闲庭风
闲庭风

引用来自“FreeBlues”的答案

补充一下, 如果想换一个目录安装, 在安装 quicklisp 时自己指定一个安装目录就可以了

(quicklisp-quickstart :install :path "这里是准备安装的目录")

quicklisp 升级到最新版本,执行下面这条语句

(ql:update-client)

谢谢您不厌其烦的回答,经过您的指点和我一大圈的google之后终于发现了问题:
    我第一次用的是sbcl下载ql,之后手动添加了.ccl-init.lisp文件,并在其中加入了(format t (user-homedir-pathname))想看看ccl的user himedir,结果悲剧发生了,卧操,语法错误,这么低级的错误让我找了两天,改为(format t "~A" (user-homedir-pathname))或(princ "Clozure CL init file dir is ")  (prin1 (user-homedir-pathname))即可.

再次感谢您的解答.

0
FreeBlues
FreeBlues

不必客气, 问题搞定就好, 我也顺便了解了 quicklisp 的安装过程 

返回顶部
顶部