我可以在lisp中嵌套defmethod / defgeneric吗?

时间:2014-05-09 07:58:49

标签: scope lisp let

我想在Haskell中创建一个“嵌套LET”的等价物,在那里我可以引用外部LET中绑定的一些值。需要注意的是,内部作用域中定义的函数需要调度其参数的类型,因此可以想到defgeneric

现在这是我的困惑:我只在“顶级”(在包装范围内)定义了这个;是否可以在任意词汇上下文中定义它?

如果没有,是否有推荐替代方案?一个hacky解决方案是将“context”作为defstruct参数传递给函数,我希望有更好的东西吗?

(我希望我的意图不会在翻译中丢失!)

编辑:这是一个愚蠢的问题,我应该尝试一下。如果有人寻找答案,那就是“是”,也“当然”,(duh)

举个简单的例子,

(let ((x 4))  
      (defgeneric bar (y))  
      (defmethod bar ((y integer)) (1+ y))  
      (bar x))

评估为

5

1 个答案:

答案 0 :(得分:2)

你可以做到这一点。它有一些缺点。

  • DEFMETHODDEFGENERIC是顶级表单。这意味着文件编译器识别它们然后知道它们。在LET内,这些表单不再是顶级表单,编译器无法识别它们。

  • 它使调试更难。突然间有方法的背景。

  • 它使更新方法更难。我不能只评估DEFMETHOD表单来更新方法,我还需要评估上下文。

在运行时使用上下文有两种典型方法:

  1. 在运行时使用动态绑定
  2. 在运行时使用参数
  3. 1的示例:

    (let ((*user* (find-current-user)))
      (declare (special *user*))
      (serve-page ...))
    

    或者,可以将特殊变量声明为全局。

    2的例子:

    (serve-page ... :user (find-current-user))
    

    即使是普通的包本地变量也足够好......