小编Alb*_*glu的帖子

在Lisp中调用另一个重载方法

我无法确定这是否可行,只是使用了一个(相当丑陋)的解决方法.

假设我们有一个类结构如下:

(defclass a () ())
(defclass b (a) ())
Run Code Online (Sandbox Code Playgroud)

和方法:

(defmethod print-object ((a1 a) stream)
 (format stream "instance of A "))
Run Code Online (Sandbox Code Playgroud)

现在,我想打印'a a then print for'b,假设存在"type-cast"函数:

(defmethod print-object ((b1 b) stream)
 (prin1 (type-cast b1 'a) stream)
 (format stream "instance of B "))
Run Code Online (Sandbox Code Playgroud)

我的解决方法是在b的print-object中创建一个a类型的对象,然后调用prin1

(defmethod print-object ((b1 b) stream)
 (let ((a1 (make-instance 'a)))
    (prin1 a1 stream))
 (format stream "instance of B "))
Run Code Online (Sandbox Code Playgroud)

我试图强迫并最终得到无限循环.我刚刚意识到我可以尝试使用find-method和call-method(它会起作用吗?).或者我应该尝试解决方案:周围?

lisp common-lisp clos

1
推荐指数
2
解决办法
201
查看次数

切换包时,词法绑定丢失了

我想要的只是为swank加载一个初始化文件,这个文件在没有swank的情况下启动时不会影响我的lisp ...

我首先在我的文件中尝试#+ swank(defun ...),它是从ccl-init加载的(在ccl 1.10 + windows上尝试这个),很快就意识到它是在swank加载之前来源的(显然).

我的目标是在每次开始swank时定义一个简单的函数:cl-user.我刚刚用一个swank add-hook来加载我的init.lisp文件,因为我想在cl-user中定义函数,我在init.lisp中尝试了这个:

(let ((current-package *package*))
  (in-package :cl-user)
  (defun cd (dir)
    (swank:set-default-directory
      (parse-namestring dir)))
  (in-package current-package))
Run Code Online (Sandbox Code Playgroud)

现在,我不记得是否允许在let中使用defun,但是lisp不会抱怨它,而是告诉我cur-pck符号不存在,而且当我们切换包时,似乎绑定超出范围.我认为cur-pck是一个词法绑定,它应该可以从词法区域内到达,独立于包,我错了吗?

为什么要换包?我想在某些初始化点从swank加载这个文件会定义一些swank包中的东西,这就是为什么我想先尝试切换到cl-user,定义函数符号,然后切换回让swank做它的事情.

在这一点上,我想我需要有人告诉我,我正在从错误的角度解决问题,我最好选择一个更简单的解决方案.

另外,出于好奇心,上面的情况是完全错误的方法,有没有办法在函数或闭包中的另一个包中定义符号?

packages common-lisp swank

1
推荐指数
1
解决办法
110
查看次数

标签 统计

common-lisp ×2

clos ×1

lisp ×1

packages ×1

swank ×1