明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 307|回复: 5

[提问] 问个低级的问题

[复制链接]
发表于 2019-10-27 11:10 | 显示全部楼层 |阅读模式
defun c:t1(),这个我知道加载后,命令行t1后就能运行那这个defun c:t2(a) 那这个要怎么输命令行 t2呢?
再就是defun c: t3( b / c) 中b如果是个坐标 怎么输入,
谁来个提示a b c 变量要怎么传进去
谢谢了!

发表于 2019-10-27 11:45 | 显示全部楼层
(defun c:t1(/ x y))这样定义的是一个命令(defun t2(z / x y))这样定义的是一个函数

命令是不能传入参数的,如果需要在命令运行时获取参数有要么把参数写死到程序里,要么在程序运行过程中提醒用户输入\选择数据,要么就写配置文件,有时候我也会留一个变量不设为局部变量,下次直接用,但是可能会有bug.
函数不一样,函数可以在运行前传入参数,但是命令可以在cad中直接输入命令名t1运行,函数不可以,需要以(t2 z)的方式调用,注意括号.

发表于 2019-10-27 11:56 | 显示全部楼层
另外(defun t2(z / x y)),参数列表/后的x y代表的是局部变量,在函数调用的时候并不接收参数,在运行结束后将该变量设为nil.
但是不等同于:
(defun t2(z / )
.......
(setq x nil y nil))
区别在于局部变量会新建两个变量,而不会冲掉外部的变量定义,例如以下两个程序:
(defun c:t1 ( /  )
(setq x 1)
        (defun t2 ( / x )
                (setq x 2)
                (princ x)
        )
        (t2)
        (princ x)
        (princ)
)
(princ)
__________

(defun c:t3 ( /  )
(setq x 1)
        (defun t2 ( /  )
                (setq x 2)
                (princ x)
        )
        (t2)
        (princ x)
        (princ)
)
(princ)
_____
运行t1返回的是22,运行t3返回的是21


 楼主| 发表于 2019-10-27 12:20 | 显示全部楼层
谢谢你,有一丝丝懂了解了
发表于 2019-10-27 12:41 | 显示全部楼层
最后一个问题,lisp跟其他语言不太一样,数据有类型,变量没有类型.
例如vb,定义变量的时候需要定义数据类型(初始化前可以不定义),例如
dim a as int
a="1"
会报错,因为a是int类型,不能赋值为字符串.
而lisp不存在这个现象.
(setq a 1)
(setq a "1")
(princ (type a))
打印出来的是STR.
因此想要传入坐标,就直接传入坐标就好了.
需要注意的是,坐标本身其实是一个表(list).例如
(defun t4(pt / )
        (getpoint p4)
)
可以这样调用(t4 (list 0 0 0))

或者也可以这样(t4 '(0 0 0))
由于lisp的自由性,可以实现很多功能,例如可以传入多种类型的参数,经过判断走不同流程,整合多个程序.例如
(defun a+1(a /)
        (cond
                ((member  (type a) (list 'INT 'REAL))
                        (1+ a))
                (cons (= 'STR  (type a))
                        (1+ (atof a)))
                (t
                        (princ "确认参数a是否错误"))
        )
)
当a为int,real或者str类型的数字时,均能正确执行.


另外,由于lisp不能直接定义可选参数,也可以通过这一特性实现.例如下面这个没有实际用途的示例
(defun max1( a b c)
        (max a b c)
)

lisp限定的max1只能接收3个参数,不能多也不能少,即(max1 1 2)和(max1 1 2 3 4)都是错误的,但是可以稍微改动一下
(defun max2(a)
   (apply 'max a)
)

此时max虽然只能有一个参数,但是可以以这样的方式传入多个参数
(max2 (list 1 2 3 4 5))
发表于 2019-10-27 13:03 | 显示全部楼层
多谢讲解,菜鸟的福音
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-17 12:18 , Processed in 0.200175 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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