gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:46 24 4
gpt4 key购买 nike

我想创建相当于 Haskell 中的“嵌套 LET”,我可以在其中引用一些绑定(bind)在外部 LET 中的值。需要注意的是,在内部作用域中定义的函数需要根据其参数的类型进行分派(dispatch),因此想到了 defgeneric

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

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

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

编辑:这是一个愚蠢的问题,我应该试一试。如果有人寻找这个问题的答案,答案是肯定的,而且“当然”,(duh)

举个简单的例子,

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

评估为

5

最佳答案

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

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

  • 这让调试变得更加困难。突然有了方法的上下文。

  • 它使更新方法变得更加困难。我不能只评估 DEFMETHOD 形式来更新方法,我还需要评估上下文。

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

  1. 在运行时使用动态绑定(bind)
  2. 在运行时使用参数

示例 1:

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

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

2 的示例:

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

即使是普通的包局部变量也足够好...

关于scope - 我可以在 lisp 中嵌套 defmethod/defgeneric 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23559425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com