家园首页· 下载中心· 图纸中心· 文章中心· 教学中心· 晓东词典· 资源中心· FTP联盟· 校友录· 邮购服务
   论坛首页免费注册个人设置帮助退出论坛 爱心币规则  快速链接 游乐园  

  为改善网站速度,本站接受大家捐款,共建家园,点击查看汇款方法和捐款朋友名单...


晓东CAD家园 : Powered by vBulletin version 2.2.1 家园首页 >> 家园论坛 > …编程开发版块 > ※AutoLISP/VLISP 开发技术※ > [日积月累]:对变量、函数、局部、全局等概念的肤浅认识
  上一主题   下一主题
作者
主题 发布新主题    回复主题
snoopychen [查找更多关于snoopychen的帖子]积分28
超级会员


ID: No.8476
发贴数: 365

经验值: 82%
等级: 17 级

现金:633¥
存款:

积分: 28
注册日期: 2002.08.04
日均在线: 0.31 小时
来  自:
1楼楼主说:[日积月累]:对变量、函数、局部、全局等概念的肤浅认识

对变量、函数、局部、全局等概念的肤浅认识
qjchen
前段时间论坛有过一个函数变量的讨论,让我感触颇深
最近又编了一个很长很长的代码,
因此对变量,函数,局部,全局等概念觉得有必要比较认真的反思一下

于是,做了如下的一些测试,得到了一些体会
由于我是业余编程,本来就是靠蛮劲在编程的,二来Lisp这种语言的函数和变量是同一概念,搞得自己也比较模糊
因此得到的这些看法很肤浅,各位可能早就思考过了,见笑见笑
各位可以先看代码,估算一下结果,假如各位估算全对的话,就完全不用看了,都是很简单的东西

1)当一个函数没有终结的时候,这个函数内的局部变量可以被其他子程序所调用。
这个问题的范例代码是:
代码:

(defun c:test (/ a b)
  (setq a 1
            b 2
  )
  (fun 0 1)
)

(defun fun (x y)
  (+ (+ x a) (+ y b))
)

我原来一直以为中途跑出test去fun中,局部变量会丢失,现在看起来是错误的。
只要这个程序没有终结,里面的各种变量都存在内存空间,只有程序终结了,变量才被清空。

2)在defun里面的定义为局部变量的defun函数不能被其他函数调用
这个问题的范例代码是:
代码:

(defun c:test ()
  (setq x (ee 2))
)

(defun fun1 ()
  (defun ee (x)
    (+ x 6)
  )
)

可以看出是没有结果的,以前不大明白为什么要把一段那么长的defun写在别的defun里面,
现在觉得可能有些作用,起码这些函数不会和别的变量或者函数同名,而且可能也起到节省内存空间的作用。
这个可以通过在命令行输入!fun1和!ee来认知

3)其实Lisp里面的函数和变量几乎都是一样的,可能这就是Lisp的本质吧,一种表结构的语言
代码:

(defun c:test (/ x)
  (setq x (fun1 5))
(princ "\n               x = ") (princ x);Erase_DV
(getstring "\nPress Enter to continue...");Erase_DV
  (setq xx (eee 6))
(princ "\n              xx = ") (princ xx);Erase_DV
(getstring "\nPress Enter to continue...");Erase_DV
)

(defun fun1 (y)
  (defun eee (x)
    (+ x 6)
  )
  (eee y)
)

可以看出,是都有结果的,所以呢,刚才(2)中提到的defun中的defun不能被其他程序调用的情况要加适用条件了
这个适用条件就是“局部变量”
在这个例子中,假如先调用eee的话是不行的,但是先调用了fun1之后,eee由于不是fun1的局部变量,
就存在了内存空间了,没有被清除

4)传递变量在函数终结时被清空
代码:

;;---------------------------------
(defun c:test ()
  (setq a 5
	b 6
  )
  (setq c (fun2 1 2))
(princ "\n               a = ") (princ a);Erase_DV
(princ "\n               b = ") (princ b);Erase_DV
(getstring "\nPress Enter to continue...");Erase_DV
  
)
(defun fun2 (a b)
(princ "\n               a = ") (princ a);Erase_DV
(princ "\n               b = ") (princ b);Erase_DV
(getstring "\nPress Enter to continue...");Erase_DV
  (list (+ a 1) (+ b 2))
)

