zdzdzdzd 发表于 2009-9-2 23:33:00

求助:关于函数调用问题

<p>求助:</p><p>&nbsp;如何在一个具有“独立变量空间”的程序中调用另一个具有“独立变量空间”的程序中所定义的c:函数?</p><p>例如:aa和 bb两个lisp程序要分别被编译成“独立变量空间”的vlx程序。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如何实现在aa程序中调用bb程序中定义的C:函数呢?&nbsp;</p>

龙龙仔 发表于 2009-9-3 08:01:00

<p>使函數讓目前的文件可用<br/><font color="#ff0000">(vl-doc-export 'function)</font>
        </p><p>當在自已名稱空間執行的 VLX 從自已發出時,vl-doc-export 出現特定的函數在任何載入 VLX 的文件名稱空間。<br/>vl-doc-export 函數應只用在檔案的頂層,決不在其他格式中。(例如,不在 defun 中)。</p><p>引數</p><p>'function </p><p>要匯出函數名稱的符號。</p><p>傳回值</p><p>未指定。</p><p>範例</p><p>下列的程式碼顯示名為 kertrats.lsp 檔案的內容。這個檔案編譯到在自己名稱空間中執行的 VLX 中。<br/>這個 VLX 檔案名稱為 kertrats.vlx。vl-doc-export 呼叫使 kertrats函數可見於任何載入 kertrats.vlx:</p><p>(vl-doc-export 'kertrats)<br/>(defun kertrats ()<br/>&nbsp; (princ "This function goes nowhere") </p><p>)</p><p>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</p><p><br/>將之前匯出的函數匯入到 VLX 名稱空間<br/><font color="#ff0000">(vl-doc-import application ['function...])</font>
        </p><p>這個函數可以用在分離名稱空間的 VLX 中,來匯入之前從相同文件載入的另一個 VLX 匯出的函數。<br/>vl-doc-import 函數應只用在檔案的頂層,決不在其他格式中。(例如,不在 defun 中)。</p><p>引數</p><p>application </p><p>其函數要被匯入之 VLX 應用程式名稱的字串請不要在名稱中包含 .vlx 副檔名。</p><p>函數 </p><p>一個或以上要匯入函數名稱的符號。如果沒有指定的函數,會匯入全部由 application 匯出的函數。</p><p>傳回值</p><p>未指定。</p><p>範例</p><p>從 ldatatest 應用程式匯入 ldataget 函數:</p><p>(vl-doc-import "ldatatest" 'ldataget)</p><p>nil</p>

zdzdzdzd 发表于 2009-9-3 16:09:00

<p>非常感谢版主龙龙仔的快速回复,再多请教两个个问题</p><p>一、 vl-doc-import和vl-doc-export是不是一定成对使用?</p><p>比如说:我想在程序aa中调用程序bb定义的函数,&nbsp;是不是要在程序bb的开头使用vl-doc-export作发出声明;并且在程序aa的开头用vl-doc-import作引用声明呢?</p><p>二、上面两个程序编译成vlx文件后,进行加载是否有顺序规定。是一定先加载bb再加载aa吗?</p><p></p>

xhq1954425 发表于 2009-9-4 06:04:00

本帖最后由 作者 于 2009-9-4 8:31:49 编辑 <br /><br /> <p style="BACKGROUND: white; WORD-BREAK: break-all;"><font color="#f84519" size="5">下面是我收藏已经被关了禁闭的<strong><font color="#000000">liminnet</font></strong>发的一个自这定义函数,看不明白怎么调用<p style="BACKGROUND: white; WORD-BREAK: break-all;"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Tahoma;">(ko-&gt;entsel msg keyword action filter_list errmsg) <font color="#e61a1a">这个自定义函数,把它放在哪呢?</font><p></p></p><p></p><p></p><p></p><p></p><p></p></font></span></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">(ko-&gt;entsel msg keyword action filter_list errmsg) <font color="#e61a1a">这个自定义函数,把它放在哪呢?</font><p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;"><font color="#e61a1a"></font><p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;"><font color="#e6421a" size="5">我是自学时间也不长,龙版主的说明也没看明白,<strong><font color="#ee3d11"><img title="em46" alt="" src="http://www.mjtd.com/bbs/Skins/Default/emot/em46.gif" style="CURSOR: pointer;"/></font></strong>请教一下这个函数的加载(放在哪?)和调用方法,谢谢!</font></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">增强型及变种型ko-&gt;entsel<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">语法:<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">(ko-&gt;entsel msg keyword action filter_list errmsg)<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">功能及参数<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">功能:扩展 entsel,支持过滤选择,关键字,返回一个对象图元或字符串(包括关键字或实数或整数)或用空格结束返回nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可控制关键字是否需要空格或回车键或右键来响应程序<br/>&nbsp;&nbsp;&nbsp;<br/>&nbsp; <br/>参数 [类型]:<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 提示信息。如果nil时则显示缺省为"\n选择对象: "<br/>keyword&nbsp;&nbsp;&nbsp;&nbsp; = initget的keyword 关键字&nbsp;&nbsp; 不考虑时参数为nil&nbsp;&nbsp; 关键字必须大写和单词间至少留一位空格 "W G"或"Undo Option eXit"<br/>action&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 控制keword是否需要空格或回车键或右键来响应,具备天正的命令的功能 T或nil(大小写不分)<br/>filter_list = 过滤字符表.参见ssget ,不考虑时参数为nil&nbsp;&nbsp;&nbsp;&nbsp; '((0 . "*LINE,CIRCLE,ARC"))或(list '(0 . "*line,circle,arc")) (大小写不分)<br/>errmsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 出错信息(STR)。如果nil时则显示缺省为"无效的对象。"<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意:firstss参数如果要启用时,语句(setq firstss (cadr (ssgetfirst)))一定要放在主程序最前面一行<br/>范例:<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">1.(ko-&gt;entsel "\n选择直线或圆/Undo/Option/eXit"&nbsp; "Undo Option eXit" t '((0 . "*LINE,CIRCLE,ARC")) nil)<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">2.<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">测试:<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">(defun c:tt()<br/>&nbsp; (setq xh t)<br/>&nbsp; (while xh<br/>&nbsp;&nbsp;&nbsp; (setq ent (ko-&gt;entsel "\n测试ko-&gt;entsel函数(X)/(H):" "X H" T '((0 . "*LINE,CIRCLE,ARC")) nil))<br/>&nbsp;&nbsp;&nbsp; (cond ((= ent "X") (alert "等于字符串X你要执行的程序一") ent)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= ent "H") (alert "等于字符串H你要执行的程序二") ent)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= (type ent) 'ENAME) (alert "这个功能是返回图元名") (setq xh nil) ent)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((numberp ent) (alert (strcat "此项功能是判断输入的是否是实数或整理,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于不用进入子选项而直接设置一个值" "\n"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "请选择要拉伸的对象或[当前默认值(500)或直接输入值回车改变默认值]"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ent<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= ent nil) (setq xh nil))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;)<br/>)<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">(defun c:ff()<br/>&nbsp;&nbsp;&nbsp; (ko-&gt;entsel "\n[选择你要标注的对象或修改(F)/(W)/(X)]&lt;" "Fdf&nbsp; dWg&nbsp;&nbsp;&nbsp; eXit" t (list '(0 . "*LINE,CIRCLE,ARC")) nil)<br/>)<p></p></p><p></p><p></p><p></p><p></p><p></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><p><font face="Times New Roman">&nbsp;</font></p></p><p><font face="Times New Roman">&nbsp;</font></p><p></p><p><font face="Times New Roman">&nbsp;</font></p><p></p><p><font face="Times New Roman">&nbsp;</font></p><p></p>

龙龙仔 发表于 2009-9-4 07:58:00

zdzdzdzd发表于2009-9-3 16:09:00static/image/common/back.gif非常感谢版主龙龙仔的快速回复,再多请教两个个问题一、 vl-doc-import和vl-doc-export是不是一定成对使用?比如说:我想在程序aa中调用程序bb定义的函数,&nbsp;是不是要在程序bb的开头使用vl-

<p>可以這樣說vl-doc- export是把函數放在能調用的空間,vl-doc-import把可用的函數調進獨立變量空間</p><p>加載順序如你說的較好(只要在使用aa前bb有加載即可)</p>

zdzdzdzd 发表于 2009-9-4 22:42:00

龙龙仔发表于2009-9-4 7:58:00static/image/common/back.gif可以這樣說vl-doc- export是把函數放在能調用的空間,vl-doc-import把可用的函數調進獨立變量空間加載順序如你說的較好(只要在使用aa前bb有加載即可)

<p>&nbsp;在你的帮助下,问题已经解决,程序得到改善。</p><p>经过实测,加载顺序确实有要求。必须先加载bb。</p><p>再次感谢龙版主的热心答复。</p><p></p><p></p>

xhq1954425 发表于 2009-9-5 06:23:00

<p></p><p><font color="#f84519" size="5">会的指点一下,我为你献花一朵表示谢意!</font></p><p>谁能告诉我怎么能用上<font size="5"><strong>liminnet</strong><font color="#f84519">发的一个自定义函数(四楼有程序下载)</font></font></p><p><font color="#f84519" size="5">我在文件中先加载了那个自定义函数,然后运行他给的测试程序就是不行呀,提示是没有定义……</font></p><p style="BACKGROUND: white; WORD-BREAK: break-all;">(defun c:ff()<br/>&nbsp;&nbsp;&nbsp; (ko-&gt;entsel "\n[选择你要标注的对象或修改(F)/(W)/(X)]&lt;" "Fdf&nbsp; dWg&nbsp;&nbsp;&nbsp; eXit" t (list '(0 . "*LINE,CIRCLE,ARC")) nil)<br/>) <p></p></p><p></p><p></p><p></p>
页: [1]
查看完整版本: 求助:关于函数调用问题