明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1434|回复: 13

[提问] 请问vlx如何实现相互引用?

[复制链接]
发表于 2024-3-20 14:09:22 | 显示全部楼层 |阅读模式
一直想请教一下一个问题:vlx如何实现相互引用。
查看葵花宝典中的vl-doc-import和vl-doc-export两个函数,不太明白他们的用法。
比如说:在一个叫做tt1.lsp的顶部中使用export,将tt1引出。再将tt1.lsp编译为vlx。
             在另一个叫做tt2.lsp的顶部中使用import,将tt1引出;用load函数将tt1求值。再将tt2.lsp编译为vlx。
先后加载tt1和tt2,发现输入tt1后正常,输入tt2后显示"已加载该 LISP 应用程序 tt1",但是不是函数tt1的求值结果。。。
是哪里出现问题了呢?
 楼主| 发表于 2024-3-20 14:11:07 | 显示全部楼层
tt1的内容是:
  1. (vl-load-com)
  2. (vl-doc-export 'c:tt1)
  3. (defun c:tt1 ()
  4.       (princ "\n²âÊÔ1£¡")
  5.       (princ)
  6.       )
  7. (defun l ()
  8.       (princ "\n²âÊÔ12£¡")
  9.       (princ)
  10.       )


tt2的内容是:
  1. (vl-load-com)
  2. (vl-doc-import "tt1" )
  3. (defun c:tt2()
  4. ;;;      (princ "\n²âÊÔ2£¡")
  5.       (load "tt1")
  6.       (c:tt1)
  7.       (princ)
  8.       )

  9. (defun k ()
  10.       (princ "\n²âÊÔ21£¡")
  11.       (princ)
  12.       )
 楼主| 发表于 2024-3-21 09:37:06 | 显示全部楼层
baitang36 发表于 2024-3-21 07:54
这东西不是你理解的意思
它是把某个独立名称空间的函数给别的空间用的。
也就是让某个函数跨空间。

盛老师,您好,谢谢您的回复!
我原来也是这么理解命名空间的。如果按照5F说的不选择命名空间,那就不需要export和import这两个函数了。
2F的代码就是用来验证export和import的用法的。
我试图将上面的tt1和tt2都按照名称空间编译,存在问题:
      1、如果不加上load,那么tt2就无法编译。
      2、加上了以后,tt2可以编译。但是运行c:tt2就提示“已加载该 LISP 应用程序 tt1”,但是不运行c:tt1(c:tt2里面调用了c:tt1)。
所以,我就上论坛问问。
期待您的解答,谢谢!!!
发表于 2024-3-21 09:17:34 | 显示全部楼层
VLX支持命名空间,也就是函数的作用域可以控制:
1)公共的,就是完全开放给内外使用。一般的普通编译方式就是默认公开的,VLX只要加载,就能定义输出函数定义到当前CAD,同时,自身是公共的,也可以随便调用别的VLX开放出来的函数
2)独立的,就是完全隐私的,自己定义的函数仅在内部有效,对外则全部是nil,不给别人用。同时,因为自身是隐私的,也不接受外部已定义的函数,要接收,就需要import将外部函数引入。如果要自己的隐私函数给外面用,就export出去,这样这个函数离开VLX后也会有定义。如果是C:开头的函数,则自动被export,无需export。
发表于 2024-3-20 16:04:57 | 显示全部楼层
这个vl-doc-export是导出wmf,dxf什么的用的,不是干这个事情的
 楼主| 发表于 2024-3-20 16:46:47 | 显示全部楼层
d1742647821 发表于 2024-3-20 16:04
这个vl-doc-export是导出wmf,dxf什么的用的,不是干这个事情的

看葵花宝典中的函数说明,是导出函数的啊。
发表于 2024-3-20 17:51:36 | 显示全部楼层
renxianjing 发表于 2024-3-20 16:46
看葵花宝典中的函数说明,是导出函数的啊。

你编译的时候不要选择命名空间就好了,
选择的话就会封闭起来,例如test就变成xxxxtest
不选择就是原始函数名...
所以vlx也是全局的
 楼主| 发表于 2024-3-20 19:19:38 | 显示全部楼层
你有种再说一遍 发表于 2024-3-20 17:51
你编译的时候不要选择命名空间就好了,
选择的话就会封闭起来,例如test就变成xxxxtest
不选择就是原始函 ...

好的,谢谢。
我试试。
发表于 2024-3-21 07:54:48 | 显示全部楼层
这东西不是你理解的意思
它是把某个独立名称空间的函数给别的空间用的。
也就是让某个函数跨空间。
 楼主| 发表于 2024-3-21 09:38:57 | 显示全部楼层
kozmosovia 发表于 2024-3-21 09:17
VLX支持命名空间,也就是函数的作用域可以控制:
1)公共的,就是完全开放给内外使用。一般的普通编译方式 ...

谢谢您的回复!!!
我看葵花宝典和论坛里面的帖子,大概知道名称空间的作用。但是不知道export和import函数如何使用,所以用2F的论坛试验一下。然后出现了几个问题,理解不了,所以上论坛问问。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 21:52 , Processed in 0.177265 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表