可以看出fun2中的a b在fun2结束之后就不复存在了,所以传递变量只是临时存在这个引用函数中,与其他变量同名也无妨


5)总结
在写了上面一堆东西之后,好像突然间想通了,又好像白写了,这个应该就是认知的曲折过程吧
只要掌握了---Lisp中变量和函数是等同的,局部变量(函数)在函数结束后才被清空,全局变量则在关闭图形时清空,
传递变量不影响同名变量 这几个原则,理解起来就轻松一些了。
一时间的乱写,不对之处请指正。
我也会继续做测试。



斑竹加积分:1   by eachy
向版主反映该贴 | IP: 已记录



结构分析、CAD Autolisp技术、软件使用技巧
http://qjchen.yo2.cn

2006年08月28日 14:05
snoopychen 离线引用回复 点这里给 snoopychen 发送一条悄悄话 查找 snoopychen 的更多帖子 编辑/删除
dwg001 [查找更多关于dwg001的帖子]
高级会员


ID: No.252920
发贴数: 214

经验值: 65%
等级: 13 级

现金:396¥
存款:100¥

积分: 0
注册日期: 2005.05.01
日均在线: 0.27 小时
来  自:
2楼楼主说:

关键概念的梳理比一个有用的程式重要百倍,多谢楼主分享。菜鸟期待着您的继续测试的精彩篇章。



向版主反映该贴 | IP: 已记录



我喜欢土地,喜欢脚踏在上面稳稳当当的感觉,看着她上面纵情生长着的鲜亮生命,享受着已经被虚拟化了的热烈情感。作为土生土长的农民,需时刻鞭策自己用泥土的芬芳洗涤城市带来的浮躁...

由 dwg001 于 2006年08月29日 04:38 最后编辑

2006年08月29日 04:33
dwg001 离线引用回复 点这里给 dwg001 发送一条悄悄话 查找 dwg001 的更多帖子 编辑/删除
雨箭风刀 [查找更多关于雨箭风刀的帖子]等级25
青铜长老


ID: No.388422
发贴数: 786

经验值: 27%
等级: 25 级

现金:871¥
存款:

积分: 6
注册日期: 2006.01.28
日均在线: 0.46 小时
来  自:
3楼楼主说:

怎么冒出个传递变量?



向版主反映该贴 | IP: 已记录



我的博客
QQ: 51050632

2006年08月29日 04:51
雨箭风刀 离线引用回复 点这里给 雨箭风刀 发送一条悄悄话 查找 雨箭风刀 的更多帖子 编辑/删除
snoopychen [查找更多关于snoopychen的帖子]积分28
超级会员


ID: No.8476
发贴数: 365

经验值: 82%
等级: 17 级

现金:633¥
存款:

积分: 28
注册日期: 2002.08.04
日均在线: 0.31 小时
来  自:
4楼楼主说:

谢谢刀兄,这个就是我业余的很的地方了,连名称都是这么的业余,脸红。
查了一下fortran中的,defun fun(a b / c d)中的a b 好像是叫做虚参,主要是做数据传递的
不知道Lisp里面怎么称呼,是叫全局变量还是局部变量好呢。还是直接叫它参数好?
谢谢啊谢谢



向版主反映该贴 | IP: 已记录



结构分析、CAD Autolisp技术、软件使用技巧
http://qjchen.yo2.cn

2006年08月29日 07:02
snoopychen 离线引用回复 点这里给 snoopychen 发送一条悄悄话 查找 snoopychen 的更多帖子 编辑/删除
ll_j [查找更多关于ll_j的帖子]等级41积分86捐款会员
白金长老


ID: No.2243
发贴数: 2745

经验值: 65%
等级: 41 级

现金:1441¥
存款:3100¥

积分: 86
注册日期: 2002.01.30
日均在线: 0.35 小时
来  自: 南京
5楼楼主说:

Lisp中就称“参数”,也有称作“变元”的。

看一个例子:
代码:

(setq X '((1 2) (3 5)))          ;设置变量x
(mapcar                           ;遍历,对象为上面设定的X
   '(lambda(x)                    ;以x为参数1
      (mapcar                     ;对参数1x遍历,对象为X的表元素
        '(lambda(x)               ;以x为参数2
           (+ 1 x)                   ;对参数2运算
        )                               ;end lambda
       x                               ;参数1
     )                                  ;end mapcar
    )                                   ;end lambda
  x                                    ;遍历的对象:X
)                                       ;end mapcar

