明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: aroom

隆重推出AutoLisp For Windows!

  [复制链接]
发表于 2008-6-11 00:17 | 显示全部楼层

楼主还是先提供程序给大伙看看吧,你的东西我觉得确实不错,希望能支持的不仅是for windows,还有部分arx里面的,arx能干的lsp很难做到的东西如果能实现也不错。

 楼主| 发表于 2008-6-11 00:47 | 显示全部楼层

计算机的发明建立在二进制算法之上,二进制的诞生地是屹立在东方的文明古国---中国。

“太极生两仪”,万物始于空。

在Lisp里,空就是nil 。 “两仪”即 nil 和 true

《老子》曰:无名天地之始。有名万物之母。

在Lisp里,“无名”可理解为符号尚未赋值之前,为nil 。 “有名”即符号,任何数据都被符号所指向,被参考和引用

Lisp语言含有丰富的东方哲学,这就是她的魅力所在。

计算机世界里,只有两大语言是恒久存在的,一个是C语言,还有一个是Lisp语言。值得庆幸的是来到这个板块里的人至少熟悉后者,坚持学习、掌握它。

需要澄清的一点是:AutoCAD不是CAD的全部,同样AutoLisp不是Lisp的全部。

Lisp包含但不限于AutoLisp, 实现的地方方言有: Common Lisp 、scheme 、算子....

发表于 2008-6-11 13:06 | 显示全部楼层

高手中的高手呀,今天第一次听这样的老师说教,真是佩服呀,您懂的太多了,要是可以多听听你的说教就好啦?

 楼主| 发表于 2008-6-11 15:34 | 显示全部楼层

回到Lisp的实质,list(列表)既是堆栈,也是队列。

(setq lst nil) ;在lst被赋值之前本来就是列表, :) 有画蛇添足之嫌

(cons 1 lst) => '(1) ; 将其理解为将1压入堆栈,返回堆栈包含的内容。行为动作很像push

lst  => nil 

push 后为什么不是'(1)?

对了,Autolisp 的参数代入,不是传址,而是传值。因此无法定义解构函数。lst 保持原来的值

(setq lst (cons 1 lst))  ;这下等同于push

lst  => '(1)  ;)

那么pop 等价什么呢? 来看:

(car lst) => 1 ;弹出了 FILO--First Input Last Output 你可以 (cons 3 (cons 2 (cons 1 nil))) 用car测试结果

综述,Autolisp 不能传递指针,这是很大的遗憾。

 楼主| 发表于 2008-6-11 16:18 | 显示全部楼层

西方人送给你礼物时,你应该当面打开它,并发自内心地赞美,客人欣然。

相反,东方人送给你礼物时,你应该在客人走后再打开它,含蓄显得有风度。

在Lisp中,她总是打开你送给她的盒子:

1   =>   1   ;Lisp说: 整数1,不错!

"abc"   =>   "abc"   ;Lisp说: 好漂亮的"abc"字符串也!

(strcat "a" "b")  =>   "abc"   ;Lisp打开盒子,并说:哇, 字符串"a" 和字符串"b"连起来成"ab"啦!

简单的数据原本简单,复杂的数通过剥去括号(打开盒子),剥去符号(也是打开盒子),化繁为简。这是我们处理数据的目标,不是吗?

Lisp打开盒子,我们称其为求值。

呵呵,东方人延迟打开盒子,我们称其为延迟求值(quote)。

(setq a 123)   ;将123赋值给符号a (装入盒子),送给Lisp

a   =>   123    ;Lisp打开盒子,并告诉你她看到的一切

' a   =>   A     ;Lisp并没有打开它,含蓄地朝你笑了一笑 :)

 楼主| 发表于 2008-6-11 16:51 | 显示全部楼层
本帖最后由 作者 于 2008-6-11 16:53:17 编辑

在Lisp为我们打开盒子的率真本性感到高兴的同时,有时也为"囊中羞涩"感到困惑。

AutoLisp就是这么个任性的姑娘!

如果我们在参数中包含vb的语句,比如:

(defun vbs-run (statement) (...))  ;呵呵,给她送个装满水的金鱼缸

(vbs-run  : Set xl = CreateObject("Excel.Application")
               : xl.Visible = True)

......

果然,她打不开,搬来了"铁锤",结果水洒了一地!

我想要的是statement,不要打开!可是没有通道告诉她。

