Lisp语言:函数的定义,调用以及参数的传递

进一步了解一下Lisp语言中函数的使用,虽然从这篇文章才开始介绍函数,但是我们在之前的Lisp文章中已经多次接触函数了。


函数的定义

在Lisp中函数的定义使用下面的格式:

(defun function1 ()
        (format *query-io* "in function1~%"))

其中defun是函数定义的关键字,function1是函数名,跟着的()是参数定义,在这里不需要参数,所以()中间是空的,然后(format *query-io* "in function1~%")是函数体,就是调用函数时需要执行的代码。

其中的函数体可以是任意多行的语句,如下面这样:

(defun function1 ()

        (format *query-io* "in function1 line 1~%")

        (format *query-io* "in function1 line 2~%")

        (format *query-io* "in function1 line 3~%"))

函数的调用

函数的调用比较简单,使用括号加函数名就可以了,如(function1)。


函数的返回

在没有加入返回语句的情况下,一个函数的最后一个语句的计算结果会被当作函数的返回值返回给调用者,如下面的代码中,main函数调用function1函数,而function1函数的最后一个语句计算结果是“value to return”,所以在main函数中调用function1函数后会将变量result赋值为“value to return”,然后通过format语句将result的结果打印出来:

(defun main ()
        (setq result (function1))
        (format *query-io* "result is: ~a~%" result)
       
)       

(defun function1 ()
        (format *query-io* "in function1~%")
        "value to return")
如果希望提前从一个函数中返回,需要用到return-from函数,如下面的代码中函数function1执行到第二句的时候直接调用return-from返回了“value returned by return-from”作为返回值,后面的语句就不执行了,main函数中result的结果就是“value returned by return-from”

(defun main ()
        (setq result (function1))
        (format *query-io* "result is: ~a~%" result)

)
        

(defun function1 ()
        (format *query-io* "in function1~%")
        (return-from function1 "value returned by return-from")
        (format *query-io* "this line will not be reached")
        "value to return")

需要注意的是return-from函数的第二个参数是函数名,从哪个函数返回就写哪个函数的函数名,如果一个函数的函数名有修改记得修改return-from对应的函数名。

这一点多少有点令人不满,为什么从函数返回还要指定函数的名称,不像Lisp简洁的风格。


参数的定义

上面提到的函数都市没有参数的,现实中定义和使用函数一定会需要参数,Lisp中函数的参数如何定义呢?

Lisp中函数的参数定义在函数名后面的括号中,如下面的代码就定义了a 和b 两个参数。因为Lisp使用的是动态类型,而非静态类型,所以参数是不需要指定类型的,不像c语言那样需要(int a , String b)这样定义参数。

(defun function3 (a b)
        (format *query-io* "parameter a is: ~a  b is: ~a~%" a b ))

对于有参数的函数,调用时需要在函数名后带上相同数量的变量作为实际参数,如function3的调用如下,其中10会被赋予变量a,而20会被赋予变量b。
  (function3 10 20)

如果函数调用是填写的参数数量和函数定义时不同,执行时会报错的。

如(function3 10)会报参数太少,而(function3 10 20 30)会报参数太多。


有关Lisp函数的参数定义还有更复杂的形式,如可选参数,关键字参数等,在以后的文章中我们继续学习。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Visual Lisp是AutoCAD的一种编程语言,可以使用它来编写自动化程序和插件。要实现参数化绘制轴,可以按照以下步骤进行: 1. 定义轴的参数,例如长度、宽度、高度等。 2. 使用Visual Lisp中的绘图函数创建轴的图形。例如,使用“box”函数创建一个长方体,使用“cylinder”函数创建一个圆柱体等等。 3. 在函数中使用参数来确定图形的大小和位置。例如,使用“box”函数时,可以将长度、宽度和高度作为参数传递,并使用这些参数来确定长方体的大小。 4. 将函数保存为Lisp文件,并将其加载到AutoCAD中。 5. 在AutoCAD中运行函数,输入轴的参数,即可绘制出参数化的轴。 以下是一个简单的Visual Lisp函数,用于绘制参数化的长方体轴: ``` (defun c:axis () (setq len (getreal "Enter length: ")) (setq wid (getreal "Enter width: ")) (setq hei (getreal "Enter height: ")) (command "box" (list 0 0 0) (list len wid hei)) ) ``` 在上面的函数中,我们首先使用“getreal”函数获取轴的长度、宽度和高度参数,然后使用“box”函数创建一个长方体,其中参数列表包括轴的起点和终点坐标。最后,我们将函数保存为Lisp文件,并在AutoCAD中运行它,输入轴的参数,即可绘制出参数化的轴。 ### 回答2: Visual LISP是一种用于自动化AutoCAD的编程语言。通过使用Visual LISP,我们可以编写脚本来执行各种任务,其中包括参数化绘制轴。 参数化绘制轴是指通过输入不同的参数值,可以在AutoCAD中绘制不同尺寸的轴。为了实现这个功能,我们可以使用Visual LISP编写一个函数或命令。 首先,我们需要定义绘制轴所需的参数,比如轴的长度、直径和位置等。然后,我们可以使用Visual LISP的绘图函数,例如"line"和"circle"来绘制轴的主体和端部。 在编写Visual LISP脚本时,我们可以使用命令行或对话框来接受用户输入的参数值。比如,我们可以使用(prompt)函数从命令行获取参数值,并使用(getpoint)函数获取用户选择的起点和方向。 一旦我们获取了所有必要的参数值,我们可以使用这些值来计算出绘制轴所需的点和线段的坐标。然后,我们可以使用绘图函数将这些点和线段绘制到AutoCAD的绘图区域中。 最后,我们可以将绘制轴的代码封装在一个函数或命令中,以便在需要的时候进行调用。这样,我们就可以通过传递不同的参数值来绘制不同尺寸的轴,并实现参数化绘制轴的功能。 通过使用Visual LISP编写参数化绘制轴的脚本,我们可以提高绘图的效率和准确性。无论轴的尺寸如何变化,我们都可以重复使用这段代码来绘制轴,并避免手动绘制过程中的错误。 ### 回答3: Visual LISP是一种以AutoLISP为基础的生成与编辑AutoCAD程序的开发环境。在AutoCAD中,通过使用Visual LISP,我们可以编写程序来自动完成特定的绘图任务。 参数化绘制轴是指通过定义一组参数来控制轴的绘制,使得我们可以根据需要随时调整轴的尺寸和位置。在Visual LISP中实现参数化绘制轴有以下步骤: 1. 定义参数:首先,我们需要定义一组参数,包括轴的长度、宽度、位置等。可以使用vl-load-com函数加载命名块,然后使用vla-getattributes方法获取块中定义参数。 2. 创建实体:接下来,我们可以使用vlax-get-acad-object获取AutoCAD应用程序对象,并创建轴的实体对象,比如线段或多段线。以线段为例,可以使用vla-addline方法创建线段对象,并指定起点和终点,同时设置线段的长度和宽度参数。 3. 修改参数:一旦创建了轴的实体对象,我们可以随时修改参数来调整轴的尺寸和位置。可以使用vla-getproperty和vla-putproperty等方法获取和修改对象的属性值。 4. 更新显示:最后,我们需要使用vla-update方法更新对象的显示,使得轴的尺寸和位置变化能够反映在AutoCAD的绘图窗口中。 通过以上步骤,我们可以在Visual LISP中实现参数化绘制轴。这样,我们就可以方便地调整轴的各种参数,以满足不同的绘图要求,提高绘图效率。同时,使用Visual LISP编写的程序可以方便地保存和分享,为轴的绘制提供了更高的灵活性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值