暂时失败的尝试:替换CCL中系统函数的定义 === open

暂时失败的尝试:替换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"))
至此,上述几种验证都失败了,不过剩下没有尝试的可能就是正确的路径了,等有时间了再慢慢试~ :)

你可能感兴趣的:(暂时失败的尝试:替换CCL中系统函数的定义 === open)