乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 104|回复: 7

创建新的Lisp数据类型

[复制链接]

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2012-5-29 12:24:24 | 显示全部楼层 |阅读模式
我的头撞到了什么东西,这会让我的头发松下来。我试图在AutoLisp中实现类似OOP接口的东西,但为此,我需要一个ObjectType/ClassType,而不仅仅是一个list/integer/real/string。我知道这“可以”做到,因为这正是VisulaLisp ARX所做的:它创建了一种新的数据类型,用于AutoLisp。但是,为了迈克的爱,我在ObjectARX中找不到这样做的方法
我不确定尝试“扩展”结果缓冲区类型是否可行。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

15

主题

190

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
250
发表于 2012-5-30 10:43:25 | 显示全部楼层
无法实现新的数据类型或扩展结果缓冲区。为什么您觉得内置类型不够?
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2012-5-30 10:51:32 | 显示全部楼层
你可以通过 COM 向 lisp 公开你的 ObjectType/ClassType
回复

使用道具 举报

15

主题

190

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
250
发表于 2012-5-30 11:14:58 | 显示全部楼层
是的,我在搜索的时候发现了。resbuf不允许任何“奇怪”的数据类型,甚至不能传递由vl.arx创建的safearray/variant类型。它们会导致错误,因为没有翻译成resbuff
这让我想知道这些类型是如何在vl.arx中实现的。更不用说那些Com对象类型了
我发现内置类型不足的原因是多方面的。例如:如果将BigNum用作当前值,它最多只能成为一个整数列表。如果我可以将其更改为专用类型,则可能会对某些函数(如+-*等)实现重写。但如果它是一个列表,则几乎不可能实现此类重写
我想简单的答案是让C++函数/对象可以COM访问,这样就可以从lisp端打开它们。很抱歉,因为COM并不总是可用(例如Mac)。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2012-5-30 12:06:42 | 显示全部楼层
如果您实现了一个合适的管理系统来确保对象生存期和作用域与lisp环境同步,那么您可以使用RTENAME类型作为通用指针,指向您希望它指向的任何对象。但是,不可能提供内置lisp函数的一般覆盖,因为覆盖不能处理不支持类型的参数。但是,您可以公开自己的等效函数,这些函数使用您自己的“自定义”类型。
回复

使用道具 举报

15

主题

190

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
250
发表于 2012-5-30 13:20:58 | 显示全部楼层
这就是想法是的。为了继续BigNum示例,我可以覆盖+defun并在C++/中重载它,甚至根据resbuf中的数据类型调用不同的函数。但是如果我将BigNum返回类型实现为列表数据类型,那么它可能会与未来的想法发生冲突(比如向量的标量加法)
原则是您应该能够在lisp中键入以下内容:
  1. (+ (expt 2 16) (expt 2 16)) ; Returning something like a [B]
  2. (+ '(1 2 3) 4) ;Returns (5 6 7)

珐琅的想法很有趣。我可以创建一个临时的ename并将其绑定到一个BigNum对象吗。我在想字典之类的东西。尽管我不想将其保存到DWG中。是否存在某种易失性的实体类型?我想不出有什么。如果可能的话,内存管理可以由实体上的dispose处理。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2012-5-30 15:20:18 | 显示全部楼层

您可以像这样“创建名称:
  1. BigNum myNumber;
  2. resbuf rbEname {NULL, RTENAME};
  3. rbEname.rlname[0] = (LONG_PTR)&myNumber;
  4. rbEname.rlname[1] = 1234; //extra space, maybe a checksum or something?

回复

使用道具 举报

15

主题

190

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
250
发表于 2012-5-31 03:47:14 | 显示全部楼层
谢谢,我会试一试的!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 12:39 , Processed in 0.320607 second(s), 79 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表