明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8405|回复: 15

[原创] 函数方式执行vbs语句(第二代)

  [复制链接]
发表于 2007-8-12 01:00:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2007-8-12 18:20:24 编辑

第一代:  利用vbs进行字符串表达式求值  http://bbs.mjtd.com/forum.php?mod=viewthread&tid=62105


(xvbs a) = 函数方式执行vbs语句(第二代)    by 梁雄啸.2007.8
函数:xvbs
格式:(xvbs 函数表达式)
参数:函数表达式,格式:表 或 字符串.
      vbs函数用'引导,如:(list 'msgbox "测试") 或 '(msgbox "测试").
      可多重嵌套.
      支持lisp变量.变量不用'引导.
      支持vbs的&,+等函数.
      字符串格式,如:
测试:
1. (xvbs '(msgbox ("测试时间 : " & vbcr & now )1))
2. 支持lisp变量:
   例1): (setq path (getvar "acadver"))
         (xvbs (list 'msgbox (list "测试" '& 'vbcr '& path) 3))
   例2): (xvbs '(a = (inputbox "输入数字1:")))
         (xvbs '(b = (inputbox "输入数字2:")))
         (setq k (if (= 0 (xvbs '( a > b))) " < " " > "))
         (xvbs (list 'msgbox (list 'a  '&  k '& 'b)))
3. 支持在函数表达式中使用lisp语句:
   (xvbs(list 'msgbox (list "测试" '& 'vbcr '& (strcat "cad版本号 = " (getvar "acadver"))) 3))
4. 连续执行多个vbs语句,支持vbs中变量传递:
   (xvbs '(cs = "测试"))
   (xvbs '(msgbox (cs & "ok"))) ;; cs是在vbs中定义的变量.
5. 支持多个vbs函数嵌套.
  (xvbs '(msgbox("当前日期:" & vbcr & date))) ; 使用了msgbox(对话框函数),date(日期函数)
6. 支持字符串表达式(原有功能):
   (xvbs "msgbox(\"测试时间:\" & now)")
   (xvbs "(rnd)")
7. 支持&,+ 等函数,支持数字,字符混合运算.
  (xvbs '("测" & "试")) ;-> "测试"
  (xvbs '(3 + 6 + 5)) ;->14
  (xvbs '(2 + (5 / 2) - "2")) ;->2.5
8. (setq a 0.5) ;-> a = 0.5
(xvbs '(b = 2.0)) ;-> b = 2
(xvbs '(c = "abc")) ;-> c = "abc"
(xvbs '(d = (sin ((b + ((10. / (len c) / b) mod 2)) - "2.5"))))
 步骤详解:
   (xvbs '(len c))  ->3
   (xvbs '((10. / (len c) / b) mod 2)) -> (10/3/2 mod 2) = (1.6667 mod 2) = 0 ;mod,求余数并四舍五入.
   (xvbs '(sin ((b + 0) - "2.5"))) -> sin(2+0-2.5) = sin(-0.5) = -0.479426
   (xvbs 'd) -> d=-0.479426
(xvbs (list a '* 'd)) ;->(0.5*(-0.47926))=-0.239713

下载地址(第一次传的文件有问题,现已经更新)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2007-8-12 01:01:00 | 显示全部楼层
本帖最后由 作者 于 2007-8-12 4:09:14 编辑

第二下载地址

http://dreamskylxx.ys168.com/

 楼主| 发表于 2007-8-12 03:35:00 | 显示全部楼层
本帖最后由 作者 于 2007-8-12 11:10:38 编辑

;举一个例子,纯粹为了测试一下函数的功能.

(setq a 0.5) ;-> a = 0.5 ;lisp函数付给a变量,值0.5
(xvbs '(b = 2.0)) ;-> b = 2  ;vbs付给b变量,值2.0
(xvbs '(c = "abc")) ;-> c = "abc"
(xvbs '(d = (sin ((b + ((10. / (len c) / b) mod 2)) - "2.5"))))
;| 步骤详解:
   (xvbs '(len c))  ->3 ;; "abc"字符长度为3
   (xvbs '((10. / (len c) / b) mod 2)) -> (10/3/2 mod 2) = (1.6667 mod 2) = 0 ;mod,求余数并四舍五入.
   (xvbs '(sin ((b + 0) - "2.5"))) -> sin(2+0-2.5) = sin(-0.5) = -0.479426
   (xvbs 'd) -> d=-0.479426
|;
(xvbs (list a '* 'd)) ;->(0.5*(-0.47926))=-0.239713

发表于 2007-8-12 12:57:00 | 显示全部楼层
能否指导一下实现原理?
发表于 2007-8-12 12:58:00 | 显示全部楼层
加载后出现"no function definition: XVBSDO"
 楼主| 发表于 2007-8-12 18:22:00 | 显示全部楼层
本帖最后由 作者 于 2007-8-12 18:30:23 编辑

原来传的附件是有点问题.已经更新.请重新下载

方法就是把表解析成字符串,如第一版的结构.

发表于 2007-8-13 00:24:00 | 显示全部楼层

呵呵想法不错!支持一个!

不过我想没有人会用混合式的语法结构的吧!

也没有人会在lisp放着现成的+ - * / strcat等等不用,

却要用到VBS中的+-*/&运算子.

支持vbs中变量传递,呵呵这可是不安全的变量传递哦,

就如CAD中如果所有程序都用的是全局变量一样的不安全,

我认为不安全的结构还不如不支持它为好!

其次就是效率问题了...

 楼主| 发表于 2007-8-13 01:09:00 | 显示全部楼层

当然了,平时不建议混合使用.上面例子只是纯粹用来测试函数功能的(前面已经说了).我想一般应用中也不会出现这样的情况.

lisp中使用vbs,只是用于在lisp不容易做到而vbs较容易做到的时候,才有意义.我也是打算这么用的 :)

发表于 2007-8-15 17:49:00 | 显示全部楼层
本帖最后由 作者 于 2007-8-15 17:59:05 编辑

作为能用LISP实现其他语言嵌套,来实现LISP原本很难或不能实现的功能,这种做法是需要举双手赞成的。这样能使LISP语言的应用面更广,更可能实现商业化开发(天正的低版本很多功能都是用LISP实现的,在高版本中它开源了,有兴趣的可以看看的)。

无痕能为大家带来耳目一新的编程思路。应该加分。

要能在论坛上开帖讨论一些思路及算法那更好了。

就象前段时间的帖子:实现Quicktool Win32Api For Lisp编程接口一样,要能有人开帖讨论其实现方法就能推动论坛了。

我试着做了一下,VB的代码基本出来了,但就是参数传递无法解决。

 楼主| 发表于 2007-8-15 22:23:00 | 显示全部楼层

NetBee 提到的帖子我也有看过,虽然很感兴趣,无奈本人的vb,vc水平是菜地,一下子也没办法恶补.

所以就等NetBee 的好消息了:)

不如先透露点?说说是怎么做的.

我也看了些网页,好像vb的参数是传值,传址是vb的软肋.看来是netbee要过这一关不容易.

建议:不如用vc改写吧:)

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

本版积分规则

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

GMT+8, 2024-11-23 14:54 , Processed in 0.200099 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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