暂时失败的尝试:替换CCL中系统函数的定义
现在我的开发环境可以支持中文,但是有些函数,比如 load 函数,每次调用时总要特别指出它的文件格式是 utf-8 ,需要在调用中增加这么一条额外的参数 :external-format :utf-8
仅仅因为在 load 函数定义文件中文件格式参数使用了缺省形式:
(defun load (file-name &key (verbose *load-verbose*)
(print *load-print*)
(if-does-not-exist :error)
(external-format :default))
"Load the file given by FILESPEC into the Lisp environment, returning
T on success.
Extension: :PRINT :SOURCE means print source as well as value"
(loop
(restart-case
(return (%load file-name verbose print if-does-not-exist external-format))
(retry-load ()
:report (lambda (stream) (format stream "Retry loading ~s" file-name)))
(skip-load ()
:report (lambda (stream) (format stream "Skip loading ~s" file-name))
(return nil))
(load-other ()
:report (lambda (stream) (format stream "Load other file instead of ~s" file-name))
(return
(load (choose-file-dialog)
:verbose verbose
:print print
:if-does-not-exist if-does-not-exist))))))
现在希望不必每次调用时都加额外的参数指定
有这么几种解决方案:
1、从最早的源头出发,修改源代码中默认值参数 :default 的设置,原来的 :default 是 :latin-1 ,把 :latin-1 修改为 :utf-8 即可,比较麻烦,暂不考虑
2、直接修改load 函数的定义文件,把 :default 修改为 :utf-8 ,同样麻烦,暂不考虑;
3、自己写一个同样功能的 load 函数,编译加载,就自动替换了系统中的 load 函数了,最简单的做法是把 l1-files.lisp 中的 load 函数定义的代码拷出来,只修改你想修改的部分,然后编译加载,这样的好处是不需要编译其他的文件 === 实践证明:这种方法只适合那些比较简单孤立的系统函数,像 load 就不能这么做,因为 load 函数定义中的代码严重依赖于其他文件定义的函数;
4、写一个宏,名字就叫 load ,把形式 (load "filename") 变形为 (load "filename" :external-format :utf-8),但是目前对宏的学习还不太深入,没有真正掌握,试着写了两个都没转化正确,下面是错误的几种写法:
;; 错误写法1
(defmacro load1 (&rest args)
`(load ,@args)
`(:external-format :utf-8))
;; 错误写法2
(defmacro load1 (&rest args)
`(load ,@args)
`(":external-format :utf-8"))
;; 错误写法3
(defmacro load1 (&rest args)
`(load ,@args)
`(":external-format")
`(":utf-8"))
至此,上述几种验证都失败了,不过剩下没有尝试的可能就是正确的路径了,等有时间了再慢慢试~ :)