创建新的Lisp数据类型
我的头撞到了什么东西,这会让我的头发松下来。我试图在AutoLisp中实现类似OOP接口的东西,但为此,我需要一个ObjectType/ClassType,而不仅仅是一个list/integer/real/string。我知道这“可以”做到,因为这正是VisulaLisp ARX所做的:它创建了一种新的数据类型,用于AutoLisp。但是,为了迈克的爱,我在ObjectARX中找不到这样做的方法我不确定尝试“扩展”结果缓冲区类型是否可行。
**** Hidden Message ***** 无法实现新的数据类型或扩展结果缓冲区。为什么您觉得内置类型不够? 你可以通过 COM 向 lisp 公开你的 ObjectType/ClassType 是的,我在搜索的时候发现了。resbuf不允许任何“奇怪”的数据类型,甚至不能传递由vl.arx创建的safearray/variant类型。它们会导致错误,因为没有翻译成resbuff
这让我想知道这些类型是如何在vl.arx中实现的。更不用说那些Com对象类型了
我发现内置类型不足的原因是多方面的。例如:如果将BigNum用作当前值,它最多只能成为一个整数列表。如果我可以将其更改为专用类型,则可能会对某些函数(如+-*等)实现重写。但如果它是一个列表,则几乎不可能实现此类重写
我想简单的答案是让C++函数/对象可以COM访问,这样就可以从lisp端打开它们。很抱歉,因为COM并不总是可用(例如Mac)。
如果您实现了一个合适的管理系统来确保对象生存期和作用域与lisp环境同步,那么您可以使用RTENAME类型作为通用指针,指向您希望它指向的任何对象。但是,不可能提供内置lisp函数的一般覆盖,因为覆盖不能处理不支持类型的参数。但是,您可以公开自己的等效函数,这些函数使用您自己的“自定义”类型。 这就是想法是的。为了继续BigNum示例,我可以覆盖+defun并在C++/中重载它,甚至根据resbuf中的数据类型调用不同的函数。但是如果我将BigNum返回类型实现为列表数据类型,那么它可能会与未来的想法发生冲突(比如向量的标量加法)
原则是您应该能够在lisp中键入以下内容:(+ (expt 2 16) (expt 2 16)) ; Returning something like a
(+ '(1 2 3) 4) ;Returns (5 6 7)
珐琅的想法很有趣。我可以创建一个临时的ename并将其绑定到一个BigNum对象吗。我在想字典之类的东西。尽管我不想将其保存到DWG中。是否存在某种易失性的实体类型?我想不出有什么。如果可能的话,内存管理可以由实体上的dispose处理。
您可以像这样“创建名称:
BigNum myNumber;
resbuf rbEname {NULL, RTENAME};
rbEname.rlname = (LONG_PTR)&myNumber;
rbEname.rlname = 1234; //extra space, maybe a checksum or something?
谢谢,我会试一试的!
页:
[1]