上面我解释了宏的基本概念,defun 函数总是先对自变量进行从左到右地依次求值,而后进入函数体中对语句求值。

 Lisp中的宏可以保留自变量不被求值。

发表于 2008-6-11 17:02 | 显示全部楼层

浪费表情

 楼主| 发表于 2008-6-11 17:26 | 显示全部楼层

图形用户界面(GUI)一直是困扰高级Lisper的问题,DOS时代使用命令行式的控制台界面,DCL算是先进的交互界面

随着时间地推移,DCL函数的不可扩充性已是"黔驴技穷"。人们在纷繁多样的界面元素中寻求一种平衡。要吸引用户的眼球,很多人选择了ARX,有所得必有所失,被"指针"扎得伤痕累累。得到的同时,也失去了Lisp特有的交互对话和灵活数据类型的方便。

windows的界面元素本质是RES, 虽然各种资源编辑器编辑了RC文件,最终将编译为二进制字节码的RES文件。二进制文件由各种字符值的字节符号组成,AutoLisp的open、 read-line...不能读取ascii<32的字符。这又是AutoLisp的遗憾。

说了这么多,你会急迫地想知道能否解决问题,如何来实现?

 楼主| 发表于 2008-6-11 18:01 | 显示全部楼层
本帖最后由 作者 于 2008-6-11 18:08:31 编辑

答案是:

创新,发明出另一种语言,她叫“算子”。

下载附件,解压缩,运行szIDE。

将第一楼的代码贴入贴入,按F5, 你会看到结果。

本帖子中包含更多资源

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

x
 楼主| 发表于 2008-6-11 18:06 | 显示全部楼层
本帖最后由 作者 于 2008-6-11 22:24:07 编辑

;;;这里提供OpenGL的例子供你学习
  1. (importDLL-ALL "opengl32.dll")
  2. (importDLL-ALL "freeglut.dll")
  3. (setq GL_COLOR_BUFFER_BIT  0x00004000
  4.       GL_TRIANGLES         0x0004
  5.       GLUT_DOUBLE 0x0002
  6.       GLUT_SINGLE 0x0000
  7.       GLUT_RGB 0x0000
  8.       GLUT_RGBA 0x0000      
  9.   rotx 0.0 roty 0.0)
  10. (defun draw ()
  11. (glClear GL_COLOR_BUFFER_BIT )
  12. (glRotated rotx 0.0 1.0 0.0)
  13. (glRotated roty 1.0 0.0 0.0)
  14. (glutWireTeapot 0.5)
  15. (glutSwapBuffers)
  16. )
  17. (defun rotation ()
  18. (setq rotx (% (- (float rotx) .01) PI)
  19.          roty (% (- (float roty) .012) PI))
  20. (sleep 30)
  21. (glutPostRedisplay)
  22. )
  23. (defun keyboard (key x y)
  24. (if (= (& key 0xFF) 27) (exit))
  25. (println "key:" (& key 0xFF) " x:" x  " y:" y)
  26. (Speak "you press a key")
  27. )
  28. (defun mouse (button state x y)
  29. (if (= state 0)
  30.   (glutIdleFunc 0)
  31.   (progn
  32.    (Speak "you click mouse button")
  33.    (glutIdleFunc (callback 'rotation)))
  34. )
  35. (println "button: " button " state:" state " x:" x " y:" y)
  36. )
  37. (defun motion (x y)
  38. (setq rotx (* (/ 200.0 x) PI)
  39.        roty (* (/ 150.0 y) PI))
  40. (glutPostRedisplay)
  41. (println "x:" x  " y:" y))
  42. (defun main (argc argv)
  43. (glutInit (address argc) (address argv))
  44. (glutInitDisplayMode (| GLUT_RGB GLUT_DOUBLE ))
  45. (glutInitWindowSize 800 600)
  46. (glutInitWindowPosition 80 80)
  47. (setq id (glutCreateWindow "算子语言调用OpenGL示例"))
  48. (glClearColor (flt 0.5) (flt 0.3) (flt 0.3) (flt 0.0))
  49. (glColor3d 1.0 0.85 0.35)
  50. (glutDisplayFunc (callback 'draw))
  51. (glutKeyboardFunc (callback 'keyboard))
  52. (glutMouseFunc (callback 'mouse))
  53. (glutMotionFunc (callback 'motion))
  54. (glutIdleFunc (callback 'rotation))
  55. (glutMainLoop)
  56. )
  57. (main 0 "")

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-2 14:00 , Processed in 0.200668 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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