gpt4 book ai didi

graphics - 常见的 lisp 类型与 defgeneric 运行时分析

转载 作者:行者123 更新时间:2023-12-04 22:30:10 24 4
gpt4 key购买 nike

我正在编写一个使用 opengl 的普通 lisp 应用程序,随着事情的发展,我意识到我有一些选择要做。我有一堆不同的类,它们都需要代码来快速且频繁地呈现它们,因此我正在考虑使用以下代码结构来执行此操作:

(defgeneric render (x))
(defmethod render ((x vanilla-foo))
(generic-foo-stuff)
(vanilla-specific-stuff)
(more-generic-foo-stuff))
(defmethod render ((x chocolate-foo))
(generic-foo-stuff)
(chocolate-specific-stuff)
(more-generic-foo-stuff))

等等,很多这些方法。另一种选择是使用 typecase 语句:
(defun render (any-old-foo)
(generic-foo-stuff)
(typecase
(vanilla-foo
(vanilla-specific-stuff))
(chocolate-foo
(chocolate-specific-stuff))
;;and so on, lots of cases here
)
(more-generic-foo-stuff))

我想这些都以它们自己的方式丑陋,但我的假设是 lisp 将在引擎盖下使用某种哈希表 O(1) 查找,将传递给泛型函数的参数类型映射到所需方法的位置,而第二种方法将需要 O(n) 类型比较才能通过 typecase 语句。另一方面,根据散列可能有多慢或多快,在第一种方法真正更快之前,我可能需要数千种 foo flavor 。

是否有一个很好的性能原因我应该喜欢一个?我也愿意接受其他建议,或对某种文件的引用,这些文件使我更清楚在每种情况下发生了什么。我也很好奇您可能遇到的此类冲突的其他实例。

谢谢!

最佳答案

至少您可以通过将泛型内容分解为 :before:after 方法来使使用泛型函数的代码不那么难看:

(defgeneric render (x))

(defmethod render :before (x) ; Do what always has to be done first
(generic-foo-stuff))

(defmethod render :after (x) ; Do what always has to be done last
(more-generic-foo-stuff))

(defmethod render ((x vanilla-foo)) ; Do only vanilla-specific things here
(vanilla-specific-stuff))

(defmethod render ((x chocolate-foo))
(chocolate-specific-stuff))

关于graphics - 常见的 lisp 类型与 defgeneric 运行时分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30561076/

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