返回:'((2 3) (4 6))
Lisp中大小写是不分的,上面的X只是为了看明白些,以上设置的值、两级使用的参数都是x,运行仍然正常,说明参数x只是一个“临时符号”,使用后会自动立即清除。

最后检查x的值: !x
返回:'((1 2) (3 5))



向版主反映该贴 | IP: 已记录



我的几个主题:
**我的几个关于文字的Lisp程序**
**与Romans.shx协调的字库**
**一个可以输入汉字的“小”字体**
**我收集的一些测绘线形文件和支持形文件**
**我的网络U盘**

由 ll_j 于 2006年08月29日 23:21 最后编辑

2006年08月29日 11:43
ll_j 离线引用回复 点这里给 ll_j 发送一条悄悄话 查找 ll_j 的更多帖子 编辑/删除
jx2008 [查找更多关于jx2008的帖子]
超级会员


ID: No.513694
发贴数: 357

经验值: 63%
等级: 17 级

现金:259¥
存款:

积分: 0
注册日期: 2006.11.10
日均在线: 0.23 小时
来  自:
6楼楼主说:

2楼:
关键概念的梳理比一个有用的程式重要百倍,多谢楼主分享。菜鸟期待着您的继续测试的精彩篇章。

但是光是概念的抽象的理论也不行啊,还得具体的形象地,所以需要一些程序例子才能更加理解透彻。



向版主反映该贴 | IP: 已记录



我的网盘 http://muzicad.ys168.com

2006年11月25日 05:08
jx2008 离线引用回复 点这里给 jx2008 发送一条悄悄话 查找 jx2008 的更多帖子 编辑/删除
north911 [查找更多关于north911的帖子]
中级会员


ID: No.186781
发贴数: 110

经验值: 50%
等级: 9 级

现金:92¥
存款:

积分: 0
注册日期: 2004.10.25
日均在线: 0.11 小时
来  自:
7楼楼主说:

(defun c:test (/ a b)
(setq a 1
b 2
)
(fun 0 1)
(+ a b)
)
(defun fun (x y / a b)
(setq a 3 b 4)
(+ (+ x a) (+ y b))
)
在fun里a b就是3 4 在test里a b就是1 2
意思就是在fun里定义了a b,则a b就用fun里面的值,没定义就是test里的变量
有点意思



向版主反映该贴 | IP: 已记录


2006年11月25日 05:46
north911 离线引用回复 点这里给 north911 发送一条悄悄话 查找 north911 的更多帖子 编辑/删除
cr432202 [查找更多关于cr432202的帖子]
初级会员


ID: No.518969
发贴数: 7

经验值: 60%
等级: 1 级

现金:5¥
存款:

积分: 0
注册日期: 2006.11.22
日均在线: 0.01 小时
来  自:
8楼楼主说:

以前学的LISP语言不用都已经忘记了,现在我也在慢慢回忆中



向版主反映该贴 | IP: 已记录


2006年11月27日 08:42
cr432202 离线引用回复 点这里给 cr432202 发送一条悄悄话 查找 cr432202 的更多帖子 编辑/删除
时区: GMT北京时间. 现在时间: 11:47. 发布新主题    回复主题 
  上一主题   下一主题
快速回复 [字数限制(为0不限制):0]
标题:
选项:
自动分析URL
Email 通知
显示签名

在新主题帖子中上传一个附件上传附件[最大: 1024000 字节:] 附件收爱心币!
有效文件扩展名: gif jpg dwf pdf txt zip jpeg lsp dcl doc c cpp swf rar 7z png
显示可打印版本 | 将本页发送给朋友 | 订阅该主题 | 添加到收藏夹

论坛跳转:
给这个主题评分:

论坛状态:
你不可以发布新主题
你不可以回复主题
你不可以上传附件
你不可以编辑自己的帖子
HTML代码 允许
vB代码 允许
表情符号 禁止
[IMG]代码 允许
 

< 管理员信箱 --辽ICP备05017898号 >
MSN:ad@xdcad.net 点击这里给我发消息 

本论坛属于个人性质的论坛,仅提供会员交流!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律有抵触的言论!否则后果自负