明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5560|回复: 8

lisp调用子程序的时候怎么传递参数啊?

[复制链接]
发表于 2009-8-18 15:22:00 | 显示全部楼层 |阅读模式

比如,我想写一个很简单的程序,判断选择的对象是不是直线

(defun c:pd(/ lent)
  (setq lent (car (entsel)))
  (isline lent)
  (cond ((= tt "LINE") (princ "right")))
)
(defun isline(lname)
  (setq llst (entget lname))
  (setq tt (cdr (assoc 0 llst)))
)

但是在加载的时候就提示错误:“输入的列表有缺陷”,该怎么输呢

 楼主| 发表于 2009-8-18 15:30:00 | 显示全部楼层

哈哈,可以了可以了,是我不小心弄错了刚开始。

但是现在还有个问题,子程序的返回值是什么呢?比如上面的tt,好像是全局变量,和其他语言有点不一样

发表于 2009-8-18 15:30:00 | 显示全部楼层

你还没有理解lisp括号的含义啊,每对括号都有返回值。

你的 (isline lent) 似乎没有变量来接收返回值,因此tt就成了全局变量。

(= "LINE" (cdr (assoc 0 (entget (car (entsel))))))

是line的话会返回T,否则返回nil

 楼主| 发表于 2009-8-18 15:34:00 | 显示全部楼层
对,我正是不知道怎么样设置一个变量来专门接收返回值,该怎么写呢?比如上面的子程序isline的返回值又是什么呢?我的本意是想让他传回tt的值
发表于 2009-8-18 15:40:00 | 显示全部楼层
 (setq tt(isline lent)) 这时候tt就是局部变量。
 楼主| 发表于 2009-8-18 15:40:00 | 显示全部楼层
哎,恕我愚钝,现在终于想明白了。。。。
发表于 2009-8-18 16:01:00 | 显示全部楼层
我们都是菜鸟?建议斑竹分一下高手区和菜鸟区,鱼龙混杂有点乱。
发表于 2009-8-18 17:13:00 | 显示全部楼层

子函数的返回值就是该子函数最后一条语句的返回值,并且Lisp会将子函数的返回值放到调用该子函数的地方。所以你的那段程序可以这样写:

(defun c:pd(/ lent)
  (setq lent (car (entsel)))
  (cond
   ((= (isline lent) "LINE")
     (princ "right")
   )
  )
)
(defun isline(lname)
  (cdr (assoc 0 (entget lname)))
)

发表于 2009-8-18 17:21:00 | 显示全部楼层

子程序可以带参数嘛。

也可以用Setq等获取子程序返回的最后一个值。

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

本版积分规则

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

GMT+8, 2024-10-1 12:26 , Processed in 0.161098 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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