我想在Haskell中创建一个“嵌套LET
”的等价物,在那里我可以引用外部LET
中绑定的一些值。需要注意的是,内部作用域中定义的函数需要调度其参数的类型,因此可以想到defgeneric
。
现在这是我的困惑:我只在“顶级”(在包装范围内)定义了这个;是否可以在任意词汇上下文中定义它?
如果没有,是否有推荐替代方案?一个hacky解决方案是将“context”作为defstruct
参数传递给函数,我希望有更好的东西吗?
(我希望我的意图不会在翻译中丢失!)
编辑:这是一个愚蠢的问题,我应该尝试一下。如果有人寻找答案,那就是“是”,也“当然”,(duh)
举个简单的例子,
(let ((x 4))
(defgeneric bar (y))
(defmethod bar ((y integer)) (1+ y))
(bar x))
评估为
5
答案 0 :(得分:2)
你可以做到这一点。它有一些缺点。
DEFMETHOD
和DEFGENERIC
是顶级表单。这意味着文件编译器识别它们然后知道它们。在LET
内,这些表单不再是顶级表单,编译器无法识别它们。
它使调试更难。突然间有方法的背景。
它使更新方法更难。我不能只评估DEFMETHOD
表单来更新方法,我还需要评估上下文。
在运行时使用上下文有两种典型方法:
1的示例:
(let ((*user* (find-current-user)))
(declare (special *user*))
(serve-page ...))
或者,可以将特殊变量声明为全局。
2的例子:
(serve-page ... :user (find-current-user))
即使是普通的包本地变量也足